*/
struct ctdb_request *
ctdb_attachdb_send(struct ctdb_connection *ctdb,
- const char *name, int persistent, uint32_t tdb_flags,
+ const char *name, bool persistent, uint32_t tdb_flags,
ctdb_callback_t callback, void *cbdata);
/**
/**
* ctdb_writerecord - write a locked record in a TDB
+ * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
* @lock: the lock from ctdb_readrecordlock/ctdb_readrecordlock_recv
* @data: the new data to place in the record.
*/
-int ctdb_writerecord(struct ctdb_lock *lock, TDB_DATA data);
+bool ctdb_writerecord(struct ctdb_db *ctdb_db,
+ struct ctdb_lock *lock, TDB_DATA data);
/**
* ctdb_release_lock - release a record lock on a TDB
+ * @ctdb_db: the database handle from ctdb_attachdb/ctdb_attachdb_recv.
* @lock: the lock from ctdb_readrecordlock/ctdb_readrecordlock_async
*/
-void ctdb_release_lock(struct ctdb_lock *lock);
+void ctdb_release_lock(struct ctdb_db *ctdb_db, struct ctdb_lock *lock);
/**
* ctdb_message_fn_t - messaging callback for ctdb messages
* Returns NULL on failure.
*/
struct ctdb_db *ctdb_attachdb(struct ctdb_connection *ctdb,
- const char *name, int persistent,
+ const char *name, bool persistent,
uint32_t tdb_flags);
/**
struct ctdb_request *
ctdb_attachdb_send(struct ctdb_connection *ctdb,
- const char *name, int persistent, uint32_t tdb_flags,
+ const char *name, bool persistent, uint32_t tdb_flags,
ctdb_callback_t callback, void *private_data)
{
struct ctdb_request *req;
}
-void ctdb_release_lock(struct ctdb_lock *lock)
+void ctdb_release_lock(struct ctdb_db *ctdb_db, struct ctdb_lock *lock)
{
if (lock->held_magic != lock_magic(lock)) {
DEBUG(lock->ctdb_db->ctdb, LOG_ALERT,
"ctdb_release_lock invalid lock %p", lock);
+ } else if (lock->ctdb_db != ctdb_db) {
+ errno = EBADF;
+ DEBUG(ctdb_db->ctdb, LOG_ALERT,
+ "ctdb_release_lock: wrong ctdb_db.");
} else {
tdb_chainunlock(lock->ctdb_db->tdb, lock->key);
DEBUG(lock->ctdb_db->ctdb, LOG_DEBUG,
return true;
}
-int ctdb_writerecord(struct ctdb_lock *lock, TDB_DATA data)
+bool ctdb_writerecord(struct ctdb_db *ctdb_db,
+ struct ctdb_lock *lock, TDB_DATA data)
{
+ if (lock->ctdb_db != ctdb_db) {
+ errno = EBADF;
+ DEBUG(ctdb_db->ctdb, LOG_ALERT,
+ "ctdb_writerecord: Can not write, wrong ctdb_db.");
+ return false;
+ }
+
if (lock->held_magic != lock_magic(lock)) {
errno = EBADF;
- DEBUG(lock->ctdb_db->ctdb, LOG_ALERT,
+ DEBUG(ctdb_db->ctdb, LOG_ALERT,
"ctdb_writerecord: Can not write. Lock has been released.");
- return -1;
+ return false;
}
- if (lock->ctdb_db->persistent) {
+ if (ctdb_db->persistent) {
errno = EINVAL;
- DEBUG(lock->ctdb_db->ctdb, LOG_ALERT,
+ DEBUG(ctdb_db->ctdb, LOG_ALERT,
"ctdb_writerecord: cannot write to persistent db");
- return -1;
+ return false;
}
- return ctdb_local_store(lock->ctdb_db->tdb, lock->key, lock->hdr,
- data);
+ return ctdb_local_store(ctdb_db->tdb, lock->key, lock->hdr, data) == 0;
}
}
struct ctdb_db *ctdb_attachdb(struct ctdb_connection *ctdb,
- const char *name, int persistent,
+ const char *name, bool persistent,
uint32_t tdb_flags)
{
struct ctdb_request *req;
data.dptr = tmp;
data.dsize = strlen(tmp) + 1;
- ctdb_writerecord(lock, data);
+ if (!ctdb_writerecord(ctdb_db, lock, data))
+ printf("Error writing data!\n");
/* Release the lock as quickly as possible */
- ctdb_release_lock(lock);
+ ctdb_release_lock(ctdb_db, lock);
printf("Wrote new record : %s\n", tmp);
exit(10);
}
- ctdb_db_context = ctdb_attachdb(ctdb_connection, "test_test.tdb", 0, 0);
+ ctdb_db_context = ctdb_attachdb(ctdb_connection, "test_test.tdb",
+ false, 0);
if (!ctdb_db_context) {
printf("Failed to attach to database\n");
exit(10);