aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSupriti Singh <supritisingh08@gmail.com>2014-08-24 01:15:38 +0000
committerSupriti Singh <supritisingh08@gmail.com>2014-08-24 01:15:38 +0000
commit7675791ceca33a1e0ba0acd6e2d842faa6bc96a2 (patch)
tree9f32c21faa4f1096600c8475fb2a819fb5549863
parent3f01125723910d12ac45774cd87297242013d388 (diff)
downloadgnunet-7675791ceca33a1e0ba0acd6e2d842faa6bc96a2.tar.gz
gnunet-7675791ceca33a1e0ba0acd6e2d842faa6bc96a2.zip
Fix
-rw-r--r--src/dht/gnunet-service-xdht_neighbours.c47
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
3167struct 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