Browse Source

ckdb - add missing UNLOCK in cmd_percent and shorten the lock for paymentaddresses_set

master
kanoi 10 years ago
parent
commit
ddcbd3e6a0
  1. 2
      src/ckdb.h
  2. 1
      src/ckdb_cmd.c
  3. 18
      src/ckdb_dbio.c

2
src/ckdb.h

@ -52,7 +52,7 @@
#define DB_VLOCK "1" #define DB_VLOCK "1"
#define DB_VERSION "0.9.6" #define DB_VERSION "0.9.6"
#define CKDB_VERSION DB_VERSION"-0.771" #define CKDB_VERSION DB_VERSION"-0.780"
#define WHERE_FFL " - from %s %s() line %d" #define WHERE_FFL " - from %s %s() line %d"
#define WHERE_FFL_HERE __FILE__, __func__, __LINE__ #define WHERE_FFL_HERE __FILE__, __func__, __LINE__

1
src/ckdb_cmd.c

@ -1364,6 +1364,7 @@ static char *cmd_percent(char *cmd, char *id, tv_t *now, USERS *users)
pa_item = prev_in_ktree(pay_ctx); pa_item = prev_in_ktree(pay_ctx);
DATA_PAYMENTADDRESSES_NULL(pa, pa_item); DATA_PAYMENTADDRESSES_NULL(pa, pa_item);
} }
K_RUNLOCK(paymentaddresses_free);
snprintf(tmp, sizeof(tmp), snprintf(tmp, sizeof(tmp),
"rows=%d%cflds=%s%c", "rows=%d%cflds=%s%c",

18
src/ckdb_dbio.c

@ -1448,7 +1448,7 @@ bool paymentaddresses_set(PGconn *conn, int64_t userid, K_STORE *pa_store,
PAYMENTADDRESSES *row, *pa; PAYMENTADDRESSES *row, *pa;
char *upd = NULL, *ins; char *upd = NULL, *ins;
size_t len, off; size_t len, off;
bool ok = false, first; bool ok = false, first, locked = false;
char *params[1002]; // Limit of 999 addresses per user char *params[1002]; // Limit of 999 addresses per user
char tmp[1024]; char tmp[1024];
int n, par = 0, count, matches; int n, par = 0, count, matches;
@ -1459,11 +1459,6 @@ bool paymentaddresses_set(PGconn *conn, int64_t userid, K_STORE *pa_store,
if (pa_store->count > 999) if (pa_store->count > 999)
return false; return false;
/* Since we are merging the changes in rather than just
* replacing the db contents, lock the data for the duration
* of the update to ensure nothing else changes it */
K_WLOCK(paymentaddresses_free);
if (conn == NULL) { if (conn == NULL) {
conn = dbconnect(); conn = dbconnect();
conned = true; conned = true;
@ -1491,6 +1486,12 @@ bool paymentaddresses_set(PGconn *conn, int64_t userid, K_STORE *pa_store,
params[par++] = bigint_to_buf(userid, NULL, 0); params[par++] = bigint_to_buf(userid, NULL, 0);
params[par++] = tv_to_buf((tv_t *)&default_expiry, NULL, 0); params[par++] = tv_to_buf((tv_t *)&default_expiry, NULL, 0);
/* Since we are merging the changes in rather than just
* replacing the db contents, lock the data for the duration
* of the update to ensure nothing else changes it */
K_WLOCK(paymentaddresses_free);
locked = true;
first = true; first = true;
item = find_paymentaddresses(userid, ctx); item = find_paymentaddresses(userid, ctx);
DATA_PAYMENTADDRESSES_NULL(row, item); DATA_PAYMENTADDRESSES_NULL(row, item);
@ -1663,9 +1664,10 @@ unparam:
match = next; match = next;
} }
} }
LOGDEBUG("%s(): Step 3, untouched %d expired %d added %d", __func__, matches, n, count); if (locked)
K_WUNLOCK(paymentaddresses_free);
K_WUNLOCK(paymentaddresses_free); LOGDEBUG("%s(): Step 3, untouched %d expired %d added %d", __func__, matches, n, count);
// Calling function must clean up anything left in pa_store // Calling function must clean up anything left in pa_store
return ok; return ok;

Loading…
Cancel
Save