[SCM] Samba Shared Repository - branch v4-12-test updated

Karolin Seeger kseeger at samba.org
Mon Mar 30 09:37:02 UTC 2020


The branch, v4-12-test has been updated
       via  2dabb4c5cdd ctdb-recoverd: Avoid dereferencing NULL rec->nodemap
       via  b1b41b88a5e ctdb-daemon: Don't allow attach from recovery if recovery is not active
       via  60dc3c3282d ctdb-daemon: Remove more unused old client database functions
       via  2049792ff78 ctdb-recovery: Remove old code for creating missing databases
       via  c8354a9cb79 ctdb-recovery: Create database on nodes where it is missing
       via  63db9658e1e ctdb-recovery: Fetch database name from all nodes where it is attached
       via  71310819676 ctdb-recovery: Pass db structure for each database recovery
       via  58f83582821 ctdb-recovery: GET_DBMAP from all nodes
       via  808c7aabcbd ctdb-recovery: Replace use of ctdb_dbid_map with local db_list
       via  1e57e5c4e62 ctdb-daemon: Respect CTDB_CTRL_FLAG_ATTACH_RECOVERY when attaching databases
       via  05c2d86d075 ctdb-recovery: Use CTDB_CTRL_FLAG_ATTACH_RECOVERY to attach during recovery
       via  7c1f9bde013 ctdb-protocol: Add control flag CTDB_CTRL_FLAG_ATTACH_RECOVERY
       via  aefd9b2e68d ctdb-daemon: Remove unused old client database functions
       via  c9fa4fb0575 ctdb-daemon: Fix database attach deferral logic
       via  b7f7f7b63e6 ctdb-recovery: Refactor banning a node into separate computation
       via  f468f654078 ctdb-recovery: Don't trust nodemap obtained from local node
       via  ad5c6f3a520 ctdb-recovery: Consolidate node state
       via  be8d05f5978 ctdb-recovery: Fetched vnnmap is never used, so don't fetch it
      from  ee06963cbb4 selftest: test samba-tool group commands with groupnames with brackets and spaces

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-12-test


- Log -----------------------------------------------------------------
commit 2dabb4c5cddc674c6a94ceaa42783cfef488cd4d
Author: Martin Schwenke <martin at meltin.net>
Date:   Sun Mar 22 13:46:46 2020 +1100

    ctdb-recoverd: Avoid dereferencing NULL rec->nodemap
    
    Inside the nested event loop in ctdb_ctrl_getnodemap(), various
    asynchronous handlers may dereference rec->nodemap, which will be
    NULL.
    
    One example is lost_reclock_handler(), which causes rec->nodemap to be
    unconditionally dereferenced in list_of_nodes() via this call chain:
    
      list_of_nodes()
      list_of_active_nodes()
      set_recovery_mode()
      force_election()
      lost_reclock_handler()
    
    Instead of attempting to trace all of the cases, just avoid leaving
    rec->nodemap set to NULL.  Attempting to use an old value is generally
    harmless, especially since it will be the same as the new value in
    most cases.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14324
    
    Reported-by: Volker Lendecke <vl at samba.org>
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    
    Autobuild-User(master): Martin Schwenke <martins at samba.org>
    Autobuild-Date(master): Tue Mar 24 01:22:45 UTC 2020 on sn-devel-184
    
    (cherry picked from commit 716f52f68b248ae7cfd66479b3fc678c4a0d8b38)
    
    Autobuild-User(v4-12-test): Karolin Seeger <kseeger at samba.org>
    Autobuild-Date(v4-12-test): Mon Mar 30 09:36:01 UTC 2020 on sn-devel-184

commit b1b41b88a5ee6d5f06f9c1f722f5288f1af61203
Author: Martin Schwenke <martin at meltin.net>
Date:   Tue Feb 25 17:32:56 2020 +1100

    ctdb-daemon: Don't allow attach from recovery if recovery is not active
    
    Neither the recovery daemon nor the recovery helper should attach
    databases outside of the recovery process.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 147afe77de372ddb9c180228d6fe1b04cca4610f)

