add nick name for cached records
[oweals/gnunet.git] / src / datastore / gnunet-service-datastore.c
index 863cd3902e9588ccd45aa897be1abacf8ff1affb..7c4c47e9019ad2feb8f4f0f0f198cbd8fdeea811 100644 (file)
@@ -4,7 +4,7 @@
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -316,7 +316,7 @@ delete_expired (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
  *         GNUNET_NO to delete the item and continue (if supported)
  */
 static int
-expired_processor (void *cls, const GNUNET_HashCode * key, uint32_t size,
+expired_processor (void *cls, const struct GNUNET_HashCode * key, uint32_t size,
                    const void *data, enum GNUNET_BLOCK_Type type,
                    uint32_t priority, uint32_t anonymity,
                    struct GNUNET_TIME_Absolute expiration, uint64_t uid)
@@ -332,7 +332,7 @@ expired_processor (void *cls, const GNUNET_HashCode * key, uint32_t size,
     return GNUNET_SYSERR;
   }
   now = GNUNET_TIME_absolute_get ();
-  if (expiration.abs_value > now.abs_value)
+  if (expiration.abs_value_us > now.abs_value_us)
   {
     /* finished processing */
     expired_kill_task =
@@ -341,12 +341,12 @@ expired_processor (void *cls, const GNUNET_HashCode * key, uint32_t size,
                                                    &delete_expired, NULL);
     return GNUNET_SYSERR;
   }
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Deleting content `%s' of type %u that expired %llu ms ago\n",
+              "Deleting content `%s' of type %u that expired %s ago\n",
               GNUNET_h2s (key), type,
-              (unsigned long long) (now.abs_value - expiration.abs_value));
-#endif
+             GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_difference (expiration,
+                                                                                          now),
+                                                     GNUNET_YES));
   min_expiration = now;
   GNUNET_STATISTICS_update (stats, gettext_noop ("# bytes expired"), size,
                             GNUNET_YES);
