gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r16182 - gnunet/src/fs


From: gnunet
Subject: [GNUnet-SVN] r16182 - gnunet/src/fs
Date: Mon, 25 Jul 2011 17:38:48 +0200

Author: grothoff
Date: 2011-07-25 17:38:48 +0200 (Mon, 25 Jul 2011)
New Revision: 16182

Modified:
   gnunet/src/fs/gnunet-service-fs_pe.c
Log:
deduplicate requests

Modified: gnunet/src/fs/gnunet-service-fs_pe.c
===================================================================
--- gnunet/src/fs/gnunet-service-fs_pe.c        2011-07-25 15:20:48 UTC (rev 
16181)
+++ gnunet/src/fs/gnunet-service-fs_pe.c        2011-07-25 15:38:48 UTC (rev 
16182)
@@ -55,9 +55,9 @@
   struct GNUNET_CONTAINER_HeapNode *hn;
 
   /**
-   * Associated pending request.
+   * Array of associated pending requests.
    */
-  struct GSF_PendingRequest *pr;
+  struct GSF_PendingRequest **prs;  
 
   /**
    * Earliest time we'd be happy to (re)transmit this request.
@@ -70,6 +70,11 @@
   struct GNUNET_TIME_Absolute last_transmission;
 
   /**
+   * Number of entries in 'prs'.
+   */
+  unsigned int prs_length;
+
+  /**
    * Current priority for this request for this target.
    */
   uint64_t priority;
@@ -158,7 +163,7 @@
                         gettext_noop ("# average retransmission delay (ms)"),
                         total_delay * 1000LL / plan_count,
                         GNUNET_NO);
-  prd = GSF_pending_request_get_data_ (rp->pr);
+  prd = GSF_pending_request_get_data_ (rp->prs[0]);
   // FIXME: calculate 'rp->priority'!  
   if (rp->transmission_counter < 32)
     delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
@@ -220,7 +225,7 @@
       pp->task = GNUNET_SCHEDULER_add_now (&schedule_peer_transmission, pp);
       return 0;
     }
-  msize = GSF_pending_request_get_message_ (rp->pr, buf_size, buf);
+  msize = GSF_pending_request_get_message_ (rp->prs[0], buf_size, buf);
   if (msize > buf_size)
     {
       /* buffer to small (message changed), try again */
@@ -309,7 +314,7 @@
              rp);
 #endif    
   GNUNET_assert (NULL != rp);
-  msize = GSF_pending_request_get_message_ (rp->pr, 0, NULL);
+  msize = GSF_pending_request_get_message_ (rp->prs[0], 0, NULL);
   pp->pth = GSF_peer_transmit_ (pp->cp,
                                GNUNET_YES,
                                rp->priority,
@@ -335,6 +340,8 @@
   struct PeerPlan *pp;
   struct GSF_PendingRequestData *prd;
   struct GSF_RequestPlan *rp;
+  unsigned int i;
+  size_t msize;
 
   GNUNET_assert (NULL != cp);
   GSF_connected_peer_get_identity_ (cp, &id);
@@ -351,12 +358,39 @@
                                         pp,
                                         
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
     }
+  msize = GSF_pending_request_get_message_ (pr, 0, NULL);
   prd = GSF_pending_request_get_data_ (pr);
+  for (rp = prd->rp_head; NULL != rp; rp = rp->next)
+    {
+      char mbuf[msize];
+      char xbuf[msize];
+      
+      GNUNET_assert (msize == GSF_pending_request_get_message_ (pr, msize, 
mbuf));
+      if ( (msize == GSF_pending_request_get_message_ (rp->prs[0], msize, 
xbuf)) &&
+          (0 == memcmp (xbuf, mbuf, msize)) )
+       {
+         /* add request to existing plan */
+         GNUNET_array_append (rp->prs, 
+                              rp->prs_length,
+                              pr);
+         for (i=0;i<rp->prs_length;i++)
+           if (GSF_pending_request_get_data_ (rp->prs[0])->ttl.abs_value < 
prd->ttl.abs_value)
+             {
+               GNUNET_STATISTICS_update (GSF_stats,
+                                         gettext_noop ("# requests refreshed"),
+                                         1,
+                                         GNUNET_NO);  
+               rp->transmission_counter = 0; /* reset */               
+               break;
+             }
+         return;
+       }
+    }
   plan_count++;
   GNUNET_STATISTICS_update (GSF_stats,
                            gettext_noop ("# query plan entries"),
                            1,
-                           GNUNET_NO);
+                           GNUNET_NO);  
   rp = GNUNET_malloc (sizeof (struct GSF_RequestPlan));
 #if DEBUG_FS
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -365,7 +399,9 @@
              GNUNET_i2s (&id), 
              rp);
 #endif    