commit 60dc3c3282d0d677ed1d441add0b4003749835dd
Author: Martin Schwenke <martin at meltin.net>
Date:   Tue Feb 25 06:20:32 2020 +1100

    ctdb-daemon: Remove more unused old client database functions
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 052f1bdb9cf78f53f584edd32f81ae8e01e8e86e)

commit 2049792ff784f7943f04a62c6614a703cfa765fb
Author: Martin Schwenke <martin at meltin.net>
Date:   Mon Feb 24 19:51:19 2020 +1100

    ctdb-recovery: Remove old code for creating missing databases
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 3a66d181b6f6199fca362fcb0aa06513645b589d)

commit c8354a9cb79c7c961bc29772e864e08edd3731f6
Author: Martin Schwenke <martin at meltin.net>
Date:   Mon Feb 24 11:31:33 2020 +1100

    ctdb-recovery: Create database on nodes where it is missing
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 76a8174279f42486b36cc41d5831d4e6613f172e)

commit 63db9658e1e71146ff6f06619b26d2ad3c7ebfbb
Author: Martin Schwenke <martin at meltin.net>
Date:   Mon Feb 24 10:26:34 2020 +1100

    ctdb-recovery: Fetch database name from all nodes where it is attached
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit e6e63f8fb8194634135bf34cda18f6cc8ff69a7c)

commit 7131081967600ad8fa332e4004b8d93859a35008
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Feb 21 16:51:10 2020 +1100

    ctdb-recovery: Pass db structure for each database recovery
    
    Instead of db_id and db_flags.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 1bdfeb3fdc06947a607957ab3d114f97bad5d7d7)

commit 58f835828213ac5bec4e459e3f59b0bcfdc2fe31
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Feb 21 16:10:05 2020 +1100

    ctdb-recovery: GET_DBMAP from all nodes
    
    This builds a complete list of databases across the cluster so it can
    be used to create databases on the nodes where they are missing.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit c6f74e590f602e2ed38fe293468770a5e669aefa)

commit 808c7aabcbda0272e666037b3f715facdb48fa76
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Feb 21 12:24:39 2020 +1100

    ctdb-recovery: Replace use of ctdb_dbid_map with local db_list
    
    This will be used to build a merged list of databases from all nodes,
    allowing the recovery helper to create missing databases.
    
    It would be possible to also include the db_name field in this
    structure but that would cause a lot of churn.  This field is used
    locally in the recovery of each database so can continue to live in
    the relevant state structure(s).
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 4c0b9c36050a0ed8a180d4ac1853224089528e8e)

commit 1e57e5c4e62e18390b08efd026eac8fddca4e619
Author: Martin Schwenke <martin at meltin.net>
Date:   Wed Feb 26 11:50:09 2020 +1100

    ctdb-daemon: Respect CTDB_CTRL_FLAG_ATTACH_RECOVERY when attaching databases
    
    This is currently only set by the recovery daemon when it attaches
    missing databases, so there is no obvious behaviour change.  However,
    attaching missing databases can now be moved to the recovery helper as
    long as it sets this flag.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 7e5a8a4884ea87bb985fe0e2b65ff130fc2ba8aa)

commit 05c2d86d0757653b777d0518f96beabc91bc7993
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Feb 21 11:13:05 2020 +1100

    ctdb-recovery: Use CTDB_CTRL_FLAG_ATTACH_RECOVERY to attach during recovery
    
    ctdb_ctrl_createdb() is only called by the recovery daemon, so this is
    a safe, temporary change.  This is temporary because
    ctdb_ctrl_createdb(), create_missing_remote_databases() and
    create_missing_local_databases() will all go away soon.
    
    Note that this doesn't cause a change in behaviour.  The main daemon
    will still only defer attaches from non-recoverd processes during
    recovery.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 98e3d0db2bc5f33217e26fab1dfb4bb91eae534f)

commit 7c1f9bde013d40c736745a81c845a2d1e7a37171
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Feb 21 11:04:14 2020 +1100

    ctdb-protocol: Add control flag CTDB_CTRL_FLAG_ATTACH_RECOVERY
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 17ed0425904a98624284d351ab7617b3e02c0f7b)

