Initial changes for persistent connections - add some basic functionality.
This commit is contained in:
@ -632,7 +632,18 @@ DCB *dcb;
|
|||||||
GWPROTOCOL *funcs;
|
GWPROTOCOL *funcs;
|
||||||
int fd;
|
int fd;
|
||||||
int rc;
|
int rc;
|
||||||
|
char *user;
|
||||||
|
|
||||||
|
user = session_getUser(session);
|
||||||
|
if (NULL != user && strlen(user))
|
||||||
|
{
|
||||||
|
dcb = server_get_persistent(server, user);
|
||||||
|
if (NULL != dcb)
|
||||||
|
{
|
||||||
|
return dcb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((dcb = dcb_alloc(DCB_ROLE_REQUEST_HANDLER)) == NULL)
|
if ((dcb = dcb_alloc(DCB_ROLE_REQUEST_HANDLER)) == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1271,6 +1282,13 @@ dcb_close(DCB *dcb)
|
|||||||
|
|
||||||
if (rc == 0)
|
if (rc == 0)
|
||||||
{
|
{
|
||||||
|
spinlock_acquire(&dcb->server->persistlock);
|
||||||
|
dcb->nextpersistent = dcb->server->persistent;
|
||||||
|
dcb->server->persistent = dcb;
|
||||||
|
spinlock_release(&dcb->server->persistlock);
|
||||||
|
atomic_add(&dcb->server->stats.n_persistent, 1);
|
||||||
|
return;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* close protocol and router session
|
* close protocol and router session
|
||||||
*/
|
*/
|
||||||
|
@ -78,6 +78,8 @@ SERVER *server;
|
|||||||
server->rlag = -2;
|
server->rlag = -2;
|
||||||
server->master_id = -1;
|
server->master_id = -1;
|
||||||
server->depth = -1;
|
server->depth = -1;
|
||||||
|
server->persistent = NULL;
|
||||||
|
spinlock_init(server->persistlock);
|
||||||
|
|
||||||
spinlock_acquire(&server_spin);
|
spinlock_acquire(&server_spin);
|
||||||
server->next = allServers;
|
server->next = allServers;
|
||||||
@ -128,6 +130,56 @@ SERVER *ptr;
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a DCB from the persistent connection pool, if possible
|
||||||
|
*
|
||||||
|
* @param server The server to set the name on
|
||||||
|
* @param user The name of the user needing the connection
|
||||||
|
*/
|
||||||
|
DCB *
|
||||||
|
server_get_persistent(SERVER *server, char *user)
|
||||||
|
{
|
||||||
|
DCB *dcb, *previous;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
spinlock_acquire(server->persistlock);
|
||||||
|
dcb = server->persistent;
|
||||||
|
previous = NULL;
|
||||||
|
while (dcb) {
|
||||||
|
/* Test for expired, free and remove from list if it is */
|
||||||
|
if (0 == strcmp(dcb->user, user))
|
||||||
|
{
|
||||||
|
if (NULL == previous)
|
||||||
|
{
|
||||||
|
server->persistent = dcb->nextpersistent;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
previous->nextpersistent = dcb->nextpersistent;
|
||||||
|
}
|
||||||
|
rc = poll_add_dcb(dcb);
|
||||||
|
if (rc == DCBFD_CLOSED) {
|
||||||
|
dcb_set_state(dcb, DCB_STATE_DISCONNECTED, NULL);
|
||||||
|
dcb_free(dcb);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spinlock_release(server->persistlock);
|
||||||
|
atomic_add(&server->stats.n_persistent, -1);
|
||||||
|
return dcb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
previous = dcb;
|
||||||
|
dcb = dcb->nextpersistent;
|
||||||
|
}
|
||||||
|
if (NULL != server->persistent)
|
||||||
|
{
|
||||||
|
/* Change user, remove DCB from list, release spinlock, return dcb */
|
||||||
|
}
|
||||||
|
spinlock_release(server->persistlock);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a unique name for the server
|
* Set a unique name for the server
|
||||||
*
|
*
|
||||||
|
@ -249,6 +249,7 @@ typedef struct dcb {
|
|||||||
DCBSTATS stats; /**< DCB related statistics */
|
DCBSTATS stats; /**< DCB related statistics */
|
||||||
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 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 */
|
||||||
@ -261,7 +262,7 @@ typedef struct dcb {
|
|||||||
SPINLOCK polloutlock;
|
SPINLOCK polloutlock;
|
||||||
int polloutbusy;
|
int polloutbusy;
|
||||||
int writecheck;
|
int writecheck;
|
||||||
unsigned long last_read; /*< Last time the DCB received data */
|
unsigned long last_read; /*< Last time the DCB received data */
|
||||||
unsigned int high_water; /**< High water mark */
|
unsigned int high_water; /**< High water mark */
|
||||||
unsigned int low_water; /**< Low water mark */
|
unsigned int low_water; /**< Low water mark */
|
||||||
struct server *server; /**< The associated backend server */
|
struct server *server; /**< The associated backend server */
|
||||||
|
@ -66,6 +66,7 @@ typedef struct {
|
|||||||
int n_connections; /**< Number of connections */
|
int n_connections; /**< Number of connections */
|
||||||
int n_current; /**< Current connections */
|
int n_current; /**< Current connections */
|
||||||
int n_current_ops; /**< Current active operations */
|
int n_current_ops; /**< Current active operations */
|
||||||
|
int n_persistent; /**< Current persistent pool */
|
||||||
} SERVER_STATS;
|
} SERVER_STATS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -94,6 +95,8 @@ typedef struct server {
|
|||||||
int depth; /**< Replication level in the tree */
|
int depth; /**< Replication level in the tree */
|
||||||
long *slaves; /**< Slaves of this node */
|
long *slaves; /**< Slaves of this node */
|
||||||
bool master_err_is_logged; /*< If node failed, this indicates whether it is logged */
|
bool master_err_is_logged; /*< If node failed, this indicates whether it is logged */
|
||||||
|
DCB *persistent; /**< List of unused persistent connections to the server */
|
||||||
|
SPINLOCK *persistlock; /**< Lock for adjusting the persistent connections list */
|
||||||
} SERVER;
|
} SERVER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -189,5 +192,6 @@ extern void serverAddParameter(SERVER *, char *, char *);
|
|||||||
extern char *serverGetParameter(SERVER *, char *);
|
extern char *serverGetParameter(SERVER *, char *);
|
||||||
extern void server_update(SERVER *, char *, char *, char *);
|
extern void server_update(SERVER *, char *, char *, char *);
|
||||||
extern void server_set_unique_name(SERVER *, char *);
|
extern void server_set_unique_name(SERVER *, char *);
|
||||||
|
extern DCB *server_get_persistent(SERVER *, char *);
|
||||||
extern RESULTSET *serverGetList();
|
extern RESULTSET *serverGetList();
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user