|
|
@ -1,5 +1,5 @@ |
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* Copyright 1995-2015 Andrew Smith |
|
|
|
* Copyright 1995-2016 Andrew Smith |
|
|
|
* Copyright 2014 Con Kolivas |
|
|
|
* Copyright 2014 Con Kolivas |
|
|
|
* |
|
|
|
* |
|
|
|
* This program is free software; you can redistribute it and/or modify it |
|
|
|
* This program is free software; you can redistribute it and/or modify it |
|
|
@ -51,7 +51,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
#define DB_VLOCK "1" |
|
|
|
#define DB_VLOCK "1" |
|
|
|
#define DB_VERSION "1.0.4" |
|
|
|
#define DB_VERSION "1.0.4" |
|
|
|
#define CKDB_VERSION DB_VERSION"-1.914" |
|
|
|
#define CKDB_VERSION DB_VERSION"-1.920" |
|
|
|
|
|
|
|
|
|
|
|
#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__ |
|
|
@ -377,6 +377,252 @@ extern char *by_default; |
|
|
|
extern char *inet_default; |
|
|
|
extern char *inet_default; |
|
|
|
extern char *id_default; |
|
|
|
extern char *id_default; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Number of seconds per poolinstance message for run
|
|
|
|
|
|
|
|
#define POOLINSTANCE_MSG_EVERY 30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define FAILED_PI "failed.PI" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define POOLINSTANCE_RESET_MSG(_txt) do { \ |
|
|
|
|
|
|
|
int64_t _workinfo, _ageworkinfo, _auth, _addrauth, _poolstats; \
|
|
|
|
|
|
|
|
int64_t _userstats, _workerstats, _workmarkers, _marks; \
|
|
|
|
|
|
|
|
bool msg = false; \
|
|
|
|
|
|
|
|
ck_wlock(&poolinstance_lock); \
|
|
|
|
|
|
|
|
if (mismatch_all_total) { \
|
|
|
|
|
|
|
|
msg = true; \
|
|
|
|
|
|
|
|
last_mismatch_message = time(NULL); \
|
|
|
|
|
|
|
|
_workinfo = mismatch_all_workinfo; \
|
|
|
|
|
|
|
|
_ageworkinfo = mismatch_all_ageworkinfo; \
|
|
|
|
|
|
|
|
_auth = mismatch_all_auth; \
|
|
|
|
|
|
|
|
_addrauth = mismatch_all_addrauth; \
|
|
|
|
|
|
|
|
_poolstats = mismatch_all_poolstats; \
|
|
|
|
|
|
|
|
_userstats = mismatch_all_userstats; \
|
|
|
|
|
|
|
|
_workerstats = mismatch_all_workerstats; \
|
|
|
|
|
|
|
|
_workmarkers = mismatch_all_workmarkers; \
|
|
|
|
|
|
|
|
_marks = mismatch_all_marks; \
|
|
|
|
|
|
|
|
mismatch_workinfo = mismatch_ageworkinfo = \
|
|
|
|
|
|
|
|
mismatch_auth = mismatch_addrauth = \
|
|
|
|
|
|
|
|
mismatch_poolstats = mismatch_userstats = \
|
|
|
|
|
|
|
|
mismatch_workerstats = mismatch_workmarkers = \
|
|
|
|
|
|
|
|
mismatch_marks = mismatch_total = 0; \
|
|
|
|
|
|
|
|
mismatch_all_workinfo = mismatch_all_ageworkinfo = \
|
|
|
|
|
|
|
|
mismatch_all_auth = mismatch_all_addrauth = \
|
|
|
|
|
|
|
|
mismatch_all_poolstats = mismatch_all_userstats = \
|
|
|
|
|
|
|
|
mismatch_all_workerstats = mismatch_all_workmarkers = \
|
|
|
|
|
|
|
|
mismatch_all_marks = mismatch_all_total = 0; \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
ck_wunlock(&poolinstance_lock); \
|
|
|
|
|
|
|
|
if (msg) { \
|
|
|
|
|
|
|
|
char reply[1024], *buf; \
|
|
|
|
|
|
|
|
size_t len, off; \
|
|
|
|
|
|
|
|
APPEND_REALLOC_INIT(buf, off, len); \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), "%s() %s PI total:", \
|
|
|
|
|
|
|
|
__func__, _txt); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
if (_workinfo) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " wi=%"PRId64, _workinfo); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_ageworkinfo) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " age=%"PRId64, _ageworkinfo); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_auth) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " auth=%"PRId64, _auth); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_addrauth) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " addr=%"PRId64, _addrauth); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_poolstats) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " ps=%"PRId64, _poolstats); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_userstats) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " us=%"PRId64, _userstats); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_workerstats) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " ws=%"PRId64, _workerstats); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_workmarkers) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " wm=%"PRId64, _workmarkers); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_marks) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " mark=%"PRId64, _marks); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
LOGWARNING("WARN: %s", buf); \
|
|
|
|
|
|
|
|
FREENULL(buf); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Checks mismatch_total outside lock since it's not critical
|
|
|
|
|
|
|
|
#define POOLINSTANCE_DATA_MSG() do { \ |
|
|
|
|
|
|
|
int64_t _workinfo, _ageworkinfo, _auth, _addrauth, _poolstats; \
|
|
|
|
|
|
|
|
int64_t _userstats, _workerstats, _workmarkers, _marks; \
|
|
|
|
|
|
|
|
bool warn = false; \
|
|
|
|
|
|
|
|
time_t now; \
|
|
|
|
|
|
|
|
if (mismatch_total) { \
|
|
|
|
|
|
|
|
ck_wlock(&poolinstance_lock); \
|
|
|
|
|
|
|
|
if (mismatch_total) { \
|
|
|
|
|
|
|
|
now = time(NULL); \
|
|
|
|
|
|
|
|
if ((now - last_mismatch_message) >= POOLINSTANCE_MSG_EVERY) { \
|
|
|
|
|
|
|
|
warn = true; \
|
|
|
|
|
|
|
|
last_mismatch_message = now; \
|
|
|
|
|
|
|
|
_workinfo = mismatch_workinfo; \
|
|
|
|
|
|
|
|
_ageworkinfo = mismatch_ageworkinfo; \
|
|
|
|
|
|
|
|
_auth = mismatch_auth; \
|
|
|
|
|
|
|
|
_addrauth = mismatch_addrauth; \
|
|
|
|
|
|
|
|
_poolstats = mismatch_poolstats; \
|
|
|
|
|
|
|
|
_userstats = mismatch_userstats; \
|
|
|
|
|
|
|
|
_workerstats = mismatch_workerstats; \
|
|
|
|
|
|
|
|
_workmarkers = mismatch_workmarkers; \
|
|
|
|
|
|
|
|
_marks = mismatch_marks; \
|
|
|
|
|
|
|
|
mismatch_workinfo = mismatch_ageworkinfo = \
|
|
|
|
|
|
|
|
mismatch_auth = mismatch_addrauth = \
|
|
|
|
|
|
|
|
mismatch_poolstats = mismatch_userstats = \
|
|
|
|
|
|
|
|
mismatch_workerstats = mismatch_workmarkers = \
|
|
|
|
|
|
|
|
mismatch_marks = mismatch_total = 0; \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
ck_wunlock(&poolinstance_lock); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (warn) { \
|
|
|
|
|
|
|
|
char reply[1024], *buf; \
|
|
|
|
|
|
|
|
size_t len, off; \
|
|
|
|
|
|
|
|
APPEND_REALLOC_INIT(buf, off, len); \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), "%s() PI:", __func__); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
if (_workinfo) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " wi=%"PRId64, _workinfo); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_ageworkinfo) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " age=%"PRId64, _ageworkinfo); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_auth) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " auth=%"PRId64, _auth); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_addrauth) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " addr=%"PRId64, _addrauth); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_poolstats) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " ps=%"PRId64, _poolstats); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_userstats) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " us=%"PRId64, _userstats); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_workerstats) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " ws=%"PRId64, _workerstats); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_workmarkers) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " wm=%"PRId64, _workmarkers); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
if (_marks) { \
|
|
|
|
|
|
|
|
snprintf(reply, sizeof(reply), " mark=%"PRId64, _marks); \
|
|
|
|
|
|
|
|
APPEND_REALLOC(buf, off, len, reply); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
LOGWARNING("WARN: %s", buf); \
|
|
|
|
|
|
|
|
FREENULL(buf); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define POOLINSTANCE_DATA_SET(_obj, _pi) do { \ |
|
|
|
|
|
|
|
bool warn = false; \
|
|
|
|
|
|
|
|
ck_wlock(&poolinstance_lock); \
|
|
|
|
|
|
|
|
if (mismatch_all_ ## _obj++ == 0) { \
|
|
|
|
|
|
|
|
warn = true; \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
mismatch_ ## _obj++; \
|
|
|
|
|
|
|
|
mismatch_all_total++; \
|
|
|
|
|
|
|
|
mismatch_total++; \
|
|
|
|
|
|
|
|
ck_wunlock(&poolinstance_lock); \
|
|
|
|
|
|
|
|
if (warn) { \
|
|
|
|
|
|
|
|
char *pist = NULL; \
|
|
|
|
|
|
|
|
LOGWARNING("WARN: %s() " #_obj " first invalid " \
|
|
|
|
|
|
|
|
"poolinstance '%s'", __func__, \
|
|
|
|
|
|
|
|
pist = safe_text_nonull(_pi)); \
|
|
|
|
|
|
|
|
FREENULL(pist); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
POOLINSTANCE_DATA_MSG(); \
|
|
|
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define POOLINSTANCE_DBLOAD_SET(_obj, _pi) do { \ |
|
|
|
|
|
|
|
bool warn = false; \
|
|
|
|
|
|
|
|
ck_wlock(&poolinstance_lock); \
|
|
|
|
|
|
|
|
if (mismatch_all_ ## _obj++ == 0) \
|
|
|
|
|
|
|
|
warn = true; \
|
|
|
|
|
|
|
|
mismatch_ ## _obj++; \
|
|
|
|
|
|
|
|
mismatch_all_total++; \
|
|
|
|
|
|
|
|
mismatch_total++; \
|
|
|
|
|
|
|
|
ck_wunlock(&poolinstance_lock); \
|
|
|
|
|
|
|
|
if (warn) { \
|
|
|
|
|
|
|
|
char *pist = NULL; \
|
|
|
|
|
|
|
|
LOGWARNING("WARN: %s() dbload " #_obj " first " \
|
|
|
|
|
|
|
|
"invalid poolinstance '%s'", __func__, \
|
|
|
|
|
|
|
|
pist = safe_text_nonull(_pi)); \
|
|
|
|
|
|
|
|
FREENULL(pist); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* DBLoad message resets _obj and _all_obj back to zero
|
|
|
|
|
|
|
|
* since it's counting a single table_fill() */ |
|
|
|
|
|
|
|
#define POOLINSTANCE_DBLOAD_MSG(_obj) do { \ |
|
|
|
|
|
|
|
int64_t tot = 0; \
|
|
|
|
|
|
|
|
ck_wlock(&poolinstance_lock); \
|
|
|
|
|
|
|
|
if (mismatch_all_ ## _obj) { \
|
|
|
|
|
|
|
|
tot = mismatch_all_ ## _obj; \
|
|
|
|
|
|
|
|
mismatch_all_total -= mismatch_all_ ## _obj; \
|
|
|
|
|
|
|
|
mismatch_all_ ## _obj = 0; \
|
|
|
|
|
|
|
|
mismatch_total -= mismatch_ ## _obj; \
|
|
|
|
|
|
|
|
mismatch_ ## _obj = 0; \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
ck_wunlock(&poolinstance_lock); \
|
|
|
|
|
|
|
|
if (tot) { \
|
|
|
|
|
|
|
|
LOGWARNING("WARN: %s() dbload " #_obj " total " \
|
|
|
|
|
|
|
|
"invalid poolinstance %"PRId64, \
|
|
|
|
|
|
|
|
__func__, tot); \
|
|
|
|
|
|
|
|
} \
|
|
|
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// NULL or poolinstance must match
|
|
|
|
|
|
|
|
extern const char *poolinstance; |
|
|
|
|
|
|
|
// lock for accessing all mismatch variables
|
|
|
|
|
|
|
|
extern cklock_t poolinstance_lock; |
|
|
|
|
|
|
|
extern time_t last_mismatch_message; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern int64_t mismatch_workinfo; |
|
|
|
|
|
|
|
extern int64_t mismatch_ageworkinfo; |
|
|
|
|
|
|
|
extern int64_t mismatch_auth; |
|
|
|
|
|
|
|
extern int64_t mismatch_addrauth; |
|
|
|
|
|
|
|
extern int64_t mismatch_poolstats; |
|
|
|
|
|
|
|
extern int64_t mismatch_userstats; |
|
|
|
|
|
|
|
extern int64_t mismatch_workerstats; |
|
|
|
|
|
|
|
extern int64_t mismatch_workmarkers; |
|
|
|
|
|
|
|
extern int64_t mismatch_marks; |
|
|
|
|
|
|
|
extern int64_t mismatch_total; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern int64_t mismatch_all_workinfo; |
|
|
|
|
|
|
|
extern int64_t mismatch_all_ageworkinfo; |
|
|
|
|
|
|
|
extern int64_t mismatch_all_auth; |
|
|
|
|
|
|
|
extern int64_t mismatch_all_addrauth; |
|
|
|
|
|
|
|
extern int64_t mismatch_all_poolstats; |
|
|
|
|
|
|
|
extern int64_t mismatch_all_userstats; |
|
|
|
|
|
|
|
extern int64_t mismatch_all_workerstats; |
|
|
|
|
|
|
|
extern int64_t mismatch_all_workmarkers; |
|
|
|
|
|
|
|
extern int64_t mismatch_all_marks; |
|
|
|
|
|
|
|
extern int64_t mismatch_all_total; |
|
|
|
|
|
|
|
|
|
|
|
enum cmd_values { |
|
|
|
enum cmd_values { |
|
|
|
CMD_UNSET, |
|
|
|
CMD_UNSET, |
|
|
|
CMD_DUPSEQ, // Ignore, we've already got it
|
|
|
|
CMD_DUPSEQ, // Ignore, we've already got it
|
|
|
@ -2012,8 +2258,8 @@ typedef struct marks { |
|
|
|
* marktype is one of: |
|
|
|
* marktype is one of: |
|
|
|
* b - block end |
|
|
|
* b - block end |
|
|
|
* p - pplns begin |
|
|
|
* p - pplns begin |
|
|
|
* s - shift begin (not yet used) |
|
|
|
* s - shift begin (not used) |
|
|
|
* e - shift end (not yet used) |
|
|
|
* e - shift end |
|
|
|
* o - other begin |
|
|
|
* o - other begin |
|
|
|
* f - other finish/end |
|
|
|
* f - other finish/end |
|
|
|
* description generated will be: |
|
|
|
* description generated will be: |
|
|
@ -2030,7 +2276,7 @@ typedef struct marks { |
|
|
|
* next/prev valid workinfoid, not simply +1 or -1 |
|
|
|
* next/prev valid workinfoid, not simply +1 or -1 |
|
|
|
* i.e. all workinfoid in marks and workmarkers must exist in workinfo |
|
|
|
* i.e. all workinfoid in marks and workmarkers must exist in workinfo |
|
|
|
* |
|
|
|
* |
|
|
|
* Until we start using shifts: |
|
|
|
* Until we started using shifts: |
|
|
|
* workmarkers can be created up to ending in the largest 'p' "-1" |
|
|
|
* workmarkers can be created up to ending in the largest 'p' "-1" |
|
|
|
* workmarkers will always be the smallest of: |
|
|
|
* workmarkers will always be the smallest of: |
|
|
|
* Block NNN-1 "+1" to Block NNN |
|
|
|
* Block NNN-1 "+1" to Block NNN |
|
|
|