This is called when the program wants to wait for a ctdb_fetch_lock to complete and get the
results. This call will block unless the call has already completed.
*/
-struct ctdb_record_handle *ctdb_client_fetch_lock_recv(struct ctdb_call_state *state, TALLOC_CTX *mem_ctx, TDB_DATA key)
+struct ctdb_record_handle *ctdb_client_fetch_lock_recv(struct ctdb_call_state *state, TALLOC_CTX *mem_ctx, TDB_DATA key, TDB_DATA *data)
{
struct ctdb_record_handle *rec;
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;
}
struct ctdb_record_handle *ctdb_client_fetch_lock(struct ctdb_db_context *ctdb_db,
TALLOC_CTX *mem_ctx,
- TDB_DATA key, TDB_DATA *data)
+ TDB_DATA key,
+ TDB_DATA *data)
{
struct ctdb_call_state *state;
struct ctdb_record_handle *rec;
state = ctdb_client_fetch_lock_send(ctdb_db, mem_ctx, key);
- rec = ctdb_client_fetch_lock_recv(state, mem_ctx, key);
+ rec = ctdb_client_fetch_lock_recv(state, mem_ctx, key, data);
return rec;
}
{
struct ctdb_db_context *ctdb_db;
struct ctdb_reply_store_unlock r;
+ uint32_t caller = ctdb_get_vnn(client->ctdb);
+ struct ctdb_ltdb_header header;
+ TDB_DATA key, data;
int res;
ctdb_db = find_ctdb_db(client->ctdb, f->db_id);
+
/* write the data to ltdb */
-/*XXX*/
+ key.dsize = f->keylen;
+ key.dptr = &f->data[0];
+ res = ctdb_ltdb_fetch(ctdb_db, key, &header, NULL, NULL);
+ if (res) {
+ ctdb_set_error(ctdb_db->ctdb, "Fetch of locally held record failed");
+ res = -1;
+ goto done;
+ }
+ if (header.laccessor != caller) {
+ header.lacount = 0;
+ }
+ header.laccessor = caller;
+ header.lacount++;
+ data.dsize = f->datalen;
+ data.dptr = &f->data[f->keylen];
+ res = ctdb_ltdb_store(ctdb_db, key, &header, data);
+ if ( res != 0) {
+ ctdb_set_error(ctdb_db->ctdb, "ctdb_call tdb_store failed\n");
+ }
+
+done:
/* now send the reply */
ZERO_STRUCT(r);
r.hdr.ctdb_version = CTDB_VERSION;
r.hdr.operation = CTDB_REPLY_STORE_UNLOCK;
r.hdr.reqid = f->hdr.reqid;
- r.state = CTDB_CALL_DONE;
+ r.state = res;
res = ctdb_queue_send(client->queue, (uint8_t *)&r.hdr, r.hdr.length);
if (res != 0) {
const char *myaddress = NULL;
int self_connect=0;
int daemon_mode=0;
- TDB_DATA key, *data, *data2, store_data;
+ TDB_DATA key, data, data2, store_data;
struct ctdb_record_handle *rh;
struct poptOption popt_options[] = {
ctdb_connect_wait(ctdb);
key.dptr = "Record";
- key.dsize = strlen(key.dptr);
- data = NULL;
- rh = ctdb_fetch_lock(ctdb_db, ctdb_db, key, data);
+ key.dsize = strlen(key.dptr)+1;
+ rh = ctdb_fetch_lock(ctdb_db, ctdb_db, key, &data);
store_data.dptr = "data to store";
store_data.dsize = strlen(store_data.dptr)+1;
ret = ctdb_store_unlock(rh, store_data);
- printf("ctdb_store_unlock ret:%d\n",ret);
-
- data2 = NULL;
- rh = ctdb_fetch_lock(ctdb_db, ctdb_db, key, data2);
-/* hopefully data2 will now contain the record written above */
+ rh = ctdb_fetch_lock(ctdb_db, ctdb_db, key, &data2);
+ /* hopefully data2 will now contain the record written above */
+ if (!strcmp("data to store", data2.dptr)) {
+ printf("woohoo we read back the data we stored\n");
+ } else {
+ printf("ERROR: we read back different data than we stored\n");
+ }
+
/* just write it back to unlock it */
- ret = ctdb_store_unlock(rh, data2);
- printf("ctdb_store_unlock ret:%d\n",ret);
+ ret = ctdb_store_unlock(rh, store_data);
+#if 0
while (1) {
event_loop_once(ev);
}
+#endif
/* shut it down */
talloc_free(ctdb);