@@ -396,7 +396,7 @@ delete_expired (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
  *         GNUNET_NO to delete the item and continue (if supported)
  */
 static int
-quota_processor (void *cls, const GNUNET_HashCode * key, uint32_t size,
+quota_processor (void *cls, const struct GNUNET_HashCode * key, uint32_t size,
                  const void *data, enum GNUNET_BLOCK_Type type,
                  uint32_t priority, uint32_t anonymity,
                  struct GNUNET_TIME_Absolute expiration, uint64_t uid)
@@ -405,15 +405,14 @@ quota_processor (void *cls, const GNUNET_HashCode * key, uint32_t size,
 
   if (NULL == key)
     return GNUNET_SYSERR;
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Deleting %llu bytes of low-priority (%u) content `%s' of type %u at %llu ms prior to expiration (still trying to free another %llu bytes)\n",
+              "Deleting %llu bytes of low-priority (%u) content `%s' of type %u at %s prior to expiration (still trying to free another %llu bytes)\n",
               (unsigned long long) (size + GNUNET_DATASTORE_ENTRY_OVERHEAD),
              (unsigned int) priority,
-              GNUNET_h2s (key), type, 
-             (unsigned long long) GNUNET_TIME_absolute_get_remaining (expiration).rel_value,
+              GNUNET_h2s (key), type,
+             GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_remaining (expiration),
+                                                     GNUNET_YES),
              *need);
-#endif
   if (size + GNUNET_DATASTORE_ENTRY_OVERHEAD > *need)
     *need = 0;
   else
@@ -447,10 +446,8 @@ manage_space (unsigned long long need)
 {
   unsigned long long last;
 
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Asked to free up %llu bytes of cache space\n", need);
-#endif
   last = 0;
   while ((need > 0) && (last != need))
   {
@@ -513,10 +510,8 @@ transmit (struct GNUNET_SERVER_Client *client, struct GNUNET_MessageHeader *msg)
 
   if (GNUNET_YES == cleaning_done)
   {
-#if DEBUG_DATASTORE
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                "Shutdown in progress, aborting transmission.\n");
-#endif
+                _("Shutdown in progress, aborting transmission.\n"));
     GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
     GNUNET_free (msg);
     return;
@@ -554,11 +549,9 @@ transmit_status (struct GNUNET_SERVER_Client *client, int code, const char *msg)
   struct StatusMessage *sm;
   size_t slen;
 
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Transmitting `%s' message with value %d and message `%s'\n",
               "STATUS", code, msg != NULL ? msg : "(none)");
-#endif
   slen = (msg == NULL) ? 0 : strlen (msg) + 1;
   sm = GNUNET_malloc (sizeof (struct StatusMessage) + slen);
   sm->header.size = htons (sizeof (struct StatusMessage) + slen);
@@ -591,7 +584,7 @@ transmit_status (struct GNUNET_SERVER_Client *client, int code, const char *msg)
  *         GNUNET_NO to delete the item and continue (if supported)
  */
 static int
-transmit_item (void *cls, const GNUNET_HashCode * key, uint32_t size,
+transmit_item (void *cls, const struct GNUNET_HashCode * key, uint32_t size,
                const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority,
                uint32_t anonymity, struct GNUNET_TIME_Absolute expiration,
                uint64_t uid)
@@ -603,10 +596,8 @@ transmit_item (void *cls, const GNUNET_HashCode * key, uint32_t size,
   if (key == NULL)
   {
     /* transmit 'DATA_END' */
-#if DEBUG_DATASTORE
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmitting `%s' message\n",
                 "DATA_END");
-#endif
     end = GNUNET_malloc (sizeof (struct GNUNET_MessageHeader));
     end->size = htons (sizeof (struct GNUNET_MessageHeader));
     end->type = htons (GNUNET_MESSAGE_TYPE_DATASTORE_DATA_END);
@@ -630,13 +621,12 @@ transmit_item (void *cls, const GNUNET_HashCode * key, uint32_t size,
   dm->uid = GNUNET_htonll (uid);
   dm->key = *key;
   memcpy (&dm[1], data, size);
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Transmitting `%s' message for `%s' of type %u with expiration %llu (now: %llu)\n",
+              "Transmitting `%s' message for `%s' of type %u with expiration %s (in: %s)\n",
               "DATA", GNUNET_h2s (key), type,
-              (unsigned long long) expiration.abs_value,
-              (unsigned long long) GNUNET_TIME_absolute_get ().abs_value);
-#endif
+              GNUNET_STRINGS_absolute_time_to_string (expiration),
+              GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_remaining (expiration),
+                                                     GNUNET_YES));
   GNUNET_STATISTICS_update (stats, gettext_noop ("# results found"), 1,
                             GNUNET_NO);
   transmit (client, &dm->header);
@@ -668,9 +658,7 @@ handle_reserve (void *cls, struct GNUNET_SERVER_Client *client,
   uint64_t amount;
   uint32_t entries;
 
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing `%s' request\n", "RESERVE");
-#endif
   amount = GNUNET_ntohll (msg->amount);
   entries = ntohl (msg->entries);
   used = payload + reserved;
@@ -742,10 +730,8 @@ handle_release_reserve (void *cls, struct GNUNET_SERVER_Client *client,
   int rid = ntohl (msg->rid);
   unsigned long long rem;
 
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing `%s' request\n",
               "RELEASE_RESERVE");
-#endif
   next = reservations;
   prev = NULL;
   while (NULL != (pos = next))
@@ -764,11 +750,9 @@ handle_release_reserve (void *cls, struct GNUNET_SERVER_Client *client,
       reserved -= rem;
       GNUNET_STATISTICS_set (stats, gettext_noop ("# reserved"), reserved,
                              GNUNET_NO);
-#if DEBUG_DATASTORE
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Returning %llu remaining reserved bytes to storage pool\n",
                   rem);
-#endif
       GNUNET_free (pos);
       transmit_status (client, GNUNET_OK, NULL);
       return;
@@ -854,11 +838,9 @@ execute_put (struct GNUNET_SERVER_Client *client, const struct DataMessage *dm)
     GNUNET_STATISTICS_update (stats, gettext_noop ("# bytes stored"), size,
                               GNUNET_YES);
     GNUNET_CONTAINER_bloomfilter_add (filter, &dm->key);
-#if DEBUG_DATASTORE
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Successfully stored %u bytes of type %u under key `%s'\n",
                 size, ntohl (dm->type), GNUNET_h2s (&dm->key));
-#endif
   }
   transmit_status (client, ret, msg);
   GNUNET_free_non_null (msg);
@@ -893,7 +875,7 @@ execute_put (struct GNUNET_SERVER_Client *client, const struct DataMessage *dm)
  *         GNUNET_NO to delete the item
  */
 static int
-check_present (void *cls, const GNUNET_HashCode * key, uint32_t size,
+check_present (void *cls, const struct GNUNET_HashCode * key, uint32_t size,
                const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority,
                uint32_t anonymity, struct GNUNET_TIME_Absolute expiration,
                uint64_t uid)
@@ -914,14 +896,12 @@ check_present (void *cls, const GNUNET_HashCode * key, uint32_t size,
                                                 (0 ==
                                                  memcmp (&dm[1], data, size))))
   {
-#if DEBUG_MYSQL
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Result already present in datastore\n");
-#endif
     /* FIXME: change API to allow increasing 'replication' counter */
     if ((ntohl (dm->priority) > 0) ||
-        (GNUNET_TIME_absolute_ntoh (dm->expiration).abs_value >
-         expiration.abs_value))
+        (GNUNET_TIME_absolute_ntoh (dm->expiration).abs_value_us >
+         expiration.abs_value_us))
       plugin->api->update (plugin->api->cls, uid,
                            (int32_t) ntohl (dm->priority),
                            GNUNET_TIME_absolute_ntoh (dm->expiration), NULL);
@@ -954,7 +934,7 @@ handle_put (void *cls, struct GNUNET_SERVER_Client *client,
   int rid;
   struct ReservationList *pos;
   struct PutContext *pc;
-  GNUNET_HashCode vhash;
+  struct GNUNET_HashCode vhash;
   uint32_t size;
 
   if ((dm == NULL) || (ntohl (dm->type) == 0))
@@ -963,11 +943,9 @@ handle_put (void *cls, struct GNUNET_SERVER_Client *client,
     GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
     return;
   }
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Processing `%s' request for `%s' of type %u\n", "PUT",
               GNUNET_h2s (&dm->key), ntohl (dm->type));