commit aefd9b2e68ddf6ec37b9db173796a7cc2941dbbe
Author: Martin Schwenke <martin at meltin.net>
Date:   Wed Feb 26 17:03:49 2020 +1100

    ctdb-daemon: Remove unused old client database functions
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit fc23cd1b9cdd1d70067491614b16e616291e8ff2)

commit c9fa4fb05755eb5083a1ec28035b1105a9e90b4f
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Feb 20 13:48:13 2020 +1100

    ctdb-daemon: Fix database attach deferral logic
    
    Commit 3cc230b5eeca749ab68d19cfda969f72c269f1f6 says:
    
      Dont allow clients to connect to databases untile we are well past
      and through the initial recovery phase
    
    It is unclear what this commit was attempting to do.  The commit
    message implies that more attaches should be deferred but the code
    change adds a conjunction that causes less attaches to be deferred.
    In particular, no attaches will be deferred after startup is complete.
    This seems wrong.
    
    To implement what seems to be stated in the commit message an "or"
    needs to be used so that non-recovery daemon attaches are deferred
    either when in recovery or before startup is complete.  Making this
    change highlights that attaches need to be allowed during the
    "startup" event because this is when smbd is started.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit c6c89495fbe9b6f238d10a538eccc92b937a69de)

commit b7f7f7b63e608a0215ad3cc8fc576cbab68d3bb0
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Mon Mar 2 16:16:26 2020 +1100

    ctdb-recovery: Refactor banning a node into separate computation
    
    If a node is marked for banning, confirm that it's not become inactive
    during the recovery.  If yes, then don't ban the node.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    (cherry picked from commit 1c56d6413f86cc15ebac232f39ef1e2a53ae4297)

commit f468f65407812acc08fa9c1e1cce7f51e9459f19
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Feb 18 16:17:00 2020 +1100

    ctdb-recovery: Don't trust nodemap obtained from local node
    
    It's possible to have a node stopped, but recovery master not yet
    updated flags on the local ctdb daemon when recovery is started.  So do
    not trust the list of active nodes obtained from the local node.  Query
    the connected nodes to calculate the list of active nodes.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    (cherry picked from commit c6a0ff1bed0265e44fd6135d16bfc41919fe5bf5)

commit ad5c6f3a5202af3120b18f1067c6328a9ee8a651
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Mon Mar 2 15:07:21 2020 +1100

    ctdb-recovery: Consolidate node state
    
    This avoids passing multiple arguments to async computation.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    (cherry picked from commit 6e2f8756f1bce4dfc7fdc435e082f400116e29ec)

commit be8d05f59787acecfac26b577ac6ed18c9c1c37f
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Mon Mar 2 13:59:42 2020 +1100

    ctdb-recovery: Fetched vnnmap is never used, so don't fetch it
    
    New vnnmap is constructed using the information from all the connected
    nodes.  So there is no need to fetch the vnnmap from recovery master.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14294
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    (cherry picked from commit 072ff4d12b8f34766120ddae888d772e97bca491)

-----------------------------------------------------------------------

Summary of changes:
 ctdb/include/ctdb_client.h         |   34 -
 ctdb/include/ctdb_private.h        |    2 +
 ctdb/protocol/protocol.h           |    1 +
 ctdb/server/ctdb_client.c          |  242 ------
 ctdb/server/ctdb_ltdb_server.c     |   13 +-
 ctdb/server/ctdb_recoverd.c        |  169 +----
 ctdb/server/ctdb_recovery_helper.c | 1478 +++++++++++++++++++++++++++---------
 7 files changed, 1124 insertions(+), 815 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/include/ctdb_client.h b/ctdb/include/ctdb_client.h
