Clear persistent pool DCBs when server freed.
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user