-  rp->pr = pr;
+  GNUNET_array_append (rp->prs,
+                      rp->prs_length,
+                      pr);
   GNUNET_CONTAINER_DLL_insert (prd->rp_head,
                               prd->rp_tail,
                               rp);
@@ -386,6 +422,7 @@
   struct PeerPlan *pp;
   struct GSF_RequestPlan *rp;
   struct GSF_PendingRequestData *prd;
+  unsigned int i;
 
   GSF_connected_peer_get_identity_ (cp, &id);
   pp = GNUNET_CONTAINER_multihashmap_get (plans,
@@ -405,21 +442,29 @@
     }
   while (NULL != (rp = GNUNET_CONTAINER_heap_remove_root (pp->priority_heap)))
     {
-      prd = GSF_pending_request_get_data_ (rp->pr);
-      GNUNET_CONTAINER_DLL_remove (prd->rp_head,
-                                  prd->rp_tail,
-                                  rp);
+      for (i=0;i<rp->prs_length;i++)
+       {
+         prd = GSF_pending_request_get_data_ (rp->prs[i]);
+         GNUNET_CONTAINER_DLL_remove (prd->rp_head,
+                                      prd->rp_tail,
+                                      rp);
+       }
       plan_count--;
+      GNUNET_array_grow (rp->prs, rp->prs_length, 0);
       GNUNET_free (rp);
     }
   GNUNET_CONTAINER_heap_destroy (pp->priority_heap);
   while (NULL != (rp = GNUNET_CONTAINER_heap_remove_root (pp->delay_heap)))
     {
-      prd = GSF_pending_request_get_data_ (rp->pr);
-      GNUNET_CONTAINER_DLL_remove (prd->rp_head,
-                                  prd->rp_tail,
-                                  rp);
+      for (i=0;i<rp->prs_length;i++)
+       {
+         prd = GSF_pending_request_get_data_ (rp->prs[i]);
+         GNUNET_CONTAINER_DLL_remove (prd->rp_head,
+                                      prd->rp_tail,
+                                      rp);
+       }
       plan_count--;
+      GNUNET_array_grow (rp->prs, rp->prs_length, 0);
       GNUNET_free (rp);
     }
   GNUNET_STATISTICS_set (GSF_stats,
@@ -443,16 +488,29 @@
 {
   struct GSF_RequestPlan *rp;
   struct GSF_PendingRequestData *prd;
+  unsigned int i;
 
   prd = GSF_pending_request_get_data_ (pr);
   while (NULL != (rp = prd->rp_head))
     {
-      GNUNET_CONTAINER_heap_remove_node (rp->hn);
-      GNUNET_CONTAINER_DLL_remove (prd->rp_head,
-                                  prd->rp_tail,
-                                  rp);
-      plan_count--;
-      GNUNET_free (rp);
+      for (i=0;i<rp->prs_length;i++)
+       {
+         if (rp->prs[i] == pr)
+           {         
+             rp->prs[i] = rp->prs[rp->prs_length - 1];
+             GNUNET_array_grow (rp->prs, rp->prs_length, rp->prs_length-1);
+             if (rp->prs_length == 0)
+               {
+                 GNUNET_CONTAINER_heap_remove_node (rp->hn);
+                 GNUNET_CONTAINER_DLL_remove (prd->rp_head,
+                                              prd->rp_tail,
+                                              rp);
+                 plan_count--;
+                 GNUNET_free (rp);
+                 break;
+               }
+           }
+       }
     }
   GNUNET_STATISTICS_set (GSF_stats,
                         gettext_noop ("# query plan entries"),




reply via email to

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