]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
start using ctdb_ltdb_lock_fetch_requeue()
authorAndrew Tridgell <tridge@samba.org>
Tue, 17 Apr 2007 06:54:03 +0000 (16:54 +1000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 17 Apr 2007 06:54:03 +0000 (16:54 +1000)
(This used to be ctdb commit f89ab3a06b4677f56c92768c3a8ae5ec9f5abbc2)

ctdb/common/ctdb_call.c
ctdb/tests/fetch.sh

index 9e1258100028a82902346df9cd12e69b378f2805..4b7deb1fd7bcaf750470af559a8ee044efcf0135 100644 (file)
@@ -270,11 +270,15 @@ void ctdb_request_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr
           we don't need to update the record header now */
        if (c->dmaster != ctdb->vnn) {
                /* fetch the current record */
-               ret = ctdb_ltdb_fetch(ctdb_db, key, &header, hdr, &data2);
-               if (ret != 0) {
+               ret = ctdb_ltdb_lock_fetch_requeue(ctdb_db, key, &header, hdr, &data2);
+               if (ret == -1) {
                        ctdb_fatal(ctdb, "ctdb_req_dmaster failed to fetch record");
                        return;
                }
+               if (ret == -2) {
+                       printf("deferring ctdb_request_dmaster\n");
+                       return;
+               }
                
                /* its a protocol error if the sending node is not the current dmaster */
                if (header.dmaster != hdr->srcnode) {
@@ -283,7 +287,9 @@ void ctdb_request_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr
                }
 
                header.dmaster = c->dmaster;
-               if (ctdb_ltdb_store(ctdb_db, key, &header, data) != 0) {
+               ret = ctdb_ltdb_store(ctdb_db, key, &header, data);
+               ctdb_ltdb_unlock(ctdb_db, key);
+               if (ret != 0) {
                        ctdb_fatal(ctdb, "ctdb_req_dmaster unable to update dmaster");
                        return;
                }
@@ -345,17 +351,22 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
           fetches the record data (if any), thus avoiding a 2nd fetch of the data 
           if the call will be answered locally */
 
-       ret = ctdb_ltdb_fetch(ctdb_db, call.key, &header, hdr, &data);
-       if (ret != 0) {
+       ret = ctdb_ltdb_lock_fetch_requeue(ctdb_db, call.key, &header, hdr, &data);
+       if (ret == -1) {
                ctdb_send_error(ctdb, hdr, ret, "ltdb fetch failed in ctdb_request_call");
                return;
        }
+       if (ret == -2) {
+               printf("deferred ctdb_request_call\n");
+               return;
+       }
 
        /* if we are not the dmaster, then send a redirect to the
           requesting node */
        if (header.dmaster != ctdb->vnn) {
                ctdb_call_send_redirect(ctdb, c, &header);
                talloc_free(data.dptr);
+               ctdb_ltdb_unlock(ctdb_db, call.key);
                return;
        }
 
@@ -368,11 +379,14 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
           || c->flags&CTDB_IMMEDIATE_MIGRATION ) {
                ctdb_call_send_dmaster(ctdb_db, c, &header, &call.key, &data);
                talloc_free(data.dptr);
+               ctdb_ltdb_unlock(ctdb_db, call.key);
                return;
        }
 
        ctdb_call_local(ctdb_db, &call, &header, &data, c->hdr.srcnode);
 
+       ctdb_ltdb_unlock(ctdb_db, call.key);
+
        len = offsetof(struct ctdb_reply_call, data) + call.reply_data.dsize;
        r = ctdb->methods->allocate_pkt(ctdb, len);
        CTDB_NO_MEMORY_FATAL(ctdb, r);
index ba043e17c588c698fd5df8c1b727a8078f0b79c7..157934caa0a984d47ec9f4088805e558871034f5 100755 (executable)
@@ -7,3 +7,11 @@ bin/ctdb_fetch --nlist tests/nodes.txt --listen 127.0.0.2:9001 $* &
 bin/ctdb_fetch --nlist tests/nodes.txt --listen 127.0.0.1:9001 $* 
 
 killall -q ctdb_fetch
+
+echo "Trying 4 nodes"
+bin/ctdb_fetch --nlist tests/4nodes.txt --listen 127.0.0.4:9001 $* &
+bin/ctdb_fetch --nlist tests/4nodes.txt --listen 127.0.0.3:9001 $* &
+bin/ctdb_fetch --nlist tests/4nodes.txt --listen 127.0.0.2:9001 $* &
+bin/ctdb_fetch --nlist tests/4nodes.txt --listen 127.0.0.1:9001 $* 
+
+killall -q ctdb_fetch