|
|
|
|
@ -915,6 +915,8 @@ int topo_node_sqlite_nodeinfo_updated(sqlite3* db, uint64_t node_id) {
|
|
|
|
|
|
|
|
|
|
void topo_node_sqlite_update_rtt(sqlite3* db, uint64_t node_id, uint16_t rtt) { |
|
|
|
|
if (!db) return; |
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_BGP, "RTT sample: node=%016llx rtt_ms=%.1f; updating address and membership tables", |
|
|
|
|
(unsigned long long)node_id, rtt / 10.0); |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
sqlite3_stmt* s = NULL; |
|
|
|
|
@ -923,19 +925,26 @@ void topo_node_sqlite_update_rtt(sqlite3* db, uint64_t node_id, uint16_t rtt) {
|
|
|
|
|
-1, &s, NULL) == SQLITE_OK) { |
|
|
|
|
sqlite3_bind_int(s, 1, (int)rtt); |
|
|
|
|
sqlite3_bind_int64(s, 2, (sqlite3_int64)node_id); |
|
|
|
|
sqlite3_step(s); |
|
|
|
|
if (sqlite3_step(s) != SQLITE_DONE) DEBUG_ERROR(DEBUG_CATEGORY_BGP, |
|
|
|
|
"RTT persistence failed: table=node_addresses node=%016llx: %s", |
|
|
|
|
(unsigned long long)node_id, sqlite3_errmsg(db)); |
|
|
|
|
sqlite3_finalize(s); |
|
|
|
|
} |
|
|
|
|
} else DEBUG_ERROR(DEBUG_CATEGORY_BGP, "RTT query preparation failed: table=node_addresses node=%016llx: %s", |
|
|
|
|
(unsigned long long)node_id, sqlite3_errmsg(db)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
sqlite3_stmt* s = NULL; |
|
|
|
|
if (sqlite3_prepare_v2(db, |
|
|
|
|
"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'peers\\_%' ESCAPE '\\'", |
|
|
|
|
-1, &s, NULL) != SQLITE_OK) return; |
|
|
|
|
-1, &s, NULL) != SQLITE_OK) { |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "RTT cannot enumerate membership tables: node=%016llx: %s", |
|
|
|
|
(unsigned long long)node_id, sqlite3_errmsg(db)); return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
char sql[256]; |
|
|
|
|
while (sqlite3_step(s) == SQLITE_ROW) { |
|
|
|
|
int rc; |
|
|
|
|
while ((rc = sqlite3_step(s)) == SQLITE_ROW) { |
|
|
|
|
const char* tbl = (const char*)sqlite3_column_text(s, 0); |
|
|
|
|
snprintf(sql, sizeof(sql), |
|
|
|
|
"UPDATE \"%s\" SET node_RTT=? WHERE node_id=?", tbl); |
|
|
|
|
@ -943,14 +952,16 @@ void topo_node_sqlite_update_rtt(sqlite3* db, uint64_t node_id, uint16_t rtt) {
|
|
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &u, NULL) == SQLITE_OK) { |
|
|
|
|
sqlite3_bind_int(u, 1, (int)rtt); |
|
|
|
|
sqlite3_bind_int64(u, 2, (sqlite3_int64)node_id); |
|
|
|
|
sqlite3_step(u); sqlite3_finalize(u); |
|
|
|
|
} |
|
|
|
|
if (sqlite3_step(u) != SQLITE_DONE) DEBUG_ERROR(DEBUG_CATEGORY_BGP, |
|
|
|
|
"RTT persistence failed: table=%s node=%016llx: %s", tbl, (unsigned long long)node_id, sqlite3_errmsg(db)); |
|
|
|
|
sqlite3_finalize(u); |
|
|
|
|
} else DEBUG_ERROR(DEBUG_CATEGORY_BGP, "RTT query preparation failed: table=%s node=%016llx: %s", |
|
|
|
|
tbl, (unsigned long long)node_id, sqlite3_errmsg(db)); |
|
|
|
|
} |
|
|
|
|
if (rc != SQLITE_DONE) DEBUG_ERROR(DEBUG_CATEGORY_BGP, "RTT table enumeration failed: node=%016llx: %s", |
|
|
|
|
(unsigned long long)node_id, sqlite3_errmsg(db)); |
|
|
|
|
sqlite3_finalize(s); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "sqlite_update_rtt: node=%016llx rtt=%u", |
|
|
|
|
(unsigned long long)node_id, (unsigned)rtt); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint64_t topo_node_sqlite_snapshot_timestamp(sqlite3* db, uint64_t node_id) { |
|
|
|
|
|