[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Tue Dec 5 03:59:03 UTC 2017


The branch, master has been updated
       via  41cfc73 lib: Remove unused serverid.tdb
       via  6423ca4 lib: Use messaging_send_all instead of message_send_all
       via  77cccbc lib: Add messaging_send_all
       via  2fdde4a messaging: Always register CTDB_SRVID_SAMBA_PROCESS
       via  84fd51b messaging: Remove an unused #define
       via  2dfabd8 net: Remove "net serverid list"
       via  c9022d5 net: Remove "net serverid wipe"
       via  e8ac34d smbcontrol: Use messaging_dgm_forall
       via  05647d4 messaging_dgm: Use messaging_dgm_forall in dgm_wipe
       via  6b5b999 messaging: Add messaging_dgm_forall
       via  fc2f002 messaging: Remove the "n_sent" arg from message_send_all
       via  2dac8eb messaging_dgm: Protect against fork without reinit
      from  d80b8f2 Revert "selftest: mark samba3.smb2.kernel-oplocks as flapping"

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 41cfc737dfb2c751053a61917458a4a8cdb386b0
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Nov 5 12:58:09 2017 +0100

    lib: Remove unused serverid.tdb
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Tue Dec  5 04:58:26 CET 2017 on sn-devel-144

commit 6423ca4bf293cac5e2f84b1a37bb29b06b5c05ed
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Nov 5 12:54:10 2017 +0100

    lib: Use messaging_send_all instead of message_send_all
    
    Just a global search&replace
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 77cccbc6f4240926d448dd2e2a76d91ccc783729
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Nov 5 12:44:01 2017 +0100

    lib: Add messaging_send_all
    
    This will replace message_send_all. With messaging_dgm_forall we have
    a local broadcast mechanism, and ctdb can also broadcast
    everywhere. So there's no need for a separate traverse/send mechanism.
    
    There's no good error reporting mechanism for broadcasting, so make
    this function void.
    
    This drops the message_type filtering. I believe that this does not matter in
    practice, since messaging is a lot cheaper with dgm instead of the old tdb
    based messaging. If someone presents a use case where this matters, nowadays
    I'd much rather extend the messaging_dgm lock file format (where the unique id
    lives right now) with the filter bits.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 2fdde4a07a4e7f28cd9cbd0ac9a0bae3fa748522
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Jul 25 17:10:27 2017 +0200

    messaging: Always register CTDB_SRVID_SAMBA_PROCESS
    
    This will be used to broadcast to all processes, avoiding the costly
    traverse of serverid.tdb.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 84fd51ba6103957f64021e6543314bcbe1f389af
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Jul 25 16:24:04 2017 +0200

    messaging: Remove an unused #define
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 2dfabd85d95fcb2b22112eb86c9dedd356c8590f
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Nov 5 12:09:08 2017 +0100

    net: Remove "net serverid list"
    
    Traversing a clustered tdb is a pretty expensive operation. If someone
    really needs this command-line interface, we can re-add it for the local
    node using messaging_dgm_forall. If someone needs that globally, there's
    the "onnode all" script that could be used. Alternatively, we could
    implement an enhanced ping broadcast message also returning a processes
    unique id.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit c9022d594b19051a5600d7e2955c3bd73a2988ea
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Nov 5 12:02:26 2017 +0100

    net: Remove "net serverid wipe"
    
    This used to be a hygiene command for clustered node startup. In
    clustered mode, CLEAR_IF_FIRST does not work, records can stay alive
    by means of recovery. serverid.tdb will soon die, so remove this
    command.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit e8ac34d3f73b45702459af6ec878f156075520b2
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Oct 26 17:18:36 2017 +0200

    smbcontrol: Use messaging_dgm_forall
    
    Doing stacktraces can be done locally only anyway
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 05647d4723321081959dd02a5035419335b38c6e
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Oct 16 21:52:35 2017 +0200

    messaging_dgm: Use messaging_dgm_forall in dgm_wipe
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 6b5b999d2f324889827223fc3d0ac74a76530092
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jul 21 19:03:26 2017 +0200

    messaging: Add messaging_dgm_forall
    
    This factors out the traversal function from _wipe. It will be used to
    replace message_send_all soon.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit fc2f0023a0ea521c5bc392db8f635bc3f23f68b8
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jul 21 19:08:43 2017 +0200

    messaging: Remove the "n_sent" arg from message_send_all
    
    The only user of this is an informative message in smbcontrol. I don't think
    that's worth the effort.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 2dac8eb2778802847688ef862f375440d3aa0ff4
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Nov 25 16:47:24 2017 +0100

    messaging_dgm: Protect against fork without reinit
    
    In the wake of bug 13150 we've discussed that this could happen even
    without clustering. This adds code to make sure that whenever messaging
    is used the pid and the files used match.
    
    It's pretty heavy-weight, thus I made it DEVELOPER only. My gut feeling
    is that the getsockname is cheap, but the stat call might be a bit too
    expensive.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 source3/include/ctdb_srvids.h               |   6 +
 source3/include/messages.h                  |  14 +-
 source3/include/serverid.h                  |  50 ----
 source3/lib/messages.c                      |  74 ++++++
 source3/lib/messages_ctdb.c                 |   9 +
 source3/lib/messages_dgm.c                  | 135 ++++++++++-
 source3/lib/messages_dgm.h                  |   2 +
 source3/lib/serverid.c                      | 350 ----------------------------
 source3/nmbd/nmbd.c                         |  10 -
 source3/passdb/pdb_interface.c              |   9 +-
 source3/printing/nt_printing.c              |   4 -
 source3/printing/queue_process.c            |   9 +-
 source3/printing/spoolssd.c                 |  13 --
 source3/rpc_server/epmd.c                   |   9 -
 source3/rpc_server/fss/srv_fss_agent.c      |   9 +-
 source3/rpc_server/fssd.c                   |   9 -
 source3/rpc_server/lsasd.c                  |  11 -
 source3/rpc_server/mdssd.c                  |  11 -
 source3/rpc_server/spoolss/srv_spoolss_nt.c |   4 +-
 source3/rpc_server/srvsvc/srv_srvsvc_nt.c   |  10 +-
 source3/smbd/negprot.c                      |   8 -
 source3/smbd/process.c                      |   9 -
 source3/smbd/scavenger.c                    |   8 -
 source3/smbd/server.c                       |  20 --
 source3/smbd/server_exit.c                  |   8 -
 source3/smbd/smbd_cleanupd.c                |  16 +-
 source3/smbd/statcache.c                    |   9 +-
 source3/torture/vfstest.c                   |   2 -
 source3/utils/net_serverid.c                |  58 -----
 source3/utils/smbcontrol.c                  |  19 +-
 source3/winbindd/winbindd.c                 |  14 --
 31 files changed, 242 insertions(+), 677 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/ctdb_srvids.h b/source3/include/ctdb_srvids.h