index ef4950ab533..198a8a38dbb 100644
--- a/ctdb/include/ctdb_client.h
+++ b/ctdb/include/ctdb_client.h
@@ -165,10 +165,6 @@ int ctdb_ctrl_getrecmaster(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx,
 int ctdb_ctrl_setrecmaster(struct ctdb_context *ctdb, struct timeval timeout,
 			   uint32_t destnode, uint32_t recmaster);
 
-int ctdb_ctrl_getdbmap(struct ctdb_context *ctdb, struct timeval timeout,
-		       uint32_t destnode, TALLOC_CTX *mem_ctx,
-		       struct ctdb_dbid_map_old **dbmap);
-
 int ctdb_ctrl_getnodemap(struct ctdb_context *ctdb, struct timeval timeout,
 			 uint32_t destnode, TALLOC_CTX *mem_ctx,
 			 struct ctdb_node_map_old **nodemap);
@@ -176,39 +172,9 @@ int ctdb_ctrl_getnodemap(struct ctdb_context *ctdb, struct timeval timeout,
 int ctdb_ctrl_get_runstate(struct ctdb_context *ctdb, struct timeval timeout,
 			   uint32_t destnode, uint32_t *runstate);
 
-int ctdb_ctrl_getdbpath(struct ctdb_context *ctdb, struct timeval timeout,
-			uint32_t destnode, uint32_t dbid,
-			TALLOC_CTX *mem_ctx, const char **path);
-int ctdb_ctrl_getdbname(struct ctdb_context *ctdb, struct timeval timeout,
-			uint32_t destnode, uint32_t dbid,
-			TALLOC_CTX *mem_ctx, const char **name);
-
-int ctdb_ctrl_createdb(struct ctdb_context *ctdb, struct timeval timeout,
-		       uint32_t destnode, TALLOC_CTX *mem_ctx,
-		       const char *name, uint8_t db_flags, uint32_t *db_id);
-
 int ctdb_ctrl_get_debuglevel(struct ctdb_context *ctdb, uint32_t destnode,
 			     int32_t *level);
 
-/*
-  attach to a ctdb database
-*/
-int ctdb_ctrl_db_open_flags(struct ctdb_context *ctdb, uint32_t db_id,
-			    int *tdb_flags);
-
-struct ctdb_db_context *ctdb_attach(struct ctdb_context *ctdb,
-				    struct timeval timeout,
-				    const char *name,
-				    uint8_t db_flags);
-
-/* a ctdb call function */
-typedef int (*ctdb_fn_t)(struct ctdb_call_info *);
-
-/*
-  setup a ctdb call function
-*/
-int ctdb_set_call(struct ctdb_db_context *ctdb_db, ctdb_fn_t fn, uint32_t id);
-
 int ctdb_ctrl_freeze(struct ctdb_context *ctdb, struct timeval timeout,
 		     uint32_t destnode);
 
diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h
index 6aba3c1d48e..fcffc23e2d6 100644
--- a/ctdb/include/ctdb_private.h
+++ b/ctdb/include/ctdb_private.h
@@ -36,6 +36,8 @@ struct ctdb_tcp_array {
 /*
   an installed ctdb remote call
 */
+typedef int (*ctdb_fn_t)(struct ctdb_call_info *);
+
 struct ctdb_registered_call {
 	struct ctdb_registered_call *next, *prev;
 	uint32_t id;
diff --git a/ctdb/protocol/protocol.h b/ctdb/protocol/protocol.h
index 43175ae3a95..04a651018be 100644
--- a/ctdb/protocol/protocol.h
+++ b/ctdb/protocol/protocol.h
@@ -944,6 +944,7 @@ struct ctdb_req_control {
 #define CTDB_CTRL_FLAG_OPCODE_SPECIFIC   0xFFFF0000
 /* Ugly overloading of this field... */
 #define CTDB_PUBLIC_IP_FLAGS_ONLY_AVAILABLE 0x00010000
+#define CTDB_CTRL_FLAG_ATTACH_RECOVERY      0x00020000
 	uint32_t flags;
 	struct ctdb_req_control_data rdata;
 };
diff --git a/ctdb/server/ctdb_client.c b/ctdb/server/ctdb_client.c
index 0da847c401b..453e7b28477 100644
--- a/ctdb/server/ctdb_client.c
+++ b/ctdb/server/ctdb_client.c
@@ -1029,30 +1029,6 @@ int ctdb_ctrl_setrecmaster(struct ctdb_context *ctdb, struct timeval timeout, ui
 }
 
 
-/*
-  get a list of databases off a remote node
- */
-int ctdb_ctrl_getdbmap(struct ctdb_context *ctdb, struct timeval timeout, uint32_t destnode,
-		       TALLOC_CTX *mem_ctx, struct ctdb_dbid_map_old **dbmap)
-{
-	int ret;
-	TDB_DATA outdata;
-	int32_t res;
-
-	ret = ctdb_control(ctdb, destnode, 0,
-			   CTDB_CONTROL_GET_DBMAP, 0, tdb_null,
-			   mem_ctx, &outdata, &res, &timeout, NULL);
-	if (ret != 0 || res != 0) {
-		DEBUG(DEBUG_ERR,(__location__ " ctdb_control for getdbmap failed ret:%d res:%d\n", ret, res));
-		return -1;
-	}
-
-	*dbmap = (struct ctdb_dbid_map_old *)talloc_memdup(mem_ctx, outdata.dptr, outdata.dsize);
-	talloc_free(outdata.dptr);
-
-	return 0;
-}
-
 /*
   get a list of nodes (vnn and flags ) from a remote node
  */
@@ -1107,108 +1083,6 @@ int ctdb_ctrl_get_runstate(struct ctdb_context *ctdb,
 	return 0;
 }
 
-/*
-  find the real path to a ltdb
- */
-int ctdb_ctrl_getdbpath(struct ctdb_context *ctdb, struct timeval timeout, uint32_t destnode, uint32_t dbid, TALLOC_CTX *mem_ctx,
-		   const char **path)
-{
-	int ret;
-	int32_t res;
-	TDB_DATA data;
-
-	data.dptr = (uint8_t *)&dbid;
-	data.dsize = sizeof(dbid);
-
-	ret = ctdb_control(ctdb, destnode, 0,
-			   CTDB_CONTROL_GETDBPATH, 0, data,
-			   mem_ctx, &data, &res, &timeout, NULL);
-	if (ret != 0 || res != 0) {
-		return -1;
-	}
-
-	(*path) = talloc_strndup(mem_ctx, (const char *)data.dptr, data.dsize);
-	if ((*path) == NULL) {
-		return -1;
-	}
-
-	talloc_free(data.dptr);
-
-	return 0;
-}
-
-/*
-  find the name of a db
- */
-int ctdb_ctrl_getdbname(struct ctdb_context *ctdb, struct timeval timeout, uint32_t destnode, uint32_t dbid, TALLOC_CTX *mem_ctx,
-		   const char **name)
-{
-	int ret;
-	int32_t res;
-	TDB_DATA data;
-
-	data.dptr = (uint8_t *)&dbid;
-	data.dsize = sizeof(dbid);
-
-	ret = ctdb_control(ctdb, destnode, 0,
-			   CTDB_CONTROL_GET_DBNAME, 0, data,
-			   mem_ctx, &data, &res, &timeout, NULL);
-	if (ret != 0 || res != 0) {
-		return -1;
-	}
-
-	(*name) = talloc_strndup(mem_ctx, (const char *)data.dptr, data.dsize);
-	if ((*name) == NULL) {
-		return -1;
-	}
-
-	talloc_free(data.dptr);
-
-	return 0;
-}
-
-/*
-  create a database
- */
-int ctdb_ctrl_createdb(struct ctdb_context *ctdb, struct timeval timeout,
-		       uint32_t destnode, TALLOC_CTX *mem_ctx,
-		       const char *name, uint8_t db_flags, uint32_t *db_id)
-{
-	int ret;
-	int32_t res;
-	TDB_DATA data;
-	uint32_t opcode;
-
-	data.dptr = discard_const(name);
-	data.dsize = strlen(name)+1;
-
-	if (db_flags & CTDB_DB_FLAGS_PERSISTENT) {
-		opcode = CTDB_CONTROL_DB_ATTACH_PERSISTENT;
-	} else if (db_flags & CTDB_DB_FLAGS_REPLICATED) {
-		opcode = CTDB_CONTROL_DB_ATTACH_REPLICATED;
-	} else {
-		opcode = CTDB_CONTROL_DB_ATTACH;
-	}
-
-	ret = ctdb_control(ctdb, destnode, 0, opcode, 0, data,
-			   mem_ctx, &data, &res, &timeout, NULL);
-
-	if (ret != 0 || res != 0) {
-		return -1;
-	}
-
-	if (data.dsize != sizeof(uint32_t)) {
-		TALLOC_FREE(data.dptr);
-		return -1;
-	}
-	if (db_id != NULL) {
-		*db_id = *(uint32_t *)data.dptr;
-	}
-	talloc_free(data.dptr);
-
-	return 0;
-}
-
 /*
   get debug level on a node
  */
@@ -1233,122 +1107,6 @@ int ctdb_ctrl_get_debuglevel(struct ctdb_context *ctdb, uint32_t destnode, int32
 	return 0;
 }
 
-/*
- * Get db open flags
- */
-int ctdb_ctrl_db_open_flags(struct ctdb_context *ctdb, uint32_t db_id,
-			    int *tdb_flags)
-{
-	TDB_DATA indata, outdata;
-	int ret;
-	int32_t res;
-
-	indata.dptr = (uint8_t *)&db_id;
-	indata.dsize = sizeof(db_id);
-
-	ret = ctdb_control(ctdb, CTDB_CURRENT_NODE, 0,
-			   CTDB_CONTROL_DB_OPEN_FLAGS, 0, indata,
-			   ctdb, &outdata, &res, NULL, NULL);
-	if (ret != 0 || res != 0) {
-		D_ERR("ctdb control for db open flags failed\n");
-		return  -1;
-	}
-
-	if (outdata.dsize != sizeof(int32_t)) {
-		D_ERR(__location__ " expected %zi bytes, received %zi bytes\n",
-		      sizeof(int32_t), outdata.dsize);
-		talloc_free(outdata.dptr);
-		return -1;
-	}
-
-	*tdb_flags = *(int32_t *)outdata.dptr;
-	talloc_free(outdata.dptr);
-	return 0;
-}
-
-/*
-  attach to a specific database - client call
-*/
-struct ctdb_db_context *ctdb_attach(struct ctdb_context *ctdb,
-				    struct timeval timeout,
-				    const char *name,
-				    uint8_t db_flags)
-{
-	struct ctdb_db_context *ctdb_db;
-	int ret;
-	int tdb_flags;
-
-	ctdb_db = ctdb_db_handle(ctdb, name);
-	if (ctdb_db) {
-		return ctdb_db;
-	}
-
-	ctdb_db = talloc_zero(ctdb, struct ctdb_db_context);
-	CTDB_NO_MEMORY_NULL(ctdb, ctdb_db);
-
-	ctdb_db->ctdb = ctdb;
-	ctdb_db->db_name = talloc_strdup(ctdb_db, name);
-	CTDB_NO_MEMORY_NULL(ctdb, ctdb_db->db_name);
-
-	/* tell ctdb daemon to attach */
-	ret = ctdb_ctrl_createdb(ctdb, timeout, CTDB_CURRENT_NODE,
-				 ctdb_db, name, db_flags, &ctdb_db->db_id);
-	if (ret != 0) {
-		DEBUG(DEBUG_ERR,("Failed to attach to database '%s'\n", name));
-		talloc_free(ctdb_db);
-		return NULL;
-	}
-
-	ret = ctdb_ctrl_getdbpath(ctdb, timeout, CTDB_CURRENT_NODE, ctdb_db->db_id, ctdb_db, &ctdb_db->db_path);
-	if (ret != 0) {
-		DEBUG(DEBUG_ERR,("Failed to get dbpath for database '%s'\n", name));
-		talloc_free(ctdb_db);
-		return NULL;
-	}
-
-	ret = ctdb_ctrl_db_open_flags(ctdb, ctdb_db->db_id, &tdb_flags);
-	if (ret != 0) {
-		D_ERR("Failed to get tdb_flags for database '%s'\n", name);
-		talloc_free(ctdb_db);
-		return NULL;
-	}
-
-	ctdb_db->ltdb = tdb_wrap_open(ctdb_db, ctdb_db->db_path, 0, tdb_flags,
-				      O_RDWR, 0);
-	if (ctdb_db->ltdb == NULL) {
-		ctdb_set_error(ctdb, "Failed to open tdb '%s'\n", ctdb_db->db_path);
-		talloc_free(ctdb_db);
-		return NULL;
-	}
-
-	ctdb_db->db_flags = db_flags;
-
-	DLIST_ADD(ctdb->db_list, ctdb_db);
-
-	/* add well known functions */
-	ctdb_set_call(ctdb_db, ctdb_null_func, CTDB_NULL_FUNC);
-	ctdb_set_call(ctdb_db, ctdb_fetch_func, CTDB_FETCH_FUNC);
-	ctdb_set_call(ctdb_db, ctdb_fetch_with_header_func, CTDB_FETCH_WITH_HEADER_FUNC);
-
-	return ctdb_db;
-}
-
-/*
-  setup a call for a database
- */
-int ctdb_set_call(struct ctdb_db_context *ctdb_db, ctdb_fn_t fn, uint32_t id)
-{
-	struct ctdb_registered_call *call;
-
-	/* register locally */
-	call = talloc(ctdb_db, struct ctdb_registered_call);
-	call->fn = fn;
-	call->id = id;
-
-	DLIST_ADD(ctdb_db->calls, call);
-	return 0;
-}
-
 /* Freeze all databases */
 int ctdb_ctrl_freeze(struct ctdb_context *ctdb, struct timeval timeout,
 		     uint32_t destnode)
diff --git a/ctdb/server/ctdb_ltdb_server.c b/ctdb/server/ctdb_ltdb_server.c
index 970eb54b00b..ce3569fe7b1 100644
--- a/ctdb/server/ctdb_ltdb_server.c
+++ b/ctdb/server/ctdb_ltdb_server.c
@@ -1135,9 +1135,16 @@ int32_t ctdb_control_db_attach(struct ctdb_context *ctdb,
 			return -1;
 		}
 
-		if (ctdb->recovery_mode == CTDB_RECOVERY_ACTIVE &&
-		    client->pid != ctdb->recoverd_pid &&
-		    ctdb->runstate < CTDB_RUNSTATE_RUNNING) {
+		if ((c->flags & CTDB_CTRL_FLAG_ATTACH_RECOVERY) &&
+		    ctdb->recovery_mode != CTDB_RECOVERY_ACTIVE) {
+			DBG_ERR("Attach from recovery refused because "
+				"recovery is not active\n");
+			return -1;
+		}
+
+		if (!(c->flags & CTDB_CTRL_FLAG_ATTACH_RECOVERY) &&
+		    (ctdb->recovery_mode == CTDB_RECOVERY_ACTIVE ||
+		     ctdb->runstate < CTDB_RUNSTATE_STARTUP)) {
 			struct ctdb_deferred_attach_context *da_ctx = talloc(client, struct ctdb_deferred_attach_context);
 
 			if (da_ctx == NULL) {
diff --git a/ctdb/server/ctdb_recoverd.c b/ctdb/server/ctdb_recoverd.c
index 6fddb44a014..ee083e92fb1 100644
--- a/ctdb/server/ctdb_recoverd.c
+++ b/ctdb/server/ctdb_recoverd.c
@@ -424,140 +424,6 @@ static int set_recovery_mode(struct ctdb_context *ctdb,
 	return 0;
 }
 
-/*
-  ensure all other nodes have attached to any databases that we have
- */
-static int create_missing_remote_databases(struct ctdb_context *ctdb, struct ctdb_node_map_old *nodemap, 
-					   uint32_t pnn, struct ctdb_dbid_map_old *dbmap, TALLOC_CTX *mem_ctx)
-{
-	unsigned int i, j, db;
-	int ret;
-	struct ctdb_dbid_map_old *remote_dbmap;
-
-	/* verify that all other nodes have all our databases */
-	for (j=0; j<nodemap->num; j++) {
-		/* we don't need to ourself ourselves */
-		if (nodemap->nodes[j].pnn == pnn) {
-			continue;
-		}
-		/* don't check nodes that are unavailable */
-		if (nodemap->nodes[j].flags & NODE_FLAGS_INACTIVE) {
-			continue;
-		}
-
-		ret = ctdb_ctrl_getdbmap(ctdb, CONTROL_TIMEOUT(), nodemap->nodes[j].pnn, 
-					 mem_ctx, &remote_dbmap);
-		if (ret != 0) {
-			DEBUG(DEBUG_ERR, (__location__ " Unable to get dbids from node %u\n", pnn));
-			return -1;
-		}
-
-		/* step through all local databases */
-		for (db=0; db<dbmap->num;db++) {
-			const char *name;
-
-
-			for (i=0;i<remote_dbmap->num;i++) {
-				if (dbmap->dbs[db].db_id == remote_dbmap->dbs[i].db_id) {
-					break;
-				}
-			}
-			/* the remote node already have this database */
-			if (i!=remote_dbmap->num) {
-				continue;
-			}
-			/* ok so we need to create this database */
-			ret = ctdb_ctrl_getdbname(ctdb, CONTROL_TIMEOUT(), pnn,
-						  dbmap->dbs[db].db_id, mem_ctx,
-						  &name);
-			if (ret != 0) {
-				DEBUG(DEBUG_ERR, (__location__ " Unable to get dbname from node %u\n", pnn));
-				return -1;
-			}
-			ret = ctdb_ctrl_createdb(ctdb, CONTROL_TIMEOUT(),
-						 nodemap->nodes[j].pnn,
-						 mem_ctx, name,
-						 dbmap->dbs[db].flags, NULL);
-			if (ret != 0) {
-				DEBUG(DEBUG_ERR, (__location__ " Unable to create remote db:%s\n", name));
-				return -1;
-			}
-		}
-	}
-
-	return 0;
-}
-
-
-/*
-  ensure we are attached to any databases that anyone else is attached to
- */
-static int create_missing_local_databases(struct ctdb_context *ctdb, struct ctdb_node_map_old *nodemap, 
-					  uint32_t pnn, struct ctdb_dbid_map_old **dbmap, TALLOC_CTX *mem_ctx)
-{
-	unsigned int i, j, db;
-	int ret;
-	struct ctdb_dbid_map_old *remote_dbmap;
-
-	/* verify that we have all database any other node has */
-	for (j=0; j<nodemap->num; j++) {
-		/* we don't need to ourself ourselves */
-		if (nodemap->nodes[j].pnn == pnn) {
-			continue;
-		}
-		/* don't check nodes that are unavailable */
-		if (nodemap->nodes[j].flags & NODE_FLAGS_INACTIVE) {
-			continue;
-		}
-
-		ret = ctdb_ctrl_getdbmap(ctdb, CONTROL_TIMEOUT(), nodemap->nodes[j].pnn, 
-					 mem_ctx, &remote_dbmap);
-		if (ret != 0) {
-			DEBUG(DEBUG_ERR, (__location__ " Unable to get dbids from node %u\n", pnn));
-			return -1;
-		}
-
-		/* step through all databases on the remote node */
-		for (db=0; db<remote_dbmap->num;db++) {
-			const char *name;
-
-			for (i=0;i<(*dbmap)->num;i++) {
-				if (remote_dbmap->dbs[db].db_id == (*dbmap)->dbs[i].db_id) {
-					break;
-				}
-			}
-			/* we already have this db locally */
-			if (i!=(*dbmap)->num) {
-				continue;
-			}
-			/* ok so we need to create this database and
-			   rebuild dbmap
-			 */
-			ctdb_ctrl_getdbname(ctdb, CONTROL_TIMEOUT(), nodemap->nodes[j].pnn, 
-					    remote_dbmap->dbs[db].db_id, mem_ctx, &name);
-			if (ret != 0) {
-				DEBUG(DEBUG_ERR, (__location__ " Unable to get dbname from node %u\n", 
-					  nodemap->nodes[j].pnn));
-				return -1;
-			}
-			ctdb_ctrl_createdb(ctdb, CONTROL_TIMEOUT(), pnn,
-					   mem_ctx, name,
-					   remote_dbmap->dbs[db].flags, NULL);
-			if (ret != 0) {
-				DEBUG(DEBUG_ERR, (__location__ " Unable to create local db:%s\n", name));


-- 
Samba Shared Repository



More information about the samba-cvs mailing list