-#endif
   rid = ntohl (dm->rid);
   size = ntohl (dm->size);
   if (rid > 0)
@@ -1019,18 +997,16 @@ handle_get (void *cls, struct GNUNET_SERVER_Client *client,
 
   size = ntohs (message->size);
   if ((size != sizeof (struct GetMessage)) &&
-      (size != sizeof (struct GetMessage) - sizeof (GNUNET_HashCode)))
+      (size != sizeof (struct GetMessage) - sizeof (struct GNUNET_HashCode)))
   {
     GNUNET_break (0);
     GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
     return;
   }
   msg = (const struct GetMessage *) message;
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Processing `%s' request for `%s' of type %u\n", "GET",
               GNUNET_h2s (&msg->key), ntohl (msg->type));
-#endif
   GNUNET_STATISTICS_update (stats, gettext_noop ("# GET requests received"), 1,
                             GNUNET_NO);
   GNUNET_SERVER_client_keep (client);
@@ -1038,11 +1014,9 @@ handle_get (void *cls, struct GNUNET_SERVER_Client *client,
       (GNUNET_YES != GNUNET_CONTAINER_bloomfilter_test (filter, &msg->key)))
   {
     /* don't bother database... */
-#if DEBUG_DATASTORE
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Empty result set for `%s' request for `%s' (bloomfilter).\n",
                 "GET", GNUNET_h2s (&msg->key));
-#endif
     GNUNET_STATISTICS_update (stats,
                               gettext_noop
                               ("# requests filtered by bloomfilter"), 1,
@@ -1077,10 +1051,8 @@ handle_update (void *cls, struct GNUNET_SERVER_Client *client,
                             1, GNUNET_NO);
   msg = (const struct UpdateMessage *) message;
   emsg = NULL;
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing `%s' request for %llu\n",
               "UPDATE", (unsigned long long) GNUNET_ntohll (msg->uid));
-#endif
   ret =
       plugin->api->update (plugin->api->cls, GNUNET_ntohll (msg->uid),
                            (int32_t) ntohl (msg->priority),
@@ -1101,10 +1073,8 @@ static void
 handle_get_replication (void *cls, struct GNUNET_SERVER_Client *client,
                         const struct GNUNET_MessageHeader *message)
 {
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing `%s' request\n",
               "GET_REPLICATION");
-#endif
   GNUNET_STATISTICS_update (stats,
                             gettext_noop
                             ("# GET REPLICATION requests received"), 1,
@@ -1136,10 +1106,8 @@ handle_get_zero_anonymity (void *cls, struct GNUNET_SERVER_Client *client,
     GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
     return;
   }
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing `%s' request\n",
               "GET_ZERO_ANONYMITY");
-#endif
   GNUNET_STATISTICS_update (stats,
                             gettext_noop
                             ("# GET ZERO ANONYMITY requests received"), 1,
@@ -1156,7 +1124,7 @@ handle_get_zero_anonymity (void *cls, struct GNUNET_SERVER_Client *client,
  * in to be deleted (by returning GNUNET_NO).
  */
 static int
-remove_callback (void *cls, const GNUNET_HashCode * key, uint32_t size,
+remove_callback (void *cls, const struct GNUNET_HashCode * key, uint32_t size,
                  const void *data, enum GNUNET_BLOCK_Type type,
                  uint32_t priority, uint32_t anonymity,
                  struct GNUNET_TIME_Absolute expiration, uint64_t uid)
@@ -1165,19 +1133,15 @@ remove_callback (void *cls, const GNUNET_HashCode * key, uint32_t size,
 
   if (key == NULL)
   {
-#if DEBUG_DATASTORE
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "No further matches for `%s' request.\n", "REMOVE");
-#endif
     transmit_status (client, GNUNET_NO, _("Content not found"));
     GNUNET_SERVER_client_drop (client);
     return GNUNET_OK;           /* last item */
   }
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Item %llu matches `%s' request for key `%s' and type %u.\n",
               (unsigned long long) uid, "REMOVE", GNUNET_h2s (key), type);