index 500b506..b51a458 100644
--- a/source3/include/ctdb_srvids.h
+++ b/source3/include/ctdb_srvids.h
@@ -38,3 +38,9 @@
  * locally according to the non-clustered local notify.tdb
  */
 #define CTDB_SRVID_SAMBA_NOTIFY_PROXY  0xFE00000000000001LL
+
+/*
+ * SRVID for all processes that come from Samba. Used to be
+ * MSG_SRVID_SAMBA in the past. Now used for message_send_all.
+ */
+#define CTDB_SRVID_SAMBA_PROCESS  0xFE00000000000002LL
diff --git a/source3/include/messages.h b/source3/include/messages.h
index 8d3b1d8..29c394a 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -35,18 +35,6 @@
  */
 #define MSG_FLAG_LOWPRIORITY		0x80000000
 
-
-/*
- * ctdb gives us 64-bit server ids for messaging_send. This is done to avoid
- * pid clashes and to be able to register for special messages like "all
- * smbds".
- *
- * Normal individual server id's have the upper 32 bits to 0, I picked "1" for
- * Samba, other subsystems might use something else.
- */
-
-#define MSG_SRVID_SAMBA 0x0000000100000000LL
-
 #include "librpc/gen_ndr/server_id.h"
 #include "lib/util/data_blob.h"
 #include "system/network.h"
