gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r10180 - gnunet/src/fs
Date: Mon, 1 Feb 2010 13:28:34 +0100

Author: grothoff
Date: 2010-02-01 13:28:34 +0100 (Mon, 01 Feb 2010)
New Revision: 10180

Modified:
   gnunet/src/fs/gnunet-service-fs.c
   gnunet/src/fs/test_fs_download_data.conf
Log:
fixes

Modified: gnunet/src/fs/gnunet-service-fs.c
===================================================================
--- gnunet/src/fs/gnunet-service-fs.c   2010-02-01 12:08:51 UTC (rev 10179)
+++ gnunet/src/fs/gnunet-service-fs.c   2010-02-01 12:28:34 UTC (rev 10180)
@@ -30,7 +30,6 @@
  * - detect duplicate requests (P2P and CS)
  * - implement: bound_priority, test_load_too_high, validate_skblock
  * - add content migration support (store locally)
- * - add random delay
  * - statistics
  * 
  */
@@ -928,17 +927,17 @@
 shutdown_task (void *cls,
               const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
+  while (client_list != NULL)
+    handle_client_disconnect (NULL,
+                             client_list->client);
   GNUNET_CONTAINER_multihashmap_iterate (connected_peers,
                                         &clean_peer,
                                         NULL);
-  GNUNET_CONTAINER_multihashmap_destroy (connected_peers);
-  connected_peers = NULL;
-  while (client_list != NULL)
-    handle_client_disconnect (NULL,
-                             client_list->client);
   GNUNET_break (0 == GNUNET_CONTAINER_heap_get_size 
(requests_by_expiration_heap));
   GNUNET_CONTAINER_heap_destroy (requests_by_expiration_heap);
   requests_by_expiration_heap = 0;
+  GNUNET_CONTAINER_multihashmap_destroy (connected_peers);
+  connected_peers = NULL;
   GNUNET_break (0 == GNUNET_CONTAINER_multihashmap_size (query_request_map));
   GNUNET_CONTAINER_multihashmap_destroy (query_request_map);
   query_request_map = NULL;
@@ -1243,14 +1242,10 @@
   char *bfdata;
   size_t msize;
   unsigned int k;
+  int no_route;
 
   pr->irc = NULL;
   GNUNET_assert (peer != NULL);
-  if (amount != DBLOCK_SIZE) 
-    {
-      /* FIXME: call stats... */
-      return; /* this target round failed */    
-    }
   // (3) transmit, update ttl/priority
   cp = GNUNET_CONTAINER_multihashmap_get (connected_peers,
                                          &peer->hashPubKey);
@@ -1259,8 +1254,24 @@
       /* Peer must have just left */
       return;
     }
+  no_route = GNUNET_NO;
+  if (amount != DBLOCK_SIZE) 
+    {
+      if (pr->pht_entry == NULL)
+       return;  /* this target round failed */
+      /* FIXME: if we are "quite" busy, we may still want to skip
+        this round; need more load detection code! */
+      no_route = GNUNET_YES;
+    }
+  
   /* build message and insert message into priority queue */
-  k = 0; // FIXME: count hash codes!
+  k = 0;
+  if (pr->namespace != NULL)
+    k++;
+  if (pr->target_pid != 0)
+    k++;
+  if (GNUNET_YES == no_route)
+    k++;      
   msize = sizeof (struct GetMessage) + pr->bf_size + k * 
sizeof(GNUNET_HashCode);
   GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE);
   pm = GNUNET_malloc (sizeof (struct PendingMessage) + msize);
@@ -1276,7 +1287,13 @@
   gm->hash_bitmap = htonl (42); // FIXME!
   gm->query = pr->query;
   ext = (GNUNET_HashCode*) &gm[1];
-  // FIXME: setup "ext[0]..[k-1]"
+  k = 0;
+  if (pr->namespace != NULL)
+    memcpy (&ext[k++], pr->namespace, sizeof (GNUNET_HashCode));
+  if (pr->target_pid != 0)
+    GNUNET_PEER_resolve (pr->target_pid, (struct GNUNET_PeerIdentity*) 
&ext[k++]);
+  if (GNUNET_YES == no_route)
+    GNUNET_PEER_resolve (pr->pht_entry->cp->pid, (struct GNUNET_PeerIdentity*) 
&ext[k++]);
   bfdata = (char *) &ext[k];
   if (pr->bf != NULL)
     GNUNET_CONTAINER_bloomfilter_get_raw_data (pr->bf,
@@ -1288,7 +1305,6 @@
 }
 
 
-
 /**
  * Closure used for "target_peer_select_cb".
  */
