Clear persistent pool DCBs when server freed.

This commit is contained in:
counterpoint
2015-06-09 08:26:14 +01:00
parent e395ab1442
commit 99e9987f9b
3 changed files with 8 additions and 6 deletions

View File

@ -1324,7 +1324,7 @@ dcb_close(DCB *dcb)
&& strlen(user)
&& dcb->server
&& dcb->server->persistpoolmax
&& dcb_persistent_clean_count(dcb) < dcb->server->persistpoolmax)
&& dcb_persistent_clean_count(dcb, false) < dcb->server->persistpoolmax)
{
dcb->user = strdup(user);
dcb->persistentstart = time(NULL);
@ -2308,7 +2308,7 @@ dcb_null_auth(DCB *dcb, SERVER *server, SESSION *session, GWBUF *buf)
* @param dcb The DCB being closed.
*/
int
dcb_persistent_clean_count(DCB *dcb)
dcb_persistent_clean_count(DCB *dcb, bool cleanall)
{
int count = 0;
if (dcb && dcb->server)
@ -2320,7 +2320,7 @@ dcb_persistent_clean_count(DCB *dcb)
CHK_SERVER(server);
while (persistentdcb) {
CHK_DCB(persistentdcb);
if (count >= server->persistpoolmax || difftime(time(NULL), persistentdcb->persistentstart) > server->persistmaxtime)
if (cleanall || count >= server->persistpoolmax || difftime(time(NULL), persistentdcb->persistentstart) > server->persistmaxtime)
{
if (previousdcb) {
previousdcb->nextpersistent = persistentdcb->nextpersistent;
@ -2333,12 +2333,12 @@ dcb_persistent_clean_count(DCB *dcb)
dcb_call_callback(persistentdcb, DCB_REASON_CLOSE);
dcb_add_to_zombieslist(persistentdcb);
atomic_add(&server->stats.n_persistent, -1);
atomic_add(&server->stats.n_connections, -1);
}
else
{
count++;
}
previousdcb = persistentdcb;
persistentdcb = persistentdcb->nextpersistent;
}
}

View File

@ -131,6 +131,8 @@ SERVER *ptr;
free(server->unique_name);
if (server->server_string)
free(server->server_string);
if (server->persistent)
dcb_persistent_clean_count(server->persistent, true);
free(server);
return 1;
}
@ -146,7 +148,7 @@ server_get_persistent(SERVER *server, char *user, const char *protocol)
{
DCB *dcb, *previous = NULL;
if (server->persistent && dcb_persistent_clean_count(server->persistent) && server->persistent)
if (server->persistent && dcb_persistent_clean_count(server->persistent, false) && server->persistent)
{
spinlock_acquire(&server->persistlock);
dcb = server->persistent;

View File

@ -336,7 +336,7 @@ int dcb_remove_callback(DCB *, DCB_REASON, int (*)(struct dcb *, DCB_REASON, vo
void *);
int dcb_isvalid(DCB *); /* Check the DCB is in the linked list */
int dcb_count_by_usage(DCB_USAGE); /* Return counts of DCBs */
int dcb_persistent_clean_count(DCB *); /* Clean persistent and return count */
int dcb_persistent_clean_count(DCB *, bool); /* Clean persistent and return count */
bool dcb_set_state(DCB* dcb, dcb_state_t new_state, dcb_state_t* old_state);
void dcb_call_foreach (struct server* server, DCB_REASON reason);