]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
when we get a lmaster request, skip updating the header when we are also the new...
authorAndrew Tridgell <tridge@samba.org>
Tue, 17 Apr 2007 06:35:28 +0000 (16:35 +1000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 17 Apr 2007 06:35:28 +0000 (16:35 +1000)
(This used to be ctdb commit 6c48dcc5df7b855fc8e0774c9572c7b2af618348)

ctdb/common/ctdb_call.c

index 1969a3704d97cd54f62c8590f25dcdcd024a27e8..9e1258100028a82902346df9cd12e69b378f2805 100644 (file)
@@ -266,23 +266,27 @@ void ctdb_request_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr
                return;
        }
        
-       /* fetch the current record */
-       ret = ctdb_ltdb_fetch(ctdb_db, key, &header, hdr, &data2);
-       if (ret != 0) {
-               ctdb_fatal(ctdb, "ctdb_req_dmaster failed to fetch record");
-               return;
-       }
-
-       /* its a protocol error if the sending node is not the current dmaster */
-       if (header.dmaster != hdr->srcnode) {
-               ctdb_fatal(ctdb, "dmaster request from non-master");
-               return;
-       }
+       /* if the new dmaster and the lmaster are the same node, then
+          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) {
+                       ctdb_fatal(ctdb, "ctdb_req_dmaster failed to fetch record");
+                       return;
+               }
+               
+               /* its a protocol error if the sending node is not the current dmaster */
+               if (header.dmaster != hdr->srcnode) {
+                       ctdb_fatal(ctdb, "dmaster request from non-master");
+                       return;
+               }
 
-       header.dmaster = c->dmaster;
-       if (ctdb_ltdb_store(ctdb_db, key, &header, data) != 0) {
-               ctdb_fatal(ctdb, "ctdb_req_dmaster unable to update dmaster");
-               return;
+               header.dmaster = c->dmaster;
+               if (ctdb_ltdb_store(ctdb_db, key, &header, data) != 0) {
+                       ctdb_fatal(ctdb, "ctdb_req_dmaster unable to update dmaster");
+                       return;
+               }
        }
 
        /* send the CTDB_REPLY_DMASTER */