@@ -1659,7 +1675,7 @@
       GNUNET_break (GNUNET_YES ==
                    GNUNET_CONTAINER_multihashmap_remove (query_request_map,
                                                          key,
-                                                         prq));
+                                                         pr));
       break;
     case GNUNET_DATASTORE_BLOCKTYPE_SBLOCK:
       if (0 != memcmp (pr->namespace,
@@ -1679,7 +1695,6 @@
        }
       if (pr->client_request_list != NULL)
        {
-         cl = pr->client_request_list->client_list;
          if (pr->replies_seen_size == pr->replies_seen_off)
            {
              GNUNET_array_grow (pr->replies_seen,
@@ -1702,6 +1717,7 @@
   pr->remaining_priority = 0;
   if (pr->client_request_list != NULL)
     {
+      cl = pr->client_request_list->client_list;
       msize = sizeof (struct PutMessage) + prq->size;
       creply = GNUNET_malloc (msize + sizeof (struct ClientResponseMessage));
       creply->msize = msize;
@@ -2144,7 +2160,7 @@
   pre->req = pr;
   GNUNET_CONTAINER_multihashmap_put (query_request_map,
                                     &gm->query,
-                                    pre,
+                                    pr,
                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
   
   pr->hnode = GNUNET_CONTAINER_heap_insert (requests_by_expiration_heap,
@@ -2247,8 +2263,9 @@
   /* FIXME: detect duplicate request; if duplicate, simply update (merge)
      'pr->replies_seen'! */
   pr = GNUNET_malloc (sizeof (struct PendingRequest) + 
-                     (type == 
GNUNET_DATASTORE_BLOCKTYPE_SBLOCK)?sizeof(GNUNET_HashCode):0);
+                     ((type == 
GNUNET_DATASTORE_BLOCKTYPE_SBLOCK)?sizeof(GNUNET_HashCode):0));
   crl = GNUNET_malloc (sizeof (struct ClientRequestList));
+  memset (crl, 0, sizeof (struct ClientRequestList));
   crl->client_list = cl;
   GNUNET_CONTAINER_DLL_insert (cl->rl_head,
                               cl->rl_tail,
@@ -2283,6 +2300,10 @@
     default:
       break;
     }
+  GNUNET_CONTAINER_multihashmap_put (query_request_map,
+                                    &sm->query,
+                                    pr,
+                                    
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
   pr->drq = GNUNET_FS_drq_get (&sm->query,
                               pr->type,                               
                               &process_local_reply,
@@ -2341,6 +2362,10 @@
 {
   sched = s;
   cfg = c;
+  connected_peers = GNUNET_CONTAINER_multihashmap_create (128); // FIXME: get 
size from config
+  query_request_map = GNUNET_CONTAINER_multihashmap_create (128); // FIXME: 
get size from config
+  peer_request_map = GNUNET_CONTAINER_multihashmap_create (128); // FIXME: get 
size from config
+  requests_by_expiration_heap = GNUNET_CONTAINER_heap_create 
(GNUNET_CONTAINER_HEAP_ORDER_MIN); 
   core = GNUNET_CORE_connect (sched,
                              cfg,
                              GNUNET_TIME_UNIT_FOREVER_REL,
@@ -2357,11 +2382,17 @@
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                  _("Failed to connect to `%s' service.\n"),
                  "core");
+      GNUNET_CONTAINER_multihashmap_destroy (connected_peers);
+      connected_peers = NULL;
+      GNUNET_CONTAINER_multihashmap_destroy (query_request_map);
+      query_request_map = NULL;
+      GNUNET_CONTAINER_heap_destroy (requests_by_expiration_heap);
+      requests_by_expiration_heap = NULL;
+      GNUNET_CONTAINER_multihashmap_destroy (peer_request_map);
+      peer_request_map = NULL;
+
       return GNUNET_SYSERR;
     }  
-  query_request_map = GNUNET_CONTAINER_multihashmap_create (128); // FIXME: 
get size from config
-  peer_request_map = GNUNET_CONTAINER_multihashmap_create (128); // FIXME: get 
size from config
-  requests_by_expiration_heap = GNUNET_CONTAINER_heap_create 
(GNUNET_CONTAINER_HEAP_ORDER_MIN); 
   GNUNET_SERVER_disconnect_notify (server, 
                                   &handle_client_disconnect,
                                   NULL);

Modified: gnunet/src/fs/test_fs_download_data.conf
===================================================================
--- gnunet/src/fs/test_fs_download_data.conf    2010-02-01 12:08:51 UTC (rev 
10179)
+++ gnunet/src/fs/test_fs_download_data.conf    2010-02-01 12:28:34 UTC (rev 
10180)
@@ -36,7 +36,9 @@
 [fs]
 PORT = 42471
 HOSTNAME = localhost
-#DEBUG = YES
+DEBUG = YES
+PREFIX = valgrind --tool=memcheck --leak-check=yes
+BINARY = /home/grothoff/bin/gnunet-service-fs
 
 [testing]
 WEAKRANDOM = YES





reply via email to

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