gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r3334 - GNUnet/src/applications/sqstore_sqlite


From: grothoff
Subject: [GNUnet-SVN] r3334 - GNUnet/src/applications/sqstore_sqlite
Date: Sun, 27 Aug 2006 14:04:21 -0700 (PDT)

Author: grothoff
Date: 2006-08-27 14:04:19 -0700 (Sun, 27 Aug 2006)
New Revision: 3334

Modified:
   GNUnet/src/applications/sqstore_sqlite/sqlite.c
Log:
fixing deadlock

Modified: GNUnet/src/applications/sqstore_sqlite/sqlite.c
===================================================================
--- GNUnet/src/applications/sqstore_sqlite/sqlite.c     2006-08-27 20:51:49 UTC 
(rev 3333)
+++ GNUnet/src/applications/sqstore_sqlite/sqlite.c     2006-08-27 21:04:19 UTC 
(rev 3334)
@@ -42,14 +42,14 @@
  * a failure of the command 'cmd' with the message given
  * by strerror(errno).
  */
-#define DIE_SQLITE(cmd) do { GE_LOG(ectx, GE_FATAL | GE_IMMEDIATE | GE_ADMIN, 
_("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, 
sqlite3_errmsg(getDBHandle()->dbh)); abort(); } while(0);
+#define DIE_SQLITE(db, cmd) do { GE_LOG(ectx, GE_FATAL | GE_IMMEDIATE | 
GE_ADMIN, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, 
sqlite3_errmsg(db->dbh)); abort(); } while(0);
 
 /**
  * Log an error message at log-level 'level' that indicates
  * a failure of the command 'cmd' on file 'filename'
  * with the message given by strerror(errno).
  */
-#define LOG_SQLITE(level, cmd) do { GE_LOG(ectx, level, _("`%s' failed at 
%s:%d with error: %s\n"), cmd, __FILE__, __LINE__, 
sqlite3_errmsg(getDBHandle()->dbh)); } while(0);
+#define LOG_SQLITE(db, level, cmd) do { GE_LOG(ectx, level, _("`%s' failed at 
%s:%d with error: %s\n"), cmd, __FILE__, __LINE__, sqlite3_errmsg(db->dbh)); } 
while(0);
 
 static Stats_ServiceAPI * stats;
 