-#endif
   GNUNET_STATISTICS_update (stats,
                             gettext_noop ("# bytes removed (explicit request)"),
                             size, GNUNET_YES);
@@ -1200,7 +1164,7 @@ handle_remove (void *cls, struct GNUNET_SERVER_Client *client,
                const struct GNUNET_MessageHeader *message)
 {
   const struct DataMessage *dm = check_data (message);
-  GNUNET_HashCode vhash;
+  struct GNUNET_HashCode vhash;
 
   if (dm == NULL)
   {
@@ -1208,11 +1172,9 @@ handle_remove (void *cls, struct GNUNET_SERVER_Client *client,
     GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
     return;
   }
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Processing `%s' request for `%s' of type %u\n", "REMOVE",
               GNUNET_h2s (&dm->key), ntohl (dm->type));
-#endif
   GNUNET_STATISTICS_update (stats, gettext_noop ("# REMOVE requests received"),
                             1, GNUNET_NO);
   GNUNET_SERVER_client_keep (client);
@@ -1234,9 +1196,7 @@ static void
 handle_drop (void *cls, struct GNUNET_SERVER_Client *client,
              const struct GNUNET_MessageHeader *message)
 {
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing `%s' request\n", "DROP");
-#endif
   do_drop = GNUNET_YES;
   GNUNET_SERVER_receive_done (client, GNUNET_OK);
 }
@@ -1287,11 +1247,9 @@ process_stat_in (void *cls, const char *subsystem, const char *name,
   GNUNET_assert (stats_worked == GNUNET_NO);
   stats_worked = GNUNET_YES;
   payload += value;
-#if DEBUG_SQLITE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Notification from statistics about existing payload (%llu), new payload is %llu\n",
-              abs_value, payload);
-#endif
+              value, payload);
   return GNUNET_OK;
 }
 
@@ -1348,10 +1306,8 @@ load_plugin ()
 static void
 unload_plugin (struct DatastorePlugin *plug)
 {
-#if DEBUG_DATASTORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Datastore service is unloading plugin...\n");
-#endif
   GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
   GNUNET_free (plug->lib_name);
   GNUNET_free (plug->short_name);
@@ -1476,7 +1432,7 @@ cleanup_reservations (void *cls, struct GNUNET_SERVER_Client *client)
  */
 static void
 add_key_to_bloomfilter (void *cls,
-                       const GNUNET_HashCode *key,
+                       const struct GNUNET_HashCode *key,
                        unsigned int count)
 {
   struct GNUNET_CONTAINER_BloomFilter *bf = cls;
@@ -1517,7 +1473,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
      sizeof (struct GNUNET_MessageHeader)},
     {NULL, NULL, 0, 0}
   };
-  char *fn;  
+  char *fn;
   char *pfn;
   unsigned int bf_size;
   int refresh_bf;
@@ -1548,7 +1504,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
   cache_size = quota / 8;       /* Or should we make this an option? */
   GNUNET_STATISTICS_set (stats, gettext_noop ("# cache size"), cache_size,
                          GNUNET_NO);
-  if (quota / (32 * 1024LL) > (1 << 31)) 
+  if (quota / (32 * 1024LL) > (1 << 31))
     bf_size = (1 << 31);          /* absolute limit: ~2 GB, beyond that BF just won't help anyway */
   else
     bf_size = quota / (32 * 1024LL);         /* 8 bit per entry, 1 bit per 32 kb in DB */
@@ -1597,7 +1553,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
                        pfn);
            GNUNET_free (pfn);
            pfn = NULL;
-           filter = GNUNET_CONTAINER_bloomfilter_load (NULL, bf_size, 5);        /* approx. 3% false positives at max use */
+           filter = GNUNET_CONTAINER_bloomfilter_init (NULL, bf_size, 5);        /* approx. 3% false positives at max use */
          }
        }
       }
@@ -1654,7 +1610,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                _("Rebuilding bloomfilter.  Please be patient.\n"));
     if (NULL != plugin->api->get_keys)
-      plugin->api->get_keys (plugin->api->cls, &add_key_to_bloomfilter, filter);  
+      plugin->api->get_keys (plugin->api->cls, &add_key_to_bloomfilter, filter);
     else
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                  _("Plugin does not support get_keys function. Please fix!\n"));