tdb2: suppress tdb1 backend logging when locking returns EINTR or EAGAIN
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 31 Aug 2011 05:55:16 +0000 (15:25 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 31 Aug 2011 05:55:16 +0000 (15:25 +0930)
The TDB1 code logs multiple times on errors; we must prevent that in
the limited case where locking fails.  With TDB2, this can happen due
to the lock function attribute, where the user supplies replacement
locking functions which are allowed to return with errno EAGAIN or
EINTR for various special-effects.  Flooding the logs for this is
unfriendly.

ccan/tdb2/tdb1_lock.c
ccan/tdb2/tdb1_transaction.c

index 2252e4791b91c9d8d2afb392b9fd3c87f86d9056..6498b7136726bf6083e774315bd4455caf9dde9a 100644 (file)
@@ -180,7 +180,8 @@ int tdb1_lock(struct tdb1_context *tdb, int list, int ltype)
        int ret;
 
        ret = tdb1_lock_list(tdb, list, ltype, TDB_LOCK_WAIT);
-       if (ret) {
+       /* Don't log for EAGAIN and EINTR: they could have overridden lock fns */
+       if (ret && errno != EAGAIN && errno != EINTR) {
                tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
                           "tdb1_lock failed on list %d "
                           "ltype=%d (%s)",  list, ltype, strerror(errno));
index 8d25f96ab5efe98b070e4a1e61feba74dc2afa94..9c526fb41e5d194fa10dcf2d910022881a3fc3ae 100644 (file)
@@ -478,8 +478,11 @@ static int _tdb1_transaction_start(struct tdb1_context *tdb)
        /* get a read lock from the freelist to the end of file. This
           is upgraded to a write lock during the commit */
        if (tdb1_allrecord_lock(tdb, F_RDLCK, TDB_LOCK_WAIT, true) == -1) {
-               tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
-                          "tdb1_transaction_start: failed to get hash locks");
+               if (errno != EAGAIN && errno != EINTR) {
+                       tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
+                                  "tdb1_transaction_start:"
+                                  " failed to get hash locks");
+               }
                goto fail_allrecord_lock;
        }
 
@@ -955,9 +958,11 @@ static int _tdb1_transaction_prepare_commit(struct tdb1_context *tdb)
 
        /* upgrade the main transaction lock region to a write lock */
        if (tdb1_allrecord_upgrade(tdb) == -1) {
-               tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
-                          "tdb1_transaction_prepare_commit:"
-                          " failed to upgrade hash locks");
+               if (errno != EAGAIN && errno != EINTR) {
+                       tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
+                                  "tdb1_transaction_prepare_commit:"
+                                  " failed to upgrade hash locks");
+               }
                _tdb1_transaction_cancel(tdb);
                return -1;
        }
@@ -965,9 +970,11 @@ static int _tdb1_transaction_prepare_commit(struct tdb1_context *tdb)
        /* get the open lock - this prevents new users attaching to the database
           during the commit */
        if (tdb1_nest_lock(tdb, TDB1_OPEN_LOCK, F_WRLCK, TDB_LOCK_WAIT) == -1) {
-               tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
-                          "tdb1_transaction_prepare_commit:"
-                          " failed to get open lock");
+               if (errno != EAGAIN && errno != EINTR) {
+                       tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
+                                  "tdb1_transaction_prepare_commit:"
+                                  " failed to get open lock");
+               }
                _tdb1_transaction_cancel(tdb);
                return -1;
        }