Provide explicit time checking for age of persistent DCBs.
This commit is contained in:
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user