Provide explicit time checking for age of persistent DCBs.

This commit is contained in:
counterpoint
2015-06-03 16:47:02 +01:00
parent fe2f8e70d1
commit e395ab1442
3 changed files with 8 additions and 2 deletions

View File

@ -1327,6 +1327,7 @@ dcb_close(DCB *dcb)
&& dcb_persistent_clean_count(dcb) < dcb->server->persistpoolmax) && dcb_persistent_clean_count(dcb) < dcb->server->persistpoolmax)
{ {
dcb->user = strdup(user); dcb->user = strdup(user);
dcb->persistentstart = time(NULL);
spinlock_acquire(&dcb->server->persistlock); spinlock_acquire(&dcb->server->persistlock);
dcb->nextpersistent = dcb->server->persistent; dcb->nextpersistent = dcb->server->persistent;
dcb->server->persistent = dcb; dcb->server->persistent = dcb;
@ -2319,14 +2320,14 @@ 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 || (persistentdcb->last_read + server->persistmaxtime) < time(NULL)) if (count >= server->persistpoolmax || difftime(time(NULL), persistentdcb->persistentstart) > server->persistmaxtime)
{ {
if (previousdcb) { if (previousdcb) {
previousdcb->nextpersistent = persistentdcb->nextpersistent; previousdcb->nextpersistent = persistentdcb->nextpersistent;
} }
else else
{ {
dcb->nextpersistent = persistentdcb->nextpersistent; server->persistent = persistentdcb->nextpersistent;
} }
/** Call possible callback for this DCB in case of close */ /** Call possible callback for this DCB in case of close */
dcb_call_callback(persistentdcb, DCB_REASON_CLOSE); dcb_call_callback(persistentdcb, DCB_REASON_CLOSE);

View File

@ -71,6 +71,10 @@ SERVER *server;
if ((server = (SERVER *)calloc(1, sizeof(SERVER))) == NULL) if ((server = (SERVER *)calloc(1, sizeof(SERVER))) == NULL)
return NULL; return NULL;
#if defined(SS_DEBUG)
server->server_chk_top = CHK_NUM_SERVER;
server->server_chk_tail = CHK_NUM_SERVER;
#endif
server->name = strdup(servname); server->name = strdup(servname);
server->protocol = strdup(protocol); server->protocol = strdup(protocol);
server->port = port; server->port = port;

View File

@ -251,6 +251,7 @@ typedef struct dcb {
unsigned int dcb_server_status; /*< the server role indicator from SERVER */ unsigned int dcb_server_status; /*< the server role indicator from SERVER */
struct dcb *next; /**< Next DCB in the chain of allocated DCB's */ struct dcb *next; /**< Next DCB in the chain of allocated DCB's */
struct dcb *nextpersistent; /**< Next DCB in the persistent pool for SERVER */ struct dcb *nextpersistent; /**< Next DCB in the persistent pool for SERVER */
time_t persistentstart; /**< Time when DCB placed in persistent pool */
struct service *service; /**< The related service */ struct service *service; /**< The related service */
void *data; /**< Specific client data */ void *data; /**< Specific client data */
DCBMM memdata; /**< The data related to DCB memory management */ DCBMM memdata; /**< The data related to DCB memory management */