gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r34213 - gnunet/src/dht


From: gnunet
Subject: [GNUnet-SVN] r34213 - gnunet/src/dht
Date: Sun, 24 Aug 2014 03:15:38 +0200

Author: supriti
Date: 2014-08-24 03:15:38 +0200 (Sun, 24 Aug 2014)
New Revision: 34213

Modified:
   gnunet/src/dht/gnunet-service-xdht_neighbours.c
Log:
Fix



Modified: gnunet/src/dht/gnunet-service-xdht_neighbours.c
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_neighbours.c     2014-08-24 00:44:51 UTC 
(rev 34212)
+++ gnunet/src/dht/gnunet-service-xdht_neighbours.c     2014-08-24 01:15:38 UTC 
(rev 34213)
@@ -3164,6 +3164,10 @@
   return;
 }
 
+struct VerifySuccessorContext
+{
+  unsigned int num_retries_scheduled;
+};
 
 /**
  * Periodic task to verify current successor. There can be multiple trails to 
reach
@@ -3187,13 +3191,44 @@
   /* This task will be scheduled when the result for Verify Successor is 
received. */
   send_verify_successor_task = GNUNET_SCHEDULER_NO_TASK;
   
-  if (send_verify_successor_retry_task == GNUNET_SCHEDULER_NO_TASK)
+  /* When verify successor is being called for first time *for current context*
+   * cls will be NULL. If send_verify_successor_retry_task is not NO_TASK, we
+   * must cancel the retry task scheduled for verify_successor of previous
+   * context.
+   */
+  if (NULL == cls)
   {
+    if (send_verify_successor_retry_task != GNUNET_SCHEDULER_NO_TASK)
+    {
+      struct VerifySuccessorContext *old_ctx = 
+          GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task);
+      /* old_ctx must not be NULL, as the retry task had been scheduled */
+      GNUNET_assert(NULL != old_ctx);
+      GNUNET_free(old_ctx);
+    }
+    
+    struct VerifySuccessorContext *ctx;
+    ctx = GNUNET_new(struct VerifySuccessorContext);
+    
+    ctx->num_retries_scheduled++;
     send_verify_successor_retry_task =
         GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time,
                                       &send_verify_successor_message,
-                                      NULL);
+                                      ctx);
+  }  
+  else
+  {
+    /* This is a retry attempt for verify_successor for a previous context */
+    struct VerifySuccessorContext *ctx;
+    
+    ctx = cls;
+    ctx->num_retries_scheduled++;
+    send_verify_successor_retry_task =
+        GNUNET_SCHEDULER_add_delayed (verify_successor_retry_time,
+                                      &send_verify_successor_message,
+                                      ctx);
   }
+  
   successor = &finger_table[0];
   /* We are waiting for a confirmation from the notify message and we have not
    * crossed the wait time, then return. */
@@ -5212,7 +5247,9 @@
     /* Cancel Retry Task */
     if (GNUNET_SCHEDULER_NO_TASK != send_verify_successor_retry_task)
     {
-      GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task);
+      struct VerifySuccessorContext *ctx;
+      ctx = GNUNET_SCHEDULER_cancel(send_verify_successor_retry_task);
+      GNUNET_free(ctx);
       send_verify_successor_retry_task = GNUNET_SCHEDULER_NO_TASK;
     }
     compare_and_update_successor (current_successor,
@@ -6138,7 +6175,9 @@
 
   if (GNUNET_SCHEDULER_NO_TASK != send_verify_successor_retry_task)
   {
-    GNUNET_SCHEDULER_cancel (send_verify_successor_retry_task);
+    struct VerifySuccessorContext *ctx;
+    ctx = GNUNET_SCHEDULER_cancel (send_verify_successor_retry_task);
+    GNUNET_free(ctx);
     send_verify_successor_retry_task = GNUNET_SCHEDULER_NO_TASK;
   }
   




reply via email to

[Prev in Thread] Current Thread [Next in Thread]