summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton <anton@picapica>2019-03-15 19:37:08 +0400
committerAnton <anton@picapica>2019-03-15 19:37:08 +0400
commit8efba55c86e0437ae65e0b0f5ab7271956265a8d (patch)
treebe126bdfbab869ed2ff71bb05f41c66b883de9f3
parentad5b7d28c53bfbc88f8dbe898114ff459448c5f4 (diff)
downloadpica-pica-8efba55c86e0437ae65e0b0f5ab7271956265a8d.tar.gz
pica-pica-8efba55c86e0437ae65e0b0f5ab7271956265a8d.zip
pica-node: implement cleaning inactive nodes
-rw-r--r--PICA_node.c12
-rw-r--r--PICA_nodeaddrlist.c52
-rw-r--r--PICA_nodeaddrlist.h3
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