diff options
author | Supriti Singh <supritisingh08@gmail.com> | 2014-08-24 01:15:38 +0000 |
---|---|---|
committer | Supriti Singh <supritisingh08@gmail.com> | 2014-08-24 01:15:38 +0000 |
commit | 7675791ceca33a1e0ba0acd6e2d842faa6bc96a2 (patch) | |
tree | 9f32c21faa4f1096600c8475fb2a819fb5549863 /src | |
parent | 3f01125723910d12ac45774cd87297242013d388 (diff) | |
download | gnunet-7675791ceca33a1e0ba0acd6e2d842faa6bc96a2.tar.gz gnunet-7675791ceca33a1e0ba0acd6e2d842faa6bc96a2.zip |
Fix
Diffstat (limited to 'src')
-rw-r--r-- | src/dht/gnunet-service-xdht_neighbours.c | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/src/dht/gnunet-service-xdht_neighbours.c b/src/dht/gnunet-service-xdht_neighbours.c index b70f98884..b607bb0ec 100644 --- a/src/dht/gnunet-service-xdht_neighbours.c +++ b/src/dht/gnunet-service-xdht_neighbours.c | |||
@@ -3164,6 +3164,10 @@ add_new_finger (struct GNUNET_PeerIdentity finger_identity, | |||
3164 | return; | 3164 | return; |
3165 | } | 3165 | } |
3166 | 3166 | ||
3167 | struct VerifySuccessorContext | ||
3168 | { | ||
3169 | unsigned int num_retries_scheduled; | ||
3170 | }; | ||
3167 | 3171 | ||
3168 | /** | 3172 | /** |
3169 | * Periodic task to verify current successor. There can be multiple trails to reach | 3173 | * Periodic task to verify current successor. There can be multiple trails to reach |
@@ -3187,13 +3191,44 @@ send_verify_successor_message (void *cls, | |||
3187 | /* This task will be scheduled when the result for Verify Successor is received. */ | 3191 | /* This task will be scheduled when the result for Verify Successor is received. */ |
3188 | send_verify_successor_task = GNUNET_SCHEDULER_NO_TASK; | 3192 | send_verify_successor_task = GNUNET_SCHEDULER_NO_TASK; |
3189 | 3193 | ||
3190 | if (send_verify_successor_retry_task == GNUNET_SCHEDULER_NO_TASK) | 3194 | /* When verify successor is being called for first time *for current context* |
3195 | * cls will be NULL. If send_verify_successor_retry_task is not NO_TASK, we | ||
3196 | * must cancel the retry task scheduled for verify_successor of previous | ||
3197 | * context. | ||
3198 | */ | ||
3199 | if (NULL == cls) | ||
3191 | { | 3200 | { |
3201 | if (send_verify_successor_retry_task != GNUNET_SCHEDULER_NO_TASK) | ||
3202 | { | ||
3203 | struct VerifySuccessorContext *old_ctx = | ||
3204 | GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task); | ||
3205 | /* old_ctx must not be NULL, as the retry task had been scheduled */ | ||
3206 | GNUNET_assert(NULL != old_ctx); | ||
3207 | GNUNET_free(old_ctx); | ||
3208 | } | ||
3209 | |||
3210 | struct VerifySuccessorContext *ctx; | ||
3211 | ctx = GNUNET_new(struct VerifySuccessorContext); | ||
3212 | |||
3213 | ctx->num_retries_scheduled++; | ||
3192 | send_verify_successor_retry_task = | 3214 | send_verify_successor_retry_task = |
3193 | GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time, | 3215 | GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time, |
3194 | &send_verify_successor_message, | 3216 | &send_verify_successor_message, |
3195 | NULL); | 3217 | ctx); |
3218 | } | ||
3219 | else | ||
3220 | { | ||
3221 | /* This is a retry attempt for verify_successor for a previous context */ | ||
3222 | struct VerifySuccessorContext *ctx; | ||
3223 | |||
3224 | ctx = cls; | ||
3225 | ctx->num_retries_scheduled++; | ||
3226 | send_verify_successor_retry_task = | ||
3227 | GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time, | ||
3228 | &send_verify_successor_message, | ||
3229 | ctx); | ||
3196 | } | 3230 | } |
3231 | |||
3197 | successor = &finger_table[0]; | 3232 | successor = &finger_table[0]; |
3198 | /* We are waiting for a confirmation from the notify message and we have not | 3233 | /* We are waiting for a confirmation from the notify message and we have not |
3199 | * crossed the wait time, then return. */ | 3234 | * crossed the wait time, then return. */ |
@@ -5212,7 +5247,9 @@ handle_dht_p2p_verify_successor_result(void *cls, | |||
5212 | /* Cancel Retry Task */ | 5247 | /* Cancel Retry Task */ |
5213 | if (GNUNET_SCHEDULER_NO_TASK != send_verify_successor_retry_task) | 5248 | if (GNUNET_SCHEDULER_NO_TASK != send_verify_successor_retry_task) |
5214 | { | 5249 | { |
5215 | GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task); | 5250 | struct VerifySuccessorContext *ctx; |
5251 | ctx = GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task); | ||
5252 | GNUNET_free(ctx); | ||
5216 | send_verify_successor_retry_task = GNUNET_SCHEDULER_NO_TASK; | 5253 | send_verify_successor_retry_task = GNUNET_SCHEDULER_NO_TASK; |
5217 | } | 5254 | } |
5218 | compare_and_update_successor (current_successor, | 5255 | compare_and_update_successor (current_successor, |
@@ -6138,7 +6175,9 @@ GDS_NEIGHBOURS_done (void) | |||
6138 | 6175 | ||
6139 | if (GNUNET_SCHEDULER_NO_TASK != send_verify_successor_retry_task) | 6176 | if (GNUNET_SCHEDULER_NO_TASK != send_verify_successor_retry_task) |
6140 | { | 6177 | { |
6141 | GNUNET_SCHEDULER_cancel (send_verify_successor_retry_task); | 6178 | struct VerifySuccessorContext *ctx; |
6179 | ctx = GNUNET_SCHEDULER_cancel (send_verify_successor_retry_task); | ||
6180 | GNUNET_free(ctx); | ||
6142 | send_verify_successor_retry_task = GNUNET_SCHEDULER_NO_TASK; | 6181 | send_verify_successor_retry_task = GNUNET_SCHEDULER_NO_TASK; |
6143 | } | 6182 | } |
6144 | 6183 | ||