提交 a6986510 authored 作者: colm's avatar colm 提交者: Mike Jerris

FS-9775: DHT Repopulate empty buckets

上级 4a0132f7
......@@ -296,6 +296,11 @@ KS_DECLARE(void) ks_dht_job_build_put(ks_dht_job_t *job,
ks_dht_token_t *token,
int64_t cas,
ks_dht_storageitem_t *item);
KS_DECLARE(void) ks_dht_job_build_search_findnode(ks_dht_job_t *job,
ks_dht_nodeid_t *target,
uint32_t family,
ks_dht_job_callback_t query_callback,
ks_dht_job_callback_t finish_callback);
KS_DECLARE(void) ks_dht_job_destroy(ks_dht_job_t **job);
......
......@@ -3046,6 +3046,43 @@ KS_DECLARE(ks_status_t) ks_dht_process_response_put(ks_dht_t *dht, ks_dht_job_t
return ret;
}
KS_DECLARE(ks_status_t) ks_dht_exec_search_findnode(ks_dht_t *dht, ks_dht_job_t *job)
{
return ks_dht_search_findnode(dht,
job->query_family,
&job->query_target,
NULL,
NULL);
}
KS_DECLARE(ks_status_t) ks_dht_queue_search_findnode(ks_dht_t* dht,
ks_dhtrt_routetable_t *rt,
ks_dht_nodeid_t *target,
ks_dht_job_callback_t callback)
{
ks_dht_job_t *job = NULL;
ks_status_t ret = KS_STATUS_SUCCESS;
ks_assert(dht);
ks_assert(rt);
ks_assert(target);
ks_sockaddr_t taddr; /* just to satisfy the api */
if ((ret = ks_dht_job_create(&job, dht->pool, &taddr, 3)) == KS_STATUS_SUCCESS) {
int32_t family = AF_INET;
if (rt == dht->rt_ipv6) {
family = AF_INET6;
}
ks_dht_job_build_search_findnode(job, target, family, ks_dht_exec_search_findnode, callback);
}
return ret;
}
/* For Emacs:
* Local Variables:
* mode:c
......
......@@ -145,6 +145,7 @@ struct ks_dht_job_s {
int64_t query_cas;
ks_dht_token_t query_token;
ks_dht_storageitem_t *query_storageitem;
uint32_t query_family;
// job specific response parameters
ks_dht_nodeid_t response_id;
......@@ -480,6 +481,14 @@ KS_DECLARE(ks_status_t) ks_dht_search_findnode(ks_dht_t *dht,
ks_dht_search_callback_t callback,
ks_dht_search_t **search);
KS_DECLARE(ks_status_t) ks_dht_queue_search_findnode(ks_dht_t* dht,
ks_dhtrt_routetable_t *rt,
ks_dht_nodeid_t *target,
ks_dht_job_callback_t callback);
KS_DECLARE(ks_status_t) ks_dht_exec_search_findnode(ks_dht_t *dht, ks_dht_job_t *job);
/**
* route table methods
......
......@@ -98,6 +98,23 @@ KS_DECLARE(void) ks_dht_job_build_put(ks_dht_job_t *job,
job->query_storageitem = item;
}
KS_DECLARE(void) ks_dht_job_build_search_findnode(ks_dht_job_t *job,
ks_dht_nodeid_t *target,
uint32_t family,
ks_dht_job_callback_t query_callback,
ks_dht_job_callback_t finish_callback)
{
ks_assert(job);
ks_assert(target);
ks_assert(family);
job->search = NULL;
job->query_callback = query_callback;
job->finish_callback = finish_callback;
job->query_target = *target;
job->query_family = family;
}
KS_DECLARE(void) ks_dht_job_destroy(ks_dht_job_t **job)
{
ks_dht_job_t *j;
......
......@@ -548,6 +548,117 @@ void test07()
}
void test08()
{
printf("**** testbuckets - test08 start\n"); fflush(stdout);
ks_dht_node_t *peer;
memset(g_nodeid1.id, 0xef, KS_DHT_NODEID_SIZE);
memset(g_nodeid2.id, 0xef, KS_DHT_NODEID_SIZE);
char ipv6[] = "1234:1234:1234:1234";
char ipv4[] = "123.123.123.123";
unsigned short port = 7000;
/* build a delete queue */
int cix=0;
for(int i0=0, i1=0; i0<150; ++i0, ++i1) {
if (i0%20 == 0) {
g_nodeid2.id[cix]>>=1;
//ks_dhtrt_dump(rt, 7);
if ( g_nodeid2.id[cix] == 0) ++cix;
g_nodeid2.id[19] = 0;
}
else {
++g_nodeid2.id[19];
}
ks_dhtrt_create_node(rt, g_nodeid2, KS_DHT_REMOTE, ipv4, port, KS_DHTRT_CREATE_DEFAULT, &peer);
ks_dhtrt_touch_node(rt, g_nodeid2);
ks_dhtrt_release_node(peer);
}
cix = 0;
memset(g_nodeid2.id, 0xef, KS_DHT_NODEID_SIZE);
for (int i0=0, i1=0; i0<150; ++i0, ++i1) {
if (i0%20 == 0) {
g_nodeid2.id[cix]>>=1;
if ( g_nodeid2.id[cix] == 0) ++cix;
g_nodeid2.id[19] = 0;
}
else {
++g_nodeid2.id[19];
}
ks_dht_node_t* n = ks_dhtrt_find_node(rt, g_nodeid2);
ks_dhtrt_release_node(n);
ks_dhtrt_delete_node(rt, n);
}
/* this should drive the search_findnode */
for(int i=0; i<45; ++i) {
printf("firing process table\n");
ks_dhtrt_process_table(rt);
ks_sleep(1000 * 1000 * 60); /* sleep one minutes */
}
printf("**** testbuckets - test08 ended\n"); fflush(stdout);
}
void test09()
{
printf("**** testbuckets - test09 start\n"); fflush(stdout);
ks_dht_node_t *peer;
memset(g_nodeid1.id, 0xef, KS_DHT_NODEID_SIZE);
memset(g_nodeid2.id, 0xef, KS_DHT_NODEID_SIZE);
char ipv6[] = "1234:1234:1234:1234";
char ipv4[] = "123.123.123.123";
unsigned short port = 7000;
/* build a delete queue */
int cix=0;
for(int i0=0, i1=0; i0<150; ++i0, ++i1) {
if (i0%20 == 0) {
g_nodeid2.id[cix]>>=1;
//ks_dhtrt_dump(rt, 7);
if ( g_nodeid2.id[cix] == 0) ++cix;
g_nodeid2.id[19] = 0;
}
else {
++g_nodeid2.id[19];
}
ks_dhtrt_create_node(rt, g_nodeid2, KS_DHT_REMOTE, ipv4, port, KS_DHTRT_CREATE_DEFAULT, &peer);
ks_dhtrt_touch_node(rt, g_nodeid2);
ks_dhtrt_release_node(peer);
}
/* this should expire all nodes after 15 minutes and 3 pings */
printf("\n\n\n\n");
for(int i=0; i<45; ++i) {
printf("firing process table\n");
ks_dhtrt_process_table(rt);
ks_sleep(1000 * 1000 * 30); /* sleep 30 seconds */
}
printf("**** testbuckets - test09 ended\n"); fflush(stdout);
}
static int gindex = 1;
static ks_mutex_t *glock;
static int gstop = 0;
......@@ -1020,7 +1131,6 @@ int main(int argc, char *argv[]) {
continue;
}
if (tests[tix] == 7) {
ks_dhtrt_initroute(&rt, dht, pool);
test07();
......@@ -1028,6 +1138,22 @@ int main(int argc, char *argv[]) {
continue;
}
if (tests[tix] == 8) {
ks_dhtrt_initroute(&rt, dht, pool);
test08();
ks_dhtrt_deinitroute(&rt);
continue;
}
if (tests[tix] == 9) {
ks_dhtrt_initroute(&rt, dht, pool);
test09();
ks_dhtrt_deinitroute(&rt);
continue;
}
if (tests[tix] == 30) {
ks_dhtrt_initroute(&rt, dht, pool);
test30();
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论