Browse Source

Ensure we have serialised access to ckdb by using a mutex on submit/receives for auths since other responses are mostly ignored

master
Con Kolivas 10 years ago
parent
commit
17c2276e33
  1. 18
      src/stratifier.c

18
src/stratifier.c

@ -77,8 +77,12 @@ typedef struct pool_stats pool_stats_t;
static pool_stats_t stats; static pool_stats_t stats;
/* Protects changes to pool stats */
static pthread_mutex_t stats_lock; static pthread_mutex_t stats_lock;
/* Serialises sends/receives to ckdb if possible */
static pthread_mutex_t ckdb_lock;
static uint64_t enonce1_64; static uint64_t enonce1_64;
struct workbase { struct workbase {
@ -1525,7 +1529,15 @@ static int send_recv_auth(stratum_instance_t *client)
LOGWARNING("Failed to dump json in send_recv_auth"); LOGWARNING("Failed to dump json in send_recv_auth");
return ret; return ret;
} }
buf = ckdb_msg_call(ckp, json_msg);
/* We want responses from ckdb serialised and not interleaved with
* other requests. Wait up to 3 seconds for exclusive access to ckdb
* and if we don't receive it treat it as a delayed auth if possible */
if (likely(!mutex_timedlock(&ckdb_lock, 3))) {
buf = ckdb_msg_call(ckp, json_msg);
mutex_unlock(&ckdb_lock);
}
free(json_msg); free(json_msg);
if (likely(buf)) { if (likely(buf)) {
char *secondaryuserid, *response = alloca(128); char *secondaryuserid, *response = alloca(128);
@ -2525,7 +2537,10 @@ static void ckdbq_process(ckpool_t *ckp, char *msg)
char *buf = NULL; char *buf = NULL;
while (!buf) { while (!buf) {
mutex_lock(&ckdb_lock);
buf = ckdb_msg_call(ckp, msg); buf = ckdb_msg_call(ckp, msg);
mutex_unlock(&ckdb_lock);
if (unlikely(!buf)) { if (unlikely(!buf)) {
if (!failed) { if (!failed) {
failed = true; failed = true;
@ -2965,6 +2980,7 @@ int stratifier(proc_instance_t *pi)
ckp->serverurl = "127.0.0.1"; ckp->serverurl = "127.0.0.1";
cklock_init(&instance_lock); cklock_init(&instance_lock);
mutex_init(&ckdb_lock);
ssends = create_ckmsgq(ckp, "ssender", &ssend_process); ssends = create_ckmsgq(ckp, "ssender", &ssend_process);
srecvs = create_ckmsgq(ckp, "sreceiver", &srecv_process); srecvs = create_ckmsgq(ckp, "sreceiver", &srecv_process);
sshareq = create_ckmsgq(ckp, "sprocessor", &sshare_process); sshareq = create_ckmsgq(ckp, "sprocessor", &sshare_process);

Loading…
Cancel
Save