[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r5345 - GNUnet/src/applications/sqstore_sqlite
From: |
gnunet |
Subject: |
[GNUnet-SVN] r5345 - GNUnet/src/applications/sqstore_sqlite |
Date: |
Sun, 22 Jul 2007 18:25:30 -0600 (MDT) |
Author: grothoff
Date: 2007-07-22 18:25:29 -0600 (Sun, 22 Jul 2007)
New Revision: 5345
Modified:
GNUnet/src/applications/sqstore_sqlite/sqlite.c
Log:
use locking
Modified: GNUnet/src/applications/sqstore_sqlite/sqlite.c
===================================================================
--- GNUnet/src/applications/sqstore_sqlite/sqlite.c 2007-07-23 00:01:30 UTC
(rev 5344)
+++ GNUnet/src/applications/sqstore_sqlite/sqlite.c 2007-07-23 00:25:29 UTC
(rev 5345)
@@ -65,14 +65,6 @@
*/
#define BUSY_TIMEOUT_MS 250
-static Stats_ServiceAPI *stats;
-
-static CoreAPIForApplication *coreAPI;
-
-static unsigned int stat_size;
-
-static struct GE_Context *ectx;
-
/**
* @brief Wrapper for SQLite
*/
@@ -101,39 +93,26 @@
sqlite3_stmt *insertContent;
} sqliteHandle;
-/**
- * @brief Information about the database
- */
-typedef struct
-{
+static Stats_ServiceAPI *stats;
- struct MUTEX *DATABASE_Lock_;
- /**
- * filename of this bucket
- */
- char *fn;
+static CoreAPIForApplication *coreAPI;
- /**
- * bytes used
- */
- unsigned long long payload;
+static unsigned int stat_size;
- unsigned int lastSync;
+static struct GE_Context *ectx;
- /**
- * Open handles
- */
- unsigned int handle_count;
+static struct MUTEX * lock;
- /**
- * List of open handles
- */
- sqliteHandle **handles;
+static char * fn;
-} sqliteDatabase;
+static unsigned long long payload;
-static sqliteDatabase *db;
+static unsigned int lastSync;
+static unsigned int handle_count;
+
+static sqliteHandle **handles;
+
/**
* @brief Prepare a SQL statement
*/
@@ -200,14 +179,14 @@
#endif
/* Is the DB already open? */
- for (idx = 0; idx < db->handle_count; idx++)
- if (PTHREAD_TEST_SELF (db->handles[idx]->tid))
- return db->handles[idx];
+ for (idx = 0; idx < handle_count; idx++)
+ if (PTHREAD_TEST_SELF (handles[idx]->tid))
+ return handles[idx];
/* we haven't opened the DB for this thread yet */
ret = MALLOC (sizeof (sqliteHandle));
/* Open database and precompile statements */
- if (sqlite3_open (db->fn, &ret->dbh) != SQLITE_OK)
+ if (sqlite3_open (fn, &ret->dbh) != SQLITE_OK)
{
GE_LOG (ectx,
GE_ERROR | GE_BULK | GE_USER,
@@ -293,10 +272,7 @@
return NULL;
}
ret->tid = PTHREAD_GET_SELF ();
-
- MUTEX_LOCK (db->DATABASE_Lock_);
- APPEND (db->handles, db->handle_count, ret);
- MUTEX_UNLOCK (db->DATABASE_Lock_);
+ APPEND (handles, handle_count, ret);
return ret;
}
@@ -354,11 +330,11 @@
{
double ret;
- MUTEX_LOCK (db->DATABASE_Lock_);
- ret = db->payload;
+ MUTEX_LOCK (lock);
+ ret = payload;
if (stats)
stats->set (stat_size, ret);
- MUTEX_UNLOCK (db->DATABASE_Lock_);
+ MUTEX_UNLOCK (lock);
return (unsigned long long) (ret * 1.13);
/* benchmarking shows 13% overhead */
}
@@ -554,8 +530,8 @@
static void
syncStats (sqliteHandle * handle)
{
- setStat (handle, "PAYLOAD", db->payload);
- db->lastSync = 0;
+ setStat (handle, "PAYLOAD", payload);
+ lastSync = 0;
}
/**
@@ -591,6 +567,7 @@
cron_t now;
unsigned long long rowid;
+ MUTEX_LOCK (lock);
handle = getDBHandle ();
dbh = handle->dbh;
/* For the rowid trick see
@@ -656,6 +633,7 @@
{
LOG_SQLITE (handle,
GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite3_prepare");
+ MUTEX_UNLOCK (lock);
return SYSERR;
}
count = 0;
@@ -715,8 +693,10 @@
{
count++;
if (iter != NULL)
- {
- ret = iter (&key, datum, closure, rowid);
+ {
+ MUTEX_UNLOCK (lock);
+ ret = iter (&key, datum, closure, rowid);
+ MUTEX_LOCK (lock);
if (ret == SYSERR)
{
FREE (datum);
@@ -725,9 +705,7 @@
}
if (ret == NO)
{
- MUTEX_LOCK (db->DATABASE_Lock_);
- db->payload -= getContentDatastoreSize (datum);
- MUTEX_UNLOCK (db->DATABASE_Lock_);
+ payload -= getContentDatastoreSize (datum);
delete_by_rowid (handle, rowid);
}
}
@@ -751,6 +729,7 @@
}
}
sqlite3_finalize (stmt);
+ MUTEX_UNLOCK (lock);
return count;
}
@@ -834,12 +813,13 @@
sqlite3 *dbh;
sqliteHandle *handle;
int ret;
- unsigned long long payload;
+ unsigned long long newpayload;
unsigned long long rowid;
unsigned long long last_rowid;
HashCode512 key;
- payload = 0;
+ newpayload = 0;
+ MUTEX_LOCK (lock);
handle = getDBHandle ();
dbh = handle->dbh;
/* For the rowid trick see
@@ -851,6 +831,7 @@
{
LOG_SQLITE (handle,
GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite3_prepare");
+ MUTEX_UNLOCK (lock);
return SYSERR;
}
count = 0;
@@ -867,10 +848,12 @@
sqlite3_reset (stmt);
if (datum == NULL)
continue;
- payload += getContentDatastoreSize (datum);
- if (iter != NULL)
+ newpayload += getContentDatastoreSize (datum);
+ if (iter != NULL) {
+ MUTEX_UNLOCK (lock);
ret = iter (&key, datum, closure, rowid);
- else
+ MUTEX_LOCK (lock);
+ } else
ret = OK;
if (ret == SYSERR)
{
@@ -880,7 +863,7 @@
}
if (ret == NO)
{
- payload -= getContentDatastoreSize (datum);
+ newpayload -= getContentDatastoreSize (datum);
delete_by_rowid (handle, rowid);
}
FREE (datum);
@@ -894,10 +877,11 @@
GE_LOG (ectx,
GE_INFO | GE_IMMEDIATE | GE_USER | GE_ADMIN,
"SQLite database size recomputed. New estimate is %llu, old
estimate was %llu\n",
- payload, db->payload);
- db->payload = payload;
+ newpayload, payload);
+ payload = newpayload;
syncStats (handle);
}
+ MUTEX_UNLOCK (lock);
return count;
}
@@ -913,14 +897,11 @@
GE_LOG (ectx,
GE_DEBUG | GE_REQUEST | GE_USER, "SQLite: closing database\n");
#endif
- if (!db)
- return;
-
syncStats (getDBHandle ());
- for (idx = 0; idx < db->handle_count; idx++)
+ for (idx = 0; idx < handle_count; idx++)
{
- sqliteHandle *h = db->handles[idx];
+ sqliteHandle *h = handles[idx];
PTHREAD_REL_SELF (h->tid);
sqlite3_finalize (h->countContent);
@@ -932,13 +913,12 @@
GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite_close");
FREE (h);
}
- FREE (db->handles);
- db->handle_count = 0;
-
- MUTEX_DESTROY (db->DATABASE_Lock_);
- FREE (db->fn);
- FREE (db);
- db = NULL;
+ FREE (handles);
+ handles = NULL;
+ handle_count = 0;
+ MUTEX_DESTROY (lock);
+ FREE (fn);
+ fn = NULL;
}
/**
@@ -948,10 +928,10 @@
static void
drop ()
{
- char *fn = STRDUP (db->fn);
+ char * n = STRDUP (fn);
sqlite_shutdown ();
- UNLINK (fn);
- FREE (fn);
+ UNLINK (n);
+ FREE (n);
}
@@ -983,6 +963,7 @@
if (key == NULL)
return iterateLowPriority (type, iter, closure);
+ MUTEX_LOCK (lock);
handle = getDBHandle ();
dbh = handle->dbh;
strcpy (scratch, "SELECT ");
@@ -999,6 +980,7 @@
{
LOG_SQLITE (handle,
GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite_prepare");
+ MUTEX_UNLOCK (lock);
return SYSERR;
}
count = 0;
@@ -1029,9 +1011,11 @@
FREE (datum);
continue;
}
- if (iter != NULL)
- ret = iter (&rkey, datum, closure, rowid);
- else
+ if (iter != NULL) {
+ MUTEX_UNLOCK (lock);
+ ret = iter (&rkey, datum, closure, rowid);
+ MUTEX_LOCK (lock);
+ } else
ret = OK;
if (ret == SYSERR)
{
@@ -1042,10 +1026,8 @@
}
if (ret == NO)
{
- MUTEX_LOCK (db->DATABASE_Lock_);
- db->payload -= getContentDatastoreSize (datum);
- MUTEX_UNLOCK (db->DATABASE_Lock_);
- delete_by_rowid (handle, rowid);
+ payload -= getContentDatastoreSize (datum);
+ delete_by_rowid (handle, rowid);
}
FREE (datum);
count++;
@@ -1053,6 +1035,7 @@
}
sqlite3_reset (stmt);
sqlite3_finalize (stmt);
+ MUTEX_UNLOCK (lock);
return count;
}
@@ -1087,8 +1070,9 @@
GE_BREAK (ectx, 0);
return SYSERR;
}
+ MUTEX_LOCK (lock);
dbh = getDBHandle ();
- if (db->lastSync > 1000)
+ if (lastSync > 1000)
syncStats (dbh);
contentSize = ntohl (value->size) - sizeof (Datastore_Value);
stmt = dbh->insertContent;
@@ -1118,12 +1102,13 @@
return SYSERR;
}
sqlite3_reset (stmt);
- db->lastSync++;
- db->payload += getContentDatastoreSize (value);
+ lastSync++;
+ payload += getContentDatastoreSize (value);
#if DEBUG_SQLITE
GE_LOG (ectx,
GE_DEBUG | GE_REQUEST | GE_USER, "SQLite: done writing content\n");
#endif
+ MUTEX_UNLOCK (lock);
return OK;
}
@@ -1137,6 +1122,7 @@
int n;
sqliteHandle *dbh;
+ MUTEX_LOCK (lock);
dbh = getDBHandle ();
sqlite3_bind_int (dbh->updPrio, 1, delta);
sqlite3_bind_int64 (dbh->updPrio, 2, expire);
@@ -1150,6 +1136,7 @@
#if DEBUG_SQLITE
GE_LOG (ectx, GE_DEBUG | GE_REQUEST | GE_USER, "SQLite: block updated\n");
#endif
+ MUTEX_UNLOCK (lock);
if (n == SQLITE_BUSY)
return NO;
return n == SQLITE_OK ? OK : SYSERR;
@@ -1170,10 +1157,8 @@
GE_DEBUG | GE_REQUEST | GE_USER, "SQLite: initializing database\n");
#endif
- db = MALLOC (sizeof (sqliteDatabase));
- memset (db, 0, sizeof (sqliteDatabase));
- db->payload = 0;
- db->lastSync = 0;
+ payload = 0;
+ lastSync = 0;
afsdir = NULL;
GC_get_configuration_value_filename (capi->cfg,
@@ -1189,33 +1174,28 @@
{
GE_BREAK (ectx, 0);
FREE (dir);
- FREE (db);
return NULL;
}
- db->DATABASE_Lock_ = MUTEX_CREATE (NO);
- db->fn = dir;
+ fn = dir;
dbh = getDBHandle ();
if (dbh == NULL)
{
GE_BREAK (ectx, 0);
- MUTEX_DESTROY (db->DATABASE_Lock_);
- FREE (db->fn);
- FREE (db);
+ FREE (fn);
return NULL;
}
- db->payload = getStat (dbh, "PAYLOAD");
- if (db->payload == SYSERR)
+ payload = getStat (dbh, "PAYLOAD");
+ if (payload == SYSERR)
{
GE_BREAK (ectx, 0);
LOG_SQLITE (dbh,
GE_ERROR | GE_ADMIN | GE_USER | GE_BULK, "sqlite_payload");
- MUTEX_DESTROY (db->DATABASE_Lock_);
- FREE (db->fn);
- FREE (db);
+ MUTEX_DESTROY (lock);
+ FREE (fn);
return NULL;
}
-
+ lock = MUTEX_CREATE(NO);
coreAPI = capi;
stats = coreAPI->requestService ("stats");
if (stats)
@@ -1247,6 +1227,8 @@
GE_LOG (ectx,
GE_DEBUG | GE_REQUEST | GE_USER, "SQLite: database shutdown\n");
#endif
+ MUTEX_DESTROY(lock);
+ lock = NULL;
coreAPI = NULL;
}
@@ -1264,10 +1246,8 @@
char *dir;
char *afsdir;
- db = MALLOC (sizeof (sqliteDatabase));
- memset (db, 0, sizeof (sqliteDatabase));
- db->payload = 0;
- db->lastSync = 0;
+ payload = 0;
+ lastSync = 0;
afsdir = NULL;
GC_get_configuration_value_filename (uapi->cfg,
"FS",
@@ -1281,17 +1261,15 @@
if (OK != disk_directory_create (ectx, dir))
{
FREE (dir);
- FREE (db);
return;
}
- db->fn = dir;
- db->DATABASE_Lock_ = MUTEX_CREATE (NO);
+ fn = dir;
+ lock = MUTEX_CREATE (NO);
dbh = getDBHandle ();
if (dbh == NULL)
{
- MUTEX_DESTROY (db->DATABASE_Lock_);
- FREE (db->fn);
- FREE (db);
+ MUTEX_DESTROY (lock);
+ FREE (fn);
return;
}
createIndices (dbh->dbh);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r5345 - GNUnet/src/applications/sqstore_sqlite,
gnunet <=