@@ -196,7 +196,8 @@
                     "  hash TEXT NOT NULL DEFAULT '',"
                     "  value BLOB NOT NULL DEFAULT '')", NULL, NULL,
                     NULL) != SQLITE_OK) {
-      LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
+      LOG_SQLITE(ret,
+                GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
                 "sqlite_create");
       sqlite3_finalize(stmt);
       FREE(ret);
@@ -221,7 +222,8 @@
                   "anonLevel, expire, hash, value) VALUES "
                   "(?, ?, ?, ?, ?, ?, ?)",
                   &ret->insertContent) != SQLITE_OK) ) {
-    LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
+    LOG_SQLITE(ret,
+              GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
               "precompiling");
     if (ret->countContent != NULL)
       sqlite3_finalize(ret->countContent);
@@ -288,7 +290,8 @@
  * Given a full row from gn070 table 
(size,type,prio,anonLevel,expire,hash,value),
  * assemble it into a Datastore_Datum representation.
  */
-static Datastore_Datum * assembleDatum(sqlite3_stmt *stmt) {
+static Datastore_Datum * assembleDatum(sqliteHandle * handle,
+                                      sqlite3_stmt *stmt) {
   Datastore_Datum * datum;
   Datastore_Value * value;
   int contentSize;
@@ -296,7 +299,7 @@
 
   contentSize = sqlite3_column_int(stmt, 0) - sizeof(Datastore_Value);
 
-  dbh = getDBHandle()->dbh;
+  dbh = handle->dbh;
   if (contentSize < 0) {
     sqlite3_stmt * stmt;
 
@@ -311,7 +314,8 @@
       sqlite3_step(stmt);
       sqlite3_finalize(stmt);
     } else
-      LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sq_prepare");
+      LOG_SQLITE(handle,
+                GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sq_prepare");
     return NULL; /* error */
   }
 
@@ -334,7 +338,9 @@
       sqlite3_step(stmt);
       sqlite3_finalize(stmt);
     } else
-      LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sq_prepare");
+      LOG_SQLITE(handle,
+                GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, 
+                "sq_prepare");
 
     return NULL;
   }
@@ -361,12 +367,13 @@
  * @param key kind of stat to retrieve
  * @return SYSERR on error, the value otherwise
  */
-static double getStat(const char * key) {
+static double getStat(sqliteHandle * handle,
+                     const char * key) {
   int i;
   sqlite3_stmt *stmt;
   double ret = SYSERR;
 
-  i = sq_prepare(getDBHandle()->dbh,
+  i = sq_prepare(handle->dbh,
                 "SELECT anonLevel FROM gn070 WHERE hash = ?",
                 &stmt);
   if (i == SQLITE_OK) {
@@ -389,7 +396,8 @@
   sqlite3_finalize(stmt);
 
   if (i != SQLITE_OK) {
-    LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
+    LOG_SQLITE(handle,
+              GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
               "sqlite_getStat");
     return SYSERR;
   }
@@ -403,12 +411,13 @@
  * @param val value to set
  * @return SYSERR on error, OK otherwise
  */
-static int setStat(const char *key,
+static int setStat(sqliteHandle * handle,
+                  const char *key,
                   double val) {
   sqlite3_stmt *stmt;
   sqlite3 * dbh;
 
-  dbh = getDBHandle()->dbh;
+  dbh = handle->dbh;
   if (sq_prepare(dbh,
                 "DELETE FROM gn070 where hash = ?", &stmt) == SQLITE_OK) {
     sqlite3_bind_text(stmt,
@@ -435,7 +444,8 @@
                     3,
                     RESERVED_BLOCK);
     if (sqlite3_step(stmt) != SQLITE_DONE) {
-      LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
+      LOG_SQLITE(handle,
+                GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
                 "sqlite_setStat");
       sqlite3_finalize(stmt);
       return SYSERR;
@@ -450,8 +460,9 @@
 /**
  * @brief write all statistics to the db
  */
-static void syncStats() {
-  setStat("PAYLOAD",
+static void syncStats(sqliteHandle * handle) {
+  setStat(handle,
+         "PAYLOAD",
          db->payload);
   db->lastSync = 0;
 }
@@ -479,8 +490,10 @@
   unsigned long long lastExp;
   HashCode512 key;
   sqlite3 * dbh;
+  sqliteHandle * handle;
 
-  dbh = getDBHandle()->dbh;
+  handle = getDBHandle();
+  dbh = handle->dbh;
   MUTEX_LOCK(db->DATABASE_Lock_);
 
   /* For the rowid trick see
@@ -512,7 +525,9 @@
   if (sq_prepare(dbh,
                 scratch,
                 &stmt) != SQLITE_OK) {
-    LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite3_prepare");
+    LOG_SQLITE(handle,
+              GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, 
+              "sqlite3_prepare");
     MUTEX_UNLOCK(db->DATABASE_Lock_);
     return SYSERR;
   }
@@ -559,7 +574,8 @@
                       7,
                       type);
     if (sqlite3_step(stmt) == SQLITE_ROW) {
-      datum = assembleDatum(stmt);
+      datum = assembleDatum(handle,
+                           stmt);
       sqlite3_reset(stmt);
 
       if (datum == NULL) 
@@ -638,14 +654,15 @@
   unsigned int idx;
   
 #if DEBUG_SQLITE
-  GE_LOG(ectx, 
+  GE_LOG(getDBHandle(),
+        ectx, 
         GE_DEBUG | GE_REQUEST | GE_USER, 
         "SQLite: closing database\n");
 #endif
   if (! db)
     return;
 
-  syncStats();
+  syncStats(getDBHandle());
 
   for (idx = 0; idx < db->handle_count; idx++) {
     sqliteHandle * h = db->handles[idx];
@@ -656,7 +673,8 @@
     sqlite3_finalize(h->updPrio);
     sqlite3_finalize(h->insertContent);
     if (sqlite3_close(h->dbh) != SQLITE_OK)
-      LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
+      LOG_SQLITE(h,
+                GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
                 "sqlite_close");
     FREE(h);
   }
@@ -702,17 +720,21 @@
   int bind = 1;
   Datastore_Datum *datum;
   sqlite3 * dbh;
-
+  sqliteHandle * handle;
 #if DEBUG_SQLITE
   EncName enc;
-  IF_GELOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER,
-       hash2enc(key,
-                &enc));
-  GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER,
+
+  IF_GELOG(ectx, 
+          GE_DEBUG | GE_REQUEST | GE_USER,
+          hash2enc(key,
+                   &enc));
+  GE_LOG(ectx,
+        GE_DEBUG | GE_REQUEST | GE_USER,
       "SQLite: retrieving content `%s'\n",
       &enc);
 #endif
-  dbh = getDBHandle()->dbh;
+  handle = getDBHandle();
+  dbh = handle->dbh;
   MUTEX_LOCK(db->DATABASE_Lock_);
 
   strcpy(scratch, "SELECT ");
@@ -736,7 +758,9 @@
   if (sq_prepare(dbh,
                 scratch,
                 &stmt) != SQLITE_OK) {
-    LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite_query");
+    LOG_SQLITE(handle,
+              GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
+              "sqlite_query");
     MUTEX_UNLOCK(db->DATABASE_Lock_);
     return SYSERR;
   }
@@ -759,15 +783,17 @@
   if (ret == SQLITE_OK) {
     while ((ret = sqlite3_step(stmt)) == SQLITE_ROW) {
       if (iter != NULL) {
-       datum = assembleDatum(stmt);
+       datum = assembleDatum(handle,
+                             stmt);
        
        if (datum == NULL) 
          continue;
 
 #if DEBUG_SQLITE
-       GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER,
-           "Found in database block with type %u.\n",
-           ntohl(*(int*)&((&datum->value)[1])));
+       GE_LOG(ectx, 
+              GE_DEBUG | GE_REQUEST | GE_USER,
+              "Found in database block with type %u.\n",
+              ntohl(*(int*)&((&datum->value)[1])));
 #endif
        if (SYSERR == iter(&datum->key,
                           &datum->value,
@@ -784,7 +810,9 @@
        count += sqlite3_column_int(stmt, 0);
     }
     if (ret != SQLITE_DONE) {
-      LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite_query");
+      LOG_SQLITE(handle,
+                GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
+                "sqlite_query");
       sqlite3_finalize(stmt);
       MUTEX_UNLOCK(db->DATABASE_Lock_);
       return SYSERR;
@@ -792,12 +820,16 @@
 
     sqlite3_finalize(stmt);
   } else
-    LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite_query");
+    LOG_SQLITE(handle,
+              GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, 
+              "sqlite_query");
 
   MUTEX_UNLOCK(db->DATABASE_Lock_);
 
 #if DEBUG_SQLITE
-  GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER, "SQLite: done reading 
content\n");
+  GE_LOG(ectx,
+        GE_DEBUG | GE_REQUEST | GE_USER, 
+        "SQLite: done reading content\n");
 #endif
 
   return count;
@@ -821,14 +853,16 @@
 #if DEBUG_SQLITE
   EncName enc;
 
-  IF_GELOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER,
-       hash2enc(key,
-                &enc));
-  GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER,
-      "Storing in database block with type %u, key `%s' and priority %u.\n",
-      ntohl(*(int*)&value[1]),
-      &enc,
-      ntohl(value->prio));
+  IF_GELOG(ectx,
+          GE_DEBUG | GE_REQUEST | GE_USER,
+          hash2enc(key,
+                   &enc));
+  GE_LOG(ectx, G
+        E_DEBUG | GE_REQUEST | GE_USER,
+        "Storing in database block with type %u, key `%s' and priority %u.\n",
+        ntohl(*(int*)&value[1]),
+        &enc,
+        ntohl(value->prio));
 #endif
 
   if ( (ntohl(value->size) < sizeof(Datastore_Value)) ) {
@@ -836,12 +870,12 @@
     return SYSERR;
   }
 
+  dbh = getDBHandle();
   MUTEX_LOCK(db->DATABASE_Lock_);
 
   if (db->lastSync > 1000)
-    syncStats();
+    syncStats(dbh);
 
-  dbh = getDBHandle();
 
   rowLen = 0;
   contentSize = ntohl(value->size)-sizeof(Datastore_Value);
@@ -864,7 +898,8 @@
   n = sqlite3_step(stmt);
   sqlite3_reset(stmt);
   if (n != SQLITE_DONE) {
-    LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
+    LOG_SQLITE(dbh,
+              GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
               "sqlite_query");
     MUTEX_UNLOCK(db->DATABASE_Lock_);
     return SYSERR;
@@ -876,8 +911,9 @@
   MUTEX_UNLOCK(db->DATABASE_Lock_);
 
 #if DEBUG_SQLITE
-  GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER,
-      "SQLite: done writing content\n");
+  GE_LOG(ectx, 
+        GE_DEBUG | GE_REQUEST | GE_USER,
+        "SQLite: done writing content\n");
 #endif
 
   return OK;
@@ -909,12 +945,10 @@
       &enc);
 #endif
 
+  dbh = getDBHandle();
   MUTEX_LOCK(db->DATABASE_Lock_);
-
-  dbh = getDBHandle();
-
   if (db->lastSync > 1000)
-    syncStats();
+    syncStats(dbh);
 
   if (!value) {
     sqlite3_bind_blob(dbh->exists,
@@ -982,14 +1016,18 @@
          - getIntSize(size) - getIntSize(type) - getIntSize(prio)
          - getIntSize(anon) - getIntSize(expir) - 7 - 245 - 1;
     } else {
-      LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite3_prepare");
+      LOG_SQLITE(dbh,
+                GE_ERROR | GE_ADMIN | GE_USER | GE_BULK,
+                "sqlite3_prepare");
     }
   }
   deleted = ( (n == SQLITE_DONE) || (n == SQLITE_ROW) ) ? 
sqlite3_changes(dbh->dbh) : SYSERR;
   sqlite3_finalize(stmt);
 
   if(n != SQLITE_DONE) {
-    LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite_query");
+    LOG_SQLITE(dbh,
+              GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, 
+              "sqlite_query");
     MUTEX_UNLOCK(db->DATABASE_Lock_);
     return SYSERR;
   }
@@ -997,9 +1035,10 @@
   MUTEX_UNLOCK(db->DATABASE_Lock_);
 
 #if DEBUG_SQLITE
-  GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER,
-      "SQLite: %d block(s) deleted\n",
-      deleted);
+  GE_LOG(ectx, 
+        GE_DEBUG | GE_REQUEST | GE_USER,
+        "SQLite: %d block(s) deleted\n",
+        deleted);
 #endif
 
   return deleted;
@@ -1026,8 +1065,8 @@
       &enc);
 #endif
 
+  dbh = getDBHandle();
   MUTEX_LOCK(db->DATABASE_Lock_);
-  dbh = getDBHandle();
   contentSize = ntohl(value->size)-sizeof(Datastore_Value);
   sqlite3_bind_int(dbh->updPrio,
                   1,
@@ -1055,8 +1094,9 @@
   MUTEX_UNLOCK(db->DATABASE_Lock_);
 
 #if DEBUG_SQLITE
-  GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER,
-      "SQLite: block updated\n");
+  GE_LOG(ectx, 
+        GE_DEBUG | GE_REQUEST | GE_USER,
+        "SQLite: block updated\n");
 #endif
 
   return n == SQLITE_OK ? OK : SYSERR;
@@ -1072,8 +1112,9 @@
 
   ectx = capi->ectx;
 #if DEBUG_SQLITE
-  GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER,
-      "SQLite: initializing database\n");
+  GE_LOG(ectx, 
+        GE_DEBUG | GE_REQUEST | GE_USER,
+        "SQLite: initializing database\n");
 #endif
 
   db = MALLOC(sizeof(sqliteDatabase));
@@ -1118,9 +1159,11 @@
     return NULL;    
   }
 
-  db->payload = getStat("PAYLOAD");
+  db->payload = getStat(dbh, "PAYLOAD");
   if (db->payload == SYSERR) {
-    LOG_SQLITE(GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite_payload");
+    LOG_SQLITE(dbh,
+              GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, 
+              "sqlite_payload");
     MUTEX_DESTROY(db->DATABASE_Lock_);
     FREE(db->fn);
     FREE(db);
@@ -1152,8 +1195,9 @@
     coreAPI->releaseService(stats);
   sqlite_shutdown();
 #if DEBUG_SQLITE
-  GE_LOG(ectx, GE_DEBUG | GE_REQUEST | GE_USER,
-      "SQLite: database shutdown\n");
+  GE_LOG(ectx, 
+        GE_DEBUG | GE_REQUEST | GE_USER,
+        "SQLite: database shutdown\n");
 #endif
   coreAPI = NULL;
 }





reply via email to

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