/* 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;
}
/* 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");
- _tdb1_transaction_cancel(tdb);
+ if (errno != EAGAIN && errno != EINTR) {
+ tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
+ "tdb1_transaction_prepare_commit:"
+ " failed to upgrade hash locks");
+ }
return -1;
}
/* 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");
- _tdb1_transaction_cancel(tdb);
+ if (errno != EAGAIN && errno != EINTR) {
+ tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
+ "tdb1_transaction_prepare_commit:"
+ " failed to get open lock");
+ }
return -1;
}
tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
"tdb1_transaction_prepare_commit:"
" failed to setup recovery data");
- _tdb1_transaction_cancel(tdb);
return -1;
}
}
tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
"tdb1_transaction_prepare_commit:"
" expansion failed");
- _tdb1_transaction_cancel(tdb);
return -1;
}
tdb->file->map_size = tdb->transaction->old_map_size;
if (!tdb->transaction->prepared) {
int ret = _tdb1_transaction_prepare_commit(tdb);
- if (ret)
+ if (ret) {
+ _tdb1_transaction_cancel(tdb);
return ret;
+ }
}
methods = tdb->transaction->io_methods;