{
struct ctdb_call_state *state;
struct ctdb_record_handle *rec;
- ret = ctdb_ltdb_fetch(ctdb_db, key, &header, ctdb_db, &data);
+ struct ctdb_ltdb_header header;
+ int ret;
+
+ ret = ctdb_ltdb_lock(ctdb_db, key);
+ if (ret != 0) {
+ printf("failed to lock ltdb record\n");
+ return NULL;
+ }
+
++ ret = ctdb_ltdb_fetch(ctdb_db, key, &header, ctdb_db, data);
+ if (ret != 0) {
+ ctdb_ltdb_unlock(ctdb_db, key);
+ return NULL;
+ }
- state = ctdb_client_fetch_lock_send(ctdb_db, mem_ctx, key);
- rec = ctdb_client_fetch_lock_recv(state, mem_ctx, key, data);
- if (header.dmaster != ctdb->vnn) {
++ if (header.dmaster != ctdb_db->ctdb->vnn) {
+ state = ctdb_client_fetch_lock_send(ctdb_db, mem_ctx, key);
+ rec = ctdb_client_fetch_lock_recv(state, mem_ctx, key, data);
+ return rec;
+ }
+
++ rec = talloc(mem_ctx, struct ctdb_record_handle);
++ CTDB_NO_MEMORY_NULL(ctdb_db->ctdb, rec);
++
++ rec->ctdb_db = state->ctdb_db;
++ rec->key = key;
++ rec->key.dptr = talloc_memdup(rec, key.dptr, key.dsize);
++ rec->data = talloc(rec, TDB_DATA);
++ rec->data->dsize = state->call.reply_data.dsize;
++ rec->data->dptr = talloc_memdup(rec, state->call.reply_data.dptr, rec->data->dsize);
++
++ if (data) {
++ *data = *rec->data;
++ }
+ return rec;
}
+/*
+ a helper function for the client that will store the new data for the
+ record and release the tdb chainlock
+*/
int ctdb_client_store_unlock(struct ctdb_record_handle *rec, TDB_DATA data)
{
- struct ctdb_call_state *state;
- int res;
+ int ret;
+ struct ctdb_ltdb_header header;
+ struct ctdb_db_context *ctdb_db = talloc_get_type(rec->ctdb_db, struct ctdb_db_context);
- state = ctdb_client_store_unlock_send(rec, rec, data);
- res = ctdb_client_store_unlock_recv(state, rec);
+ /* should be avoided if possible hang header off rec ? */
+ ret = ctdb_ltdb_fetch(rec->ctdb_db, rec->key, &header, NULL, NULL);
+ if (ret) {
+ ctdb_set_error(rec->ctdb_db->ctdb, "Fetch of locally held record failed");
+ talloc_free(rec);
+ return ret;
+ }
+
+ ret = ctdb_ltdb_store(ctdb_db, rec->key, &header, data);
+ ctdb_ltdb_unlock(ctdb_db, rec->key);
+
talloc_free(rec);
- return res;
+ return ret;
}