Rev 104: merge from ronnie in http://samba.org/~tridge/ctdb

tridge at samba.org tridge at samba.org
Sat Apr 14 10:44:44 GMT 2007


------------------------------------------------------------
revno: 104
revision-id: tridge at samba.org-20070414104443-0b90a6105ca1c1d5
parent: tridge at samba.org-20070413103824-0c5e1dbd679c73bd
parent: ronniesahlberg at gmail.com-20070413103741-t7jc7c48i2rl2v1d
committer: Andrew Tridgell <tridge at samba.org>
branch nick: tridge
timestamp: Sat 2007-04-14 20:44:43 +1000
message:
  merge from ronnie
modified:
  common/ctdb_client.c           ctdb_client.c-20070411010216-3kd8v37k61steeya-1
  common/ctdb_daemon.c           ctdb_daemon.c-20070409200331-3el1kqgdb9m4ib0g-1
  tests/ctdb_fetch1.c            ctdb_fetch1.c-20070412111848-xawz6wqk9r0v8jdk-1
    ------------------------------------------------------------
    merged: ronniesahlberg at gmail.com-20070413103741-t7jc7c48i2rl2v1d
    parent: ronniesahlberg at gmail.com-20070412234456-b80kjt2dz2213ijc
    committer: Ronnie sahlberg <ronniesahlberg at gmail.com>
    branch nick: ctdb
    timestamp: Fri 2007-04-13 20:37:41 +1000
    message:
      add missing code to store_unlock so that the data that a client writes is stored in ltdb
      
      this makes it possible to do fetch_lock and store_unlock across a domain socket to read/write data.
      
      
      note that the actual locking is NOT implemented yet
=== modified file 'common/ctdb_client.c'
--- a/common/ctdb_client.c	2007-04-13 10:38:24 +0000
+++ b/common/ctdb_client.c	2007-04-14 10:44:43 +0000
@@ -586,7 +586,7 @@
   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;
 
@@ -609,6 +609,9 @@
 	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;
 }
 
@@ -633,13 +636,14 @@
 
 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;
 }

=== modified file 'common/ctdb_daemon.c'
--- a/common/ctdb_daemon.c	2007-04-13 10:38:24 +0000
+++ b/common/ctdb_daemon.c	2007-04-14 10:44:43 +0000
@@ -214,12 +214,36 @@
 {
 	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);
 
@@ -228,7 +252,7 @@
 	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) {

=== modified file 'tests/ctdb_fetch1.c'
--- a/tests/ctdb_fetch1.c	2007-04-13 10:38:24 +0000
+++ b/tests/ctdb_fetch1.c	2007-04-14 10:44:43 +0000
@@ -42,7 +42,7 @@
 	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[] = {
@@ -137,26 +137,29 @@
 	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);



More information about the samba-cvs mailing list