mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-03-05 18:13:27 +00:00
FS-9775: Exempt local nodes from expiration. Add release_querynodes api
This commit is contained in:
parent
6013808781
commit
d7222718aa
libs/libks/src/dht
@ -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(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_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_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);
|
KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t* table);
|
||||||
|
|
||||||
|
@ -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 ?*/
|
if (bucket != 0) { /* probably a logic error ?*/
|
||||||
|
|
||||||
ks_rwl_read_lock(bucket->lock);
|
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) {
|
if (node != NULL) {
|
||||||
ks_rwl_read_lock(node->reflock);
|
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 total = 0;
|
||||||
uint8_t cnt;
|
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;
|
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_dhtrt_sortedxors_t *x = tofree->next;
|
||||||
|
|
||||||
ks_pool_free(table->pool, tofree);
|
ks_pool_free(table->pool, tofree);
|
||||||
tofree = x->next;
|
tofree = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
return query->count;
|
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)
|
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);
|
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)
|
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];
|
ks_dhtrt_bucket_entry_t *e = &b->entries[ix];
|
||||||
|
|
||||||
if (e->inuse == 1) {
|
if (e->inuse == 1) {
|
||||||
/* more than n pings outstanding? */
|
|
||||||
|
|
||||||
if (e->outstanding_pings >= KS_DHTRT_MAXPING) {
|
if (e->gptr->type != KS_DHT_LOCAL) { /* 'local' nodes do not get expired */
|
||||||
e->flags = DHTPEER_EXPIRED;
|
|
||||||
++b->expired_count;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e->flags == DHTPEER_SUSPECT) {
|
/* more than n pings outstanding? */
|
||||||
ks_dhtrt_ping(e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ks_time_t tdiff = t0 - e->tyme;
|
if (e->outstanding_pings >= KS_DHTRT_MAXPING) {
|
||||||
|
e->flags = DHTPEER_EXPIRED;
|
||||||
|
++b->expired_count;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (tdiff > KS_DHTRT_INACTIVETIME) {
|
if (e->flags == DHTPEER_SUSPECT) {
|
||||||
e->flags = DHTPEER_SUSPECT;
|
ks_dhtrt_ping(e);
|
||||||
ks_dhtrt_ping(e);
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ks_time_t tdiff = t0 - e->tyme;
|
||||||
|
|
||||||
|
if (tdiff > KS_DHTRT_INACTIVETIME) {
|
||||||
|
e->flags = DHTPEER_SUSPECT;
|
||||||
|
ks_dhtrt_ping(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end if not local */
|
||||||
|
|
||||||
} /* end if e->inuse */
|
} /* end if e->inuse */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user