Update of /project/elephant/cvsroot/elephant/src In directory common-lisp.net:/tmp/cvs-serv32393/src
Modified Files: libsleepycat.c Log Message: next_counter: release lock on error, DB_TXN_NOSYNC (speed!)
Date: Sun Aug 29 09:54:13 2004 Author: blee
Index: elephant/src/libsleepycat.c diff -u elephant/src/libsleepycat.c:1.4 elephant/src/libsleepycat.c:1.5 --- elephant/src/libsleepycat.c:1.4 Sat Aug 28 08:40:33 2004 +++ elephant/src/libsleepycat.c Sun Aug 29 09:54:13 2004 @@ -85,7 +85,7 @@
/* Sleepycat stuff */
-#include <db42/db.h> +#include <db.h>
/* Environment */
@@ -417,7 +417,7 @@ DB_LOCK lock; DBT DBTKey, DBTData; DB_TXN *tid; - int counter, tries, ret, t_ret; + int counter, tries, ret, t_ret, lockheld; u_int32_t id;
/* Initialization. */ @@ -428,9 +428,12 @@ DBTKey.size = key_length; DBTData.data = lockid; DBTData.size = lockid_length; + tries = 0;
loop: + lockheld = 0; + /* Begin the transaction. */ if ((ret = env->txn_begin(env, NULL, &tid, 0)) != 0) { env->err(env, ret, "DB_ENV->txn_begin"); @@ -442,6 +445,8 @@ if ((ret = env->lock_get(env, id, 0, &DBTData, DB_LOCK_WRITE, &lock)) != 0) goto fail;
+ lockheld = 1; + memset(&DBTData, 0, sizeof(DBTData)); DBTData.data = &counter; DBTData.ulen = sizeof(counter); @@ -462,7 +467,7 @@ if ((ret = env->lock_put(env, &lock)) != 0) goto fail;
- if ((ret = tid->commit(tid, 0)) != 0) { + if ((ret = tid->commit(tid, DB_TXN_NOSYNC)) != 0) { env->err(env, ret, "DB_TXN->commit"); return (-2); } @@ -470,12 +475,16 @@
fail: + if (lockheld) + if ((ret = env->lock_put(env, &lock)) != 0) + return (-3); + /* Abort and retry the operation. */ if ((t_ret = tid->abort(tid)) != 0) { env->err(env, t_ret, "DB_TXN->abort"); - return (-3); + return (-4); } if (tries++ == 100) - return (-4); + return (-5); goto loop; }