Clear persistent pool DCBs when server freed.
This commit is contained in:
@ -1324,7 +1324,7 @@ dcb_close(DCB *dcb)
|
|||||||
&& strlen(user)
|
&& strlen(user)
|
||||||
&& dcb->server
|
&& dcb->server
|
||||||
&& dcb->server->persistpoolmax
|
&& 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->user = strdup(user);
|
||||||
dcb->persistentstart = time(NULL);
|
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.
|
* @param dcb The DCB being closed.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
dcb_persistent_clean_count(DCB *dcb)
|
dcb_persistent_clean_count(DCB *dcb, bool cleanall)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
if (dcb && dcb->server)
|
if (dcb && dcb->server)
|
||||||
@ -2320,7 +2320,7 @@ dcb_persistent_clean_count(DCB *dcb)
|
|||||||
CHK_SERVER(server);
|
CHK_SERVER(server);
|
||||||
while (persistentdcb) {
|
while (persistentdcb) {
|
||||||
CHK_DCB(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) {
|
if (previousdcb) {
|
||||||
previousdcb->nextpersistent = persistentdcb->nextpersistent;
|
previousdcb->nextpersistent = persistentdcb->nextpersistent;
|
||||||
@ -2333,12 +2333,12 @@ dcb_persistent_clean_count(DCB *dcb)
|
|||||||
dcb_call_callback(persistentdcb, DCB_REASON_CLOSE);
|
dcb_call_callback(persistentdcb, DCB_REASON_CLOSE);
|
||||||
dcb_add_to_zombieslist(persistentdcb);
|
dcb_add_to_zombieslist(persistentdcb);
|
||||||
atomic_add(&server->stats.n_persistent, -1);
|
atomic_add(&server->stats.n_persistent, -1);
|
||||||
atomic_add(&server->stats.n_connections, -1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
previousdcb = persistentdcb;
|
||||||
persistentdcb = persistentdcb->nextpersistent;
|
persistentdcb = persistentdcb->nextpersistent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,6 +131,8 @@ SERVER *ptr;
|
|||||||
free(server->unique_name);
|
free(server->unique_name);
|
||||||
if (server->server_string)
|
if (server->server_string)
|
||||||
free(server->server_string);
|
free(server->server_string);
|
||||||
|
if (server->persistent)
|
||||||
|
dcb_persistent_clean_count(server->persistent, true);
|
||||||
free(server);
|
free(server);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -146,7 +148,7 @@ server_get_persistent(SERVER *server, char *user, const char *protocol)
|
|||||||
{
|
{
|
||||||
DCB *dcb, *previous = NULL;
|
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);
|
spinlock_acquire(&server->persistlock);
|
||||||
dcb = server->persistent;
|
dcb = server->persistent;
|
||||||
|
@ -336,7 +336,7 @@ int dcb_remove_callback(DCB *, DCB_REASON, int (*)(struct dcb *, DCB_REASON, vo
|
|||||||
void *);
|
void *);
|
||||||
int dcb_isvalid(DCB *); /* Check the DCB is in the linked list */
|
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_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);
|
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);
|
void dcb_call_foreach (struct server* server, DCB_REASON reason);
|
||||||
|
Reference in New Issue
Block a user