]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-9775: Exempt local nodes from expiration. Add release_querynodes api
authorcolm <colm@freeswitch1>
Thu, 15 Dec 2016 03:31:21 +0000 (22:31 -0500)
committerMike Jerris <mike@jerris.com>
Wed, 25 Jan 2017 20:59:36 +0000 (14:59 -0600)
libs/libks/src/dht/ks_dht.h
libs/libks/src/dht/ks_dht_bucket.c

index ca5154c10066901ce1cea02677f9cc014fe89ca7..1ceb99490ed97e7802de58f6e4a7f82213d7e610 100644 (file)
@@ -459,7 +459,9 @@ KS_DECLARE(ks_status_t)        ks_dhtrt_expire_node(ks_dhtrt_routetable_t* table
 
 KS_DECLARE(uint8_t)            ks_dhtrt_findclosest_nodes(ks_dhtrt_routetable_t* table, ks_dhtrt_querynodes_t* query);
 KS_DECLARE(ks_dht_node_t*)     ks_dhtrt_find_node(ks_dhtrt_routetable_t* table, ks_dht_nodeid_t id);
+
 KS_DECLARE(ks_status_t)        ks_dhtrt_release_node(ks_dht_node_t* node);
+KS_DECLARE(ks_status_t)        ks_dhtrt_release_querynodes(ks_dhtrt_querynodes_t* query);
 
 KS_DECLARE(void)               ks_dhtrt_process_table(ks_dhtrt_routetable_t* table);
 
index 796b0ce8250a84292e425150fba95f39b954471f..4958a7622e5e0459582e0729b8c4dbaa450496e2 100644 (file)
@@ -428,7 +428,7 @@ KS_DECLARE(ks_dht_node_t *) ks_dhtrt_find_node(ks_dhtrt_routetable_t *table, ks_
                if (bucket != 0) {                       /* probably a logic error ?*/
 
                        ks_rwl_read_lock(bucket->lock);
-                       ks_dht_node_t* node = ks_dhtrt_find_nodeid(bucket, nodeid.id);
+                       node = ks_dhtrt_find_nodeid(bucket, nodeid.id);
     
                        if (node != NULL) {
                                ks_rwl_read_lock(node->reflock);
@@ -510,7 +510,11 @@ uint8_t ks_dhtrt_findclosest_locked_nodes(ks_dhtrt_routetable_t *table, ks_dhtrt
        uint8_t total = 0;
        uint8_t cnt;
 
-       if (max == 0) return 0;                 /* sanity check */
+       if (max == 0) return 0;                 /* sanity checks */
+    if (max > KS_DHTRT_MAXQUERYSIZE) {  /* enforce the maximum */
+               max = KS_DHTRT_MAXQUERYSIZE; 
+        query->max = KS_DHTRT_MAXQUERYSIZE;
+       }
 
        query->count = 0;
 
@@ -659,7 +663,7 @@ uint8_t ks_dhtrt_findclosest_locked_nodes(ks_dhtrt_routetable_t *table, ks_dhtrt
                ks_dhtrt_sortedxors_t *x = tofree->next;
 
                ks_pool_free(table->pool, tofree);
-               tofree = x->next;
+               tofree = x;
        }
 
        return query->count;
@@ -667,11 +671,16 @@ uint8_t ks_dhtrt_findclosest_locked_nodes(ks_dhtrt_routetable_t *table, ks_dhtrt
 
 KS_DECLARE(ks_status_t) ks_dhtrt_release_node(ks_dht_node_t* node)
 {
-    return KS_STATUS_SUCCESS; 
     return ks_rwl_read_unlock(node->reflock);
 }
 
-
+KS_DECLARE(ks_status_t) ks_dhtrt_release_querynodes(ks_dhtrt_querynodes_t *query)
+{
+    for(int ix=0; ix<query->count; ++ix) {
+       ks_rwl_read_unlock(query->nodes[ix]->reflock);
+    }
+    return KS_STATUS_SUCCESS;
+}
 
 KS_DECLARE(void)  ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
 {
@@ -717,25 +726,30 @@ KS_DECLARE(void)  ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
                                        ks_dhtrt_bucket_entry_t *e =  &b->entries[ix];
 
                                        if (e->inuse == 1) {
-                                               /* more than n pings outstanding? */
 
-                                               if (e->outstanding_pings >= KS_DHTRT_MAXPING) {
-                                                       e->flags =      DHTPEER_EXPIRED; 
-                                                       ++b->expired_count;
-                                                       continue;
-                                               }
+                                               if (e->gptr->type != KS_DHT_LOCAL) {   /* 'local' nodes do not get expired */
+
+                                                       /* more than n pings outstanding? */
+
+                                                       if (e->outstanding_pings >= KS_DHTRT_MAXPING) {
+                                                               e->flags =      DHTPEER_EXPIRED; 
+                                                               ++b->expired_count;
+                                                               continue;
+                                                       }
+
+                                                       if (e->flags == DHTPEER_SUSPECT) {
+                                                               ks_dhtrt_ping(e); 
+                                                               continue;
+                                                       }
 
-                                               if (e->flags == DHTPEER_SUSPECT) {
-                                                       ks_dhtrt_ping(e); 
-                                                       continue;
-                                               }
+                                                       ks_time_t tdiff = t0 - e->tyme;
 
-                                               ks_time_t tdiff = t0 - e->tyme;
+                                                       if (tdiff > KS_DHTRT_INACTIVETIME) {
+                                                               e->flags = DHTPEER_SUSPECT;
+                                                               ks_dhtrt_ping(e);
+                                                       }
 
-                                               if (tdiff > KS_DHTRT_INACTIVETIME) {
-                                                       e->flags = DHTPEER_SUSPECT;
-                                                       ks_dhtrt_ping(e);
-                                               }
+                                               } /* end if not local */
 
                                        }  /* end if e->inuse */