@@ -108,6 +96,8 @@ NTSTATUS messaging_send_iov(struct messaging_context *msg_ctx,
 			    struct server_id server, uint32_t msg_type,
 			    const struct iovec *iov, int iovlen,
 			    const int *fds, size_t num_fds);
+void messaging_send_all(struct messaging_context *msg_ctx,
+			int msg_type, const void *buf, size_t len);
 
 struct tevent_req *messaging_filtered_read_send(
 	TALLOC_CTX *mem_ctx, struct tevent_context *ev,
diff --git a/source3/include/serverid.h b/source3/include/serverid.h
index 749b950..89487cf 100644
--- a/source3/include/serverid.h
+++ b/source3/include/serverid.h
@@ -21,61 +21,11 @@
 #define __SERVERID_H__
 
 #include "replace.h"
-#include "lib/dbwrap/dbwrap.h"
 #include "librpc/gen_ndr/server_id.h"
 
-/* Flags to classify messages - used in message_send_all() */
-/* Sender will filter by flag. */
-
-#define FLAG_MSG_GENERAL		0x0001
-#define FLAG_MSG_SMBD			0x0002
-#define FLAG_MSG_NMBD			0x0004
-#define FLAG_MSG_WINBIND		0x0008
-#define FLAG_MSG_PRINT_GENERAL		0x0010
-/* dbwrap messages 4001-4999 */
-#define FLAG_MSG_DBWRAP			0x0020
-
-/*
- * Register a server with its unique id
- */
-bool serverid_register(const struct server_id id, uint32_t msg_flags);
-
-/*
- * De-register a server with its unique id
- */
-bool serverid_deregister(const struct server_id id);
-
 /*
  * Check existence of a server id
  */
 bool serverid_exists(const struct server_id *id);
 
-/*
- * Walk the list of server_ids registered
- */
-bool serverid_traverse(int (*fn)(struct db_record *rec,
-				 const struct server_id *id,
-				 uint32_t msg_flags,
-				 void *private_data),
-		       void *private_data);
-
-/*
- * Walk the list of server_ids registered read-only
- */
-bool serverid_traverse_read(int (*fn)(const struct server_id *id,
-				      uint32_t msg_flags,
-				      void *private_data),
-			    void *private_data);
-/*
- * Ensure CLEAR_IF_FIRST works fine, to be called from the parent smbd
- */
-bool serverid_parent_init(TALLOC_CTX *mem_ctx);
-
-struct messaging_context;
-
-bool message_send_all(struct messaging_context *msg_ctx,
-		      int msg_type,
-		      const void *buf, size_t len,
-		      int *n_sent);
-
 #endif
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 01029b2..a0a3f9f 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -60,6 +60,12 @@
 #include "lib/messages_ctdb_ref.h"
 #include "lib/messages_util.h"
 #include "cluster_support.h"
+#include "ctdbd_conn.h"
+#include "ctdb_srvids.h"
+
+#ifdef CLUSTER_SUPPORT
+#include "ctdb_protocol.h"
+#endif
 
 struct messaging_callback {
 	struct messaging_callback *prev, *next;
@@ -513,6 +519,7 @@ static NTSTATUS messaging_init_internal(TALLOC_CTX *mem_ctx,
 	}
 	talloc_set_destructor(ctx, messaging_context_destructor);
 
+#ifdef CLUSTER_SUPPORT
 	if (lp_clustering()) {
 		ctx->msg_ctdb_ref = messaging_ctdb_ref(
 			ctx, ctx->event_ctx,
@@ -525,6 +532,8 @@ static NTSTATUS messaging_init_internal(TALLOC_CTX *mem_ctx,
 			goto done;
 		}
 	}
+#endif
+
 	ctx->id.vnn = get_my_vnn();
 
 	ctx->names_db = server_id_db_init(ctx,
@@ -836,6 +845,71 @@ NTSTATUS messaging_send_iov(struct messaging_context *msg_ctx,
 	return NT_STATUS_OK;
 }
 
+struct send_all_state {
+	struct messaging_context *msg_ctx;
+	int msg_type;
+	const void *buf;
+	size_t len;
+};
+
+static int send_all_fn(pid_t pid, void *private_data)
+{
+	struct send_all_state *state = private_data;
+	NTSTATUS status;
+
+	status = messaging_send_buf(state->msg_ctx, pid_to_procid(pid),
+				    state->msg_type, state->buf, state->len);
+	if (!NT_STATUS_IS_OK(status)) {
+		DBG_WARNING("messaging_send_buf to %ju failed: %s\n",
+			    (uintmax_t)pid, nt_errstr(status));
+	}
+
+	return 0;
+}
+
+void messaging_send_all(struct messaging_context *msg_ctx,
+			int msg_type, const void *buf, size_t len)
+{
+	struct send_all_state state = {
+		.msg_ctx = msg_ctx, .msg_type = msg_type,
+		.buf = buf, .len = len
+	};
+	int ret;
+
+#ifdef CLUSTER_SUPPORT
+	if (lp_clustering()) {
+		struct ctdbd_connection *conn = messaging_ctdb_connection();
+		uint8_t msghdr[MESSAGE_HDR_LENGTH];
+		struct iovec iov[] = {
+			{ .iov_base = msghdr,
+			  .iov_len = sizeof(msghdr) },
+			{ .iov_base = discard_const_p(void, buf),
+			  .iov_len = len }
+		};
+
+		message_hdr_put(msghdr, msg_type, messaging_server_id(msg_ctx),
+				(struct server_id) {0});
+
+		ret = ctdbd_messaging_send_iov(
+			conn, CTDB_BROADCAST_CONNECTED,
+			CTDB_SRVID_SAMBA_PROCESS,
+			iov, ARRAY_SIZE(iov));
+		if (ret != 0) {
+			DBG_WARNING("ctdbd_messaging_send_iov failed: %s\n",
+				    strerror(ret));
+		}
+
+		return;
+	}
+#endif
+
+	ret = messaging_dgm_forall(send_all_fn, &state);
+	if (ret != 0) {
+		DBG_WARNING("messaging_dgm_forall failed: %s\n",
+			    strerror(ret));
+	}
+}
+
 static struct messaging_rec *messaging_rec_dup(TALLOC_CTX *mem_ctx,
 					       struct messaging_rec *rec)
 {
diff --git a/source3/lib/messages_ctdb.c b/source3/lib/messages_ctdb.c
index a2a7c21..66b9f55 100644
--- a/source3/lib/messages_ctdb.c
+++ b/source3/lib/messages_ctdb.c
@@ -26,6 +26,7 @@
 #include "lib/messages_util.h"
 #include "ctdbd_conn.h"
 #include "lib/cluster_support.h"
+#include "ctdb_srvids.h"
 
 struct messaging_ctdb_context;
 
@@ -111,6 +112,14 @@ int messaging_ctdb_init(const char *sockname, int timeout, uint64_t unique_id,
 		goto fail;
 	}
 
+	ret = register_with_ctdbd(ctx->conn, CTDB_SRVID_SAMBA_PROCESS,
+				  messaging_ctdb_recv, ctx);
+	if (ret != 0) {
+		DBG_DEBUG("register_with_ctdbd returned %s (%d)\n",
+			  strerror(ret), ret);
+		goto fail;
+	}
+
 	ret = register_with_ctdbd(ctx->conn, unique_id, NULL, NULL);
 	if (ret != 0) {
 		DBG_DEBUG("register_with_ctdbd returned %s (%d)\n",
diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index 9d87746..b9cddc2 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -1138,6 +1138,88 @@ static int messaging_dgm_context_destructor(struct messaging_dgm_context *c)
 	return 0;
 }
 
+static void messaging_dgm_validate(struct messaging_dgm_context *ctx)
+{
+#ifdef DEVELOPER
+	pid_t pid = getpid();
+	struct sockaddr_storage addr;
+	socklen_t addrlen = sizeof(addr);
+	struct sockaddr_un *un_addr;
+	struct sun_path_buf pathbuf;
+	struct stat st1, st2;
+	int ret;
+
+	/*
+	 * Protect against using the wrong messaging context after a
+	 * fork without reinit_after_fork.
+	 */
+
+	ret = getsockname(ctx->sock, (struct sockaddr *)&addr, &addrlen);
+	if (ret == -1) {
+		DBG_ERR("getsockname failed: %s\n", strerror(errno));
+		goto fail;
+	}
+	if (addr.ss_family != AF_UNIX) {
+		DBG_ERR("getsockname returned family %d\n",
+			(int)addr.ss_family);
+		goto fail;
+	}
+	un_addr = (struct sockaddr_un *)&addr;
+
+	ret = snprintf(pathbuf.buf, sizeof(pathbuf.buf),
+		       "%s/%u", ctx->socket_dir.buf, (unsigned)pid);
+	if (ret < 0) {
+		DBG_ERR("snprintf failed: %s\n", strerror(errno));
+		goto fail;
+	}
+	if ((size_t)ret >= sizeof(pathbuf.buf)) {
+		DBG_ERR("snprintf returned %d chars\n", (int)ret);
+		goto fail;
+	}
+
+	if (strcmp(pathbuf.buf, un_addr->sun_path) != 0) {
+		DBG_ERR("sockname wrong: Expected %s, got %s\n",
+			pathbuf.buf, un_addr->sun_path);
+		goto fail;
+	}
+
+	ret = snprintf(pathbuf.buf, sizeof(pathbuf.buf),
+		       "%s/%u", ctx->lockfile_dir.buf, (unsigned)pid);
+	if (ret < 0) {
+		DBG_ERR("snprintf failed: %s\n", strerror(errno));
+		goto fail;
+	}
+	if ((size_t)ret >= sizeof(pathbuf.buf)) {
+		DBG_ERR("snprintf returned %d chars\n", (int)ret);
+		goto fail;
+	}
+
+	ret = stat(pathbuf.buf, &st1);
+	if (ret == -1) {
+		DBG_ERR("stat failed: %s\n", strerror(errno));
+		goto fail;
+	}
+	ret = fstat(ctx->lockfile_fd, &st2);
+	if (ret == -1) {
+		DBG_ERR("fstat failed: %s\n", strerror(errno));
+		goto fail;
+	}
+
+	if ((st1.st_dev != st2.st_dev) || (st1.st_ino != st2.st_ino)) {
+		DBG_ERR("lockfile differs, expected (%d/%d), got (%d/%d)\n",
+			(int)st2.st_dev, (int)st2.st_ino,
+			(int)st1.st_dev, (int)st1.st_ino);
+		goto fail;
+	}
+
+	return;
+fail:
+	abort();
+#else
+	return;
+#endif
+}
+
 static void messaging_dgm_recv(struct messaging_dgm_context *ctx,
 			       struct tevent_context *ev,
 			       uint8_t *msg, size_t msg_len,
@@ -1162,6 +1244,8 @@ static void messaging_dgm_read_handler(struct tevent_context *ev,
 	uint8_t msgbuf[msgbufsize];
 	uint8_t buf[MESSAGING_DGM_FRAGMENT_LENGTH];
 
+	messaging_dgm_validate(ctx);
+
 	if ((flags & TEVENT_FD_READ) == 0) {
 		return;
 	}
@@ -1336,6 +1420,8 @@ int messaging_dgm_send(pid_t pid,
 		return ENOTCONN;
 	}
 
+	messaging_dgm_validate(ctx);
+
 	ret = messaging_dgm_out_get(ctx, pid, &out);
 	if (ret != 0) {
 		return ret;
@@ -1385,6 +1471,8 @@ int messaging_dgm_get_unique(pid_t pid, uint64_t *unique)
 		return EBADF;
 	}
 
+	messaging_dgm_validate(ctx);
+
 	if (pid == getpid()) {
 		/*
 		 * Protect against losing our own lock
@@ -1474,18 +1562,46 @@ int messaging_dgm_cleanup(pid_t pid)
 	return 0;
 }
 
+static int messaging_dgm_wipe_fn(pid_t pid, void *private_data)
+{
+	pid_t *our_pid = (pid_t *)private_data;
+	int ret;
+
+	if (pid == *our_pid) {
+		/*
+		 * fcntl(F_GETLK) will succeed for ourselves, we hold
+		 * that lock ourselves.
+		 */
+		return 0;
+	}
+
+	ret = messaging_dgm_cleanup(pid);
+	DEBUG(10, ("messaging_dgm_cleanup(%lu) returned %s\n",
+		   (unsigned long)pid, ret ? strerror(ret) : "ok"));
+
+	return 0;
+}
+
 int messaging_dgm_wipe(void)
 {
+	pid_t pid = getpid();
+	messaging_dgm_forall(messaging_dgm_wipe_fn, &pid);
+	return 0;
+}
+
+int messaging_dgm_forall(int (*fn)(pid_t pid, void *private_data),
+			 void *private_data)
+{
 	struct messaging_dgm_context *ctx = global_dgm_context;
 	DIR *msgdir;
 	struct dirent *dp;
-	pid_t our_pid = getpid();
-	int ret;
 
 	if (ctx == NULL) {
 		return ENOTCONN;
 	}
 
+	messaging_dgm_validate(ctx);
+
 	/*
 	 * We scan the socket directory and not the lock directory. Otherwise
 	 * we would race against messaging_dgm_lockfile_create's open(O_CREAT)
@@ -1499,6 +1615,7 @@ int messaging_dgm_wipe(void)
 
 	while ((dp = readdir(msgdir)) != NULL) {
 		unsigned long pid;
+		int ret;
 
 		pid = strtoul(dp->d_name, NULL, 10);
 		if (pid == 0) {
@@ -1507,17 +1624,11 @@ int messaging_dgm_wipe(void)
 			 */
 			continue;
 		}
-		if ((pid_t)pid == our_pid) {
-			/*
-			 * fcntl(F_GETLK) will succeed for ourselves, we hold
-			 * that lock ourselves.
-			 */
-			continue;
-		}
 
-		ret = messaging_dgm_cleanup(pid);
-		DEBUG(10, ("messaging_dgm_cleanup(%lu) returned %s\n",
-			   pid, ret ? strerror(ret) : "ok"));
+		ret = fn(pid, private_data);
+		if (ret != 0) {
+			break;
+		}
 	}
 	closedir(msgdir);
 
diff --git a/source3/lib/messages_dgm.h b/source3/lib/messages_dgm.h
index ca11db1..7221c72 100644
--- a/source3/lib/messages_dgm.h
+++ b/source3/lib/messages_dgm.h
@@ -42,6 +42,8 @@ int messaging_dgm_send(pid_t pid,
 		       const int *fds, size_t num_fds);
 int messaging_dgm_cleanup(pid_t pid);
 int messaging_dgm_wipe(void);
+int messaging_dgm_forall(int (*fn)(pid_t pid, void *private_data),
+			 void *private_data);
 
 struct messaging_dgm_fde;
 struct messaging_dgm_fde *messaging_dgm_register_tevent_context(
diff --git a/source3/lib/serverid.c b/source3/lib/serverid.c
index 7300448..b4125cb 100644
--- a/source3/lib/serverid.c
+++ b/source3/lib/serverid.c
@@ -18,157 +18,13 @@
 */
 
 #include "includes.h"
-#include "system/filesys.h"
 #include "lib/util/server_id.h"
 #include "serverid.h"
-#include "util_tdb.h"
-#include "dbwrap/dbwrap.h"
-#include "dbwrap/dbwrap_open.h"
-#include "lib/tdb_wrap/tdb_wrap.h"
 #include "lib/param/param.h"
 #include "ctdbd_conn.h"
-#include "messages.h"
 #include "lib/messages_ctdb.h"
 #include "lib/messages_dgm.h"
 
-struct serverid_key {
-	pid_t pid;
-	uint32_t task_id;
-	uint32_t vnn;
-};
-
-struct serverid_data {
-	uint64_t unique_id;
-	uint32_t msg_flags;
-};
-
-static struct db_context *serverid_db(void)
-{
-	static struct db_context *db;
-	char *db_path;
-
-	if (db != NULL) {
-		return db;
-	}
-
-	db_path = lock_path("serverid.tdb");
-	if (db_path == NULL) {


-- 
Samba Shared Repository



More information about the samba-cvs mailing list