diff options
| author | Anton <anton@picapica> | 2019-03-15 19:37:08 +0400 |
|---|---|---|
| committer | Anton <anton@picapica> | 2019-03-15 19:37:08 +0400 |
| commit | 8efba55c86e0437ae65e0b0f5ab7271956265a8d (patch) | |
| tree | be126bdfbab869ed2ff71bb05f41c66b883de9f3 | |
| parent | ad5b7d28c53bfbc88f8dbe898114ff459448c5f4 (diff) | |
| download | pica-pica-8efba55c86e0437ae65e0b0f5ab7271956265a8d.tar.gz pica-pica-8efba55c86e0437ae65e0b0f5ab7271956265a8d.zip | |
pica-node: implement cleaning inactive nodes
| -rw-r--r-- | PICA_node.c | 12 | ||||
| -rw-r--r-- | PICA_nodeaddrlist.c | 52 | ||||
| -rw-r--r-- | PICA_nodeaddrlist.h | 3 |
3 files changed, 65 insertions, 2 deletions
diff --git a/PICA_node.c b/PICA_node.c index a8810d4..574aa9b 100644 --- a/PICA_node.c +++ b/PICA_node.c @@ -2592,7 +2592,19 @@ int process_timeouts() if (time(0) - skynet_refresh_tmst > SKYNET_REFRESH_TIMEOUT && !nodewait_list) { + int clean_treshold = 100 - nodelink_list_count - cclink_list_count; + + if (clean_treshold <= 0) + clean_treshold = 3; + PICA_debug3("refreshing nodelist database"); + + if (nodelink_list_count > 0) + { + PICA_debug3("trying to clean nodes unreachable after more than %i attempts", clean_treshold); + PICA_nodeaddr_cleanold(nodecfg.nodes_db_file, clean_treshold); + } + PICA_node_joinskynet(nodecfg.nodes_db_file, nodecfg.announced_addr); } return 1; diff --git a/PICA_nodeaddrlist.c b/PICA_nodeaddrlist.c index 723de71..417f4c8 100644 --- a/PICA_nodeaddrlist.c +++ b/PICA_nodeaddrlist.c @@ -156,6 +156,58 @@ int PICA_nodeaddr_update(const char* dbfilename, struct PICA_nodeaddr *naddr, in return 1; } +int PICA_nodeaddr_cleanold(const char* dbfilename, int treshold) +{ + sqlite3 *db; + sqlite3_stmt *stmt; + int ret; + const char query[] = "delete from nodes where inactive_count > :treshold"; + + ret = sqlite3_open(dbfilename, &db); + + if (ret != SQLITE_OK) + { + PICA_error("Can't open nodelist database: %s\n", sqlite3_errmsg(db)); + sqlite3_close(db); + return -1; + } + + ret = sqlite3_prepare_v2(db, query, -1, &stmt, NULL); + + if (ret != SQLITE_OK) + { + PICA_error("Can't prepare SQLite statement: %s\n", sqlite3_errmsg(db)); + sqlite3_close(db); + return -1; + } + + ret = sqlite3_bind_int(stmt, 1, treshold); + + if (ret != SQLITE_OK) + { + PICA_error("Can't bind treshold value: %s\n", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + sqlite3_close(db); + return -1; + } + + ret = sqlite3_step(stmt); + + if (ret != SQLITE_DONE) + { + PICA_error( "Can't execute query: %s\n", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + sqlite3_close(db); + return -1; + } + + sqlite3_finalize(stmt); + sqlite3_close(db); + + return 1; + +} + int PICA_nodeaddr_save(const char* dbfilename, struct PICA_nodeaddr *naddr) { sqlite3 *db; diff --git a/PICA_nodeaddrlist.h b/PICA_nodeaddrlist.h index 1b28987..2504693 100644 --- a/PICA_nodeaddrlist.h +++ b/PICA_nodeaddrlist.h @@ -70,8 +70,7 @@ struct PICA_nodeaddr int PICA_nodeaddr_list_load(const char* dbfilename, struct PICA_nodeaddr **list_head); int PICA_nodeaddr_save(const char* dbfilename, struct PICA_nodeaddr *naddr); int PICA_nodeaddr_update(const char* dbfilename, struct PICA_nodeaddr *naddr, int is_alive); -int PICA_nodeaddr_list_add();// -int PICA_nodeaddr_list_remove();// +int PICA_nodeaddr_cleanold(const char* dbfilename, int treshold); void PICA_nodeaddr_list_free(struct PICA_nodeaddr *list_head); #endif |
