[SCM] CTDB repository - branch 1.0.114 updated - ctdb-1.0.114.6-10-g00f53a9

Michael Adam obnox at samba.org
Thu Aug 29 14:51:50 MDT 2013


The branch, 1.0.114 has been updated
       via  00f53a9a8f440be0bc993b1800383cd930fd273e (commit)
       via  6bfbc0aca625f0fb59df96beaee1e4c26178dc12 (commit)
       via  098b8fe9eb44ab7df718a7a80eb3078ed42802ba (commit)
       via  66e371d03f7a697d71aafb56257e30873c3d85cc (commit)
       via  c8470c203e2f5307e311b508b701fc75522a2d2d (commit)
       via  3c5259b88581828a9d613c81ee820c141bc5e0f3 (commit)
       via  a5329c7083f2a43c6c41abfb64bf1027fd4a8e3e (commit)
       via  b4bf0247ede40f2bbf39391ed9864dc041830fe8 (commit)
       via  7be3abc69333f58602ebf871d38ec138b908a36c (commit)
       via  0769ae857d1d6295cba93c4998070de95439863e (commit)
      from  527adf2f9a809d1d4ebc5d7c655496a510494098 (commit)

http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=1.0.114


- Log -----------------------------------------------------------------
commit 00f53a9a8f440be0bc993b1800383cd930fd273e
Author: Sumit Bose <sbose at redhat.com>
Date:   Wed Aug 10 17:14:40 2011 +0200

    Set FD_CLOEXEC for epoll file descriptors
    
    Don't leak file descriptors.
    This showed up as selinux AVCs on RHEL:
    https://bugzilla.redhat.com/show_bug.cgi?id=728545
    
    Reviewed-by: Michael Adam <obnox at samba.org>

commit 6bfbc0aca625f0fb59df96beaee1e4c26178dc12
Author: Sumit Bose <sbose at redhat.com>
Date:   Mon Nov 19 18:45:37 2012 +0100

    Print deleted nodes as well
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 0930a3b806977555509c3228726e2250aef1f971)
    
    Conflicts:
    
    	tools/ctdb.c

commit 098b8fe9eb44ab7df718a7a80eb3078ed42802ba
Author: Sumit Bose <sbose at redhat.com>
Date:   Thu Sep 1 15:18:46 2011 +0200

    IPv6 neighbor solicit cleanup
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit a81edf7eb908659a379f0cb55fd5d04551dc2c37)

commit 66e371d03f7a697d71aafb56257e30873c3d85cc
Author: Sumit Bose <sbose at redhat.com>
Date:   Mon Nov 19 11:13:03 2012 +0100

    Fix memory leak in ctdb_send_message()
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit da87395d29f5d11ecfedaf36b53fa060a9140bfd)

commit c8470c203e2f5307e311b508b701fc75522a2d2d
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 27 21:43:53 2011 +0200

    tdb: Fix Coverity ID 2192: NO_EFFECT
    
    (ret < 0) can never be true
    (cherry picked from commit 25397de589e577e32bb291576b10c18978b5bc4e)

commit 3c5259b88581828a9d613c81ee820c141bc5e0f3
Author: Sumit Bose <sbose at redhat.com>
Date:   Wed Aug 10 17:53:56 2011 +0200

    Fixes for various issues found by Coverity
    
    Corresponds to commit 05bfdbbd0d4abdfbcf28e3930086723508b35952 from master.

commit a5329c7083f2a43c6c41abfb64bf1027fd4a8e3e
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date:   Fri Sep 3 11:58:27 2010 +1000

    When memory allocations for recovery fails,
    dont dereference a null pointer while trying to print the log message for the failure.
    
    also shutdown ctdb with ctdb_fatal()
    (cherry picked from commit f8642d0438c6bbb34a72c25d6a904b626e247410)

commit b4bf0247ede40f2bbf39391ed9864dc041830fe8
Author: Rusty Russell <rusty at rustcorp.com.au>
Date:   Mon Dec 6 13:52:38 2010 +1030

    idtree: fix overflow for v. large ids on allocation and removal
    
    (Imported from SAMBA commit 09a6538969ac).
    
    Chris Cowan tracked down a SEGV in sub_alloc: idp->level can actually
    be equal to 7 (MAX_LEVEL) there, as it can be in sub_remove.
    
    (We unfairly blamed a shift of a signed var for this crash in commit
     2db1987f5a3a).
    
    Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>
    (cherry picked from commit 73764104356d3738d9d20a9d06ce51535f74f475)

commit 7be3abc69333f58602ebf871d38ec138b908a36c
Author: Rusty Russell <rusty at rustcorp.com.au>
Date:   Tue Oct 5 13:06:19 2010 +1030

    idtree: fix right shift of signed ints, crash on large ids on AIX
    
    Right-shifting signed integers in undefined; indeed it seems that on
    AIX with their compiler, doing a 30-bit shift on (INT_MAX-200) gives
    0, not 1 as we might expect.
    
    The obvious fix is to make id and oid unsigned: l (level count) is also
    logically unsigned.
    
    (Note: Samba doesn't generally get to ids > 1 billion, but ctdb does)
    
    Reported-by: Chris Cowan <cc at us.ibm.com>
    Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>
    
    Autobuild-User: Rusty Russell <rusty at samba.org>
    Autobuild-Date: Wed Oct  6 08:31:09 UTC 2010 on sn-devel-104
    (cherry picked from commit 2db1987f5a3a4268ce64fe570ff598e3bf4ecc73)

commit 0769ae857d1d6295cba93c4998070de95439863e
Author: Sumit Bose <sbose at redhat.com>
Date:   Mon Nov 19 11:20:31 2012 +0100

    Check return value of tdb_delete()
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 5cdcc3d45d358ddbcd7e864898eed9cbd9935429)

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

Summary of changes:
 client/ctdb_client.c         |    8 ++------
 common/ctdb_logging.c        |   12 ++++++++++--
 common/system_linux.c        |   15 ++++++++-------
 lib/events/events_standard.c |   13 +++++++++++++
 lib/tdb/common/tdb.c         |    2 +-
 lib/util/idtree.c            |    4 ++--
 server/ctdb_daemon.c         |    4 ++++
 server/ctdb_logging.c        |    4 ++++
 server/ctdb_ltdb_server.c    |    5 ++++-
 server/ctdb_recover.c        |   10 +++++-----
 server/ctdb_recoverd.c       |    4 ++--
 server/eventscript.c         |    4 +++-
 tcp/tcp_connect.c            |   10 +++++++++-
 tests/src/ctdb_fetch.c       |    5 +++++
 tools/ctdb.c                 |   13 ++++++++++++-
 15 files changed, 84 insertions(+), 29 deletions(-)


Changeset truncated at 500 lines:

diff --git a/client/ctdb_client.c b/client/ctdb_client.c
index c1b79af..45c9fad 100644
--- a/client/ctdb_client.c
+++ b/client/ctdb_client.c
@@ -526,12 +526,8 @@ int ctdb_send_message(struct ctdb_context *ctdb, uint32_t pnn,
 	memcpy(&r->data[0], data.dptr, data.dsize);
 	
 	res = ctdb_client_queue_pkt(ctdb, &r->hdr);
-	if (res != 0) {
-		return res;
-	}
-
 	talloc_free(r);
-	return 0;
+	return res;
 }
 
 
@@ -3071,7 +3067,7 @@ static void async_callback(struct ctdb_client_control_state *state)
 	struct ctdb_context *ctdb = talloc_get_type(state->ctdb, struct ctdb_context);
 	int ret;
 	TDB_DATA outdata;
-	int32_t res;
+	int32_t res = -1;
 	uint32_t destnode = state->c->hdr.destnode;
 
 	/* one more node has responded with recmode data */
diff --git a/common/ctdb_logging.c b/common/ctdb_logging.c
index ea4d271..8fd90b4 100644
--- a/common/ctdb_logging.c
+++ b/common/ctdb_logging.c
@@ -124,7 +124,7 @@ static void ctdb_collect_log(struct ctdb_context *ctdb, struct ctdb_get_log_addr
 		tm = localtime(&log_entries[tmp_entry].t.tv_sec);
 		strftime(tbuf, sizeof(tbuf)-1,"%Y/%m/%d %H:%M:%S", tm);
 
-		if (log_entries[tmp_entry].message) {
+		if (log_entries[tmp_entry].message[0] != '\0') {
 			count += fprintf(f, "%s:%s %s", tbuf, get_debug_by_level(log_entries[tmp_entry].level), log_entries[tmp_entry].message);
 		}
 
@@ -135,9 +135,17 @@ static void ctdb_collect_log(struct ctdb_context *ctdb, struct ctdb_get_log_addr
 	}
 
 	fsize = ftell(f);
+	if (fsize < 0) {
+		fclose(f);
+		DEBUG(DEBUG_ERR,("Cannot get current file position\n"));
+                return;
+	}
 	rewind(f);
 	data.dptr = talloc_size(NULL, fsize);
-	CTDB_NO_MEMORY_VOID(ctdb, data.dptr);
+	if (data.dptr == NULL) {
+		fclose(f);
+		CTDB_NO_MEMORY_VOID(ctdb, data.dptr);
+	}
 	data.dsize = fread(data.dptr, 1, fsize, f);
 	fclose(f);
 
diff --git a/common/system_linux.c b/common/system_linux.c
index b8aace4..b36a78d 100644
--- a/common/system_linux.c
+++ b/common/system_linux.c
@@ -75,7 +75,7 @@ int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface)
 	struct ether_header *eh;
 	struct arphdr *ah;
 	struct ip6_hdr *ip6;
-	struct icmp6_hdr *icmp6;
+	struct nd_neighbor_solicit *nd_ns;
 	struct ifreq if_hwaddr;
 	unsigned char buffer[78]; /* ipv6 neigh solicitation size */
 	char *ptr;
@@ -223,17 +223,18 @@ int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface)
 
 		ip6 = (struct ip6_hdr *)(eh+1);
 		ip6->ip6_vfc  = 0x60;
-		ip6->ip6_plen = htons(24);
+		ip6->ip6_plen = htons(sizeof(*nd_ns));
 		ip6->ip6_nxt  = IPPROTO_ICMPV6;
 		ip6->ip6_hlim = 255;
 		ip6->ip6_dst  = addr->ip6.sin6_addr;
 
-		icmp6 = (struct icmp6_hdr *)(ip6+1);
-		icmp6->icmp6_type = ND_NEIGHBOR_SOLICIT;
-		icmp6->icmp6_code = 0;
-		memcpy(&icmp6->icmp6_data32[1], &addr->ip6.sin6_addr, 16);
+		nd_ns = (struct nd_neighbor_solicit *)(ip6+1);
+		nd_ns->nd_ns_type = ND_NEIGHBOR_SOLICIT;
+		nd_ns->nd_ns_code = 0;
+		nd_ns->nd_ns_reserved = 0;
+		nd_ns->nd_ns_target = addr->ip6.sin6_addr;
 
-		icmp6->icmp6_cksum = tcp_checksum6((uint16_t *)icmp6, ntohs(ip6->ip6_plen), ip6);
+		nd_ns->nd_ns_cksum = tcp_checksum6((uint16_t *)nd_ns, ntohs(ip6->ip6_plen), ip6);
 
 		sall.sll_family = AF_PACKET;
 		sall.sll_halen = 6;
diff --git a/lib/events/events_standard.c b/lib/events/events_standard.c
index 6537d27..be0a03b 100644
--- a/lib/events/events_standard.c
+++ b/lib/events/events_standard.c
@@ -100,7 +100,14 @@ static int epoll_ctx_destructor(struct std_event_context *std_ev)
 */
 static void epoll_init_ctx(struct std_event_context *std_ev)
 {
+	unsigned v;
+
 	std_ev->epoll_fd = epoll_create(64);
+
+	/* on exec, don't inherit the fd */
+	v = fcntl(std_ev->epoll_fd, F_GETFD, 0);
+	fcntl(std_ev->epoll_fd, F_SETFD, v | FD_CLOEXEC);
+
 	std_ev->pid = getpid();
 	talloc_set_destructor(std_ev, epoll_ctx_destructor);
 }
@@ -115,6 +122,7 @@ static void epoll_add_event(struct std_event_context *std_ev, struct fd_event *f
 static void epoll_check_reopen(struct std_event_context *std_ev)
 {
 	struct fd_event *fde;
+	unsigned v;
 
 	if (std_ev->pid == getpid()) {
 		return;
@@ -126,6 +134,11 @@ static void epoll_check_reopen(struct std_event_context *std_ev)
 		DEBUG(0,("Failed to recreate epoll handle after fork\n"));
 		return;
 	}
+
+	/* on exec, don't inherit the fd */
+	v = fcntl(std_ev->epoll_fd, F_GETFD, 0);
+	fcntl(std_ev->epoll_fd, F_SETFD, v | FD_CLOEXEC);
+
 	std_ev->pid = getpid();
 	for (fde=std_ev->fd_events;fde;fde=fde->next) {
 		epoll_add_event(std_ev, fde);
diff --git a/lib/tdb/common/tdb.c b/lib/tdb/common/tdb.c
index 4d8c5fc..eeadf2f 100644
--- a/lib/tdb/common/tdb.c
+++ b/lib/tdb/common/tdb.c
@@ -993,7 +993,7 @@ int tdb_repack(struct tdb_context *tdb)
 bool tdb_write_all(int fd, const void *buf, size_t count)
 {
 	while (count) {
-		size_t ret;
+		ssize_t ret;
 		ret = write(fd, buf, count);
 		if (ret < 0)
 			return false;
diff --git a/lib/util/idtree.c b/lib/util/idtree.c
index 06544e1..7c8bd87 100644
--- a/lib/util/idtree.c
+++ b/lib/util/idtree.c
@@ -104,8 +104,8 @@ static int sub_alloc(struct idr_context *idp, void *ptr, int *starting_id)
 {
 	int n, m, sh;
 	struct idr_layer *p, *new;
-	struct idr_layer *pa[MAX_LEVEL];
-	int l, id, oid;
+	struct idr_layer *pa[MAX_LEVEL+1];
+	unsigned int l, id, oid;
 	uint32_t bm;
 
 	memset(pa, 0, sizeof(pa));
diff --git a/server/ctdb_daemon.c b/server/ctdb_daemon.c
index 1876f56..37a756b 100644
--- a/server/ctdb_daemon.c
+++ b/server/ctdb_daemon.c
@@ -822,6 +822,10 @@ int ctdb_start_daemon(struct ctdb_context *ctdb, bool do_fork, bool use_syslog)
 	fde = event_add_fd(ctdb->ev, ctdb, ctdb->daemon.sd, 
 			   EVENT_FD_READ|EVENT_FD_AUTOCLOSE, 
 			   ctdb_accept_client, ctdb);
+	if (fde == NULL) {
+		DEBUG(DEBUG_CRIT,("Failed to add daemon socket to event loop\n"));
+		exit(1);
+	}
 
 	/* release any IPs we hold from previous runs of the daemon */
 	ctdb_release_all_ips(ctdb);
diff --git a/server/ctdb_logging.c b/server/ctdb_logging.c
index 7881c2f..eb155ca 100644
--- a/server/ctdb_logging.c
+++ b/server/ctdb_logging.c
@@ -502,6 +502,10 @@ int ctdb_set_child_logging(struct ctdb_context *ctdb)
 	/* We'll fail if stderr/stdout not already open; it's simpler. */
 	old_stdout = dup(STDOUT_FILENO);
 	old_stderr = dup(STDERR_FILENO);
+        if (old_stdout < 0 || old_stderr < 0) {
+		DEBUG(DEBUG_ERR,(__location__ " Failed to copy files descriptors\n"));
+		return -1;
+        }
 	if (dup2(p[1], STDOUT_FILENO) < 0 || dup2(p[1], STDERR_FILENO) < 0) {
 		int saved_errno = errno;
 		dup2(old_stdout, STDOUT_FILENO);
diff --git a/server/ctdb_ltdb_server.c b/server/ctdb_ltdb_server.c
index 7cc06fc..1470932 100644
--- a/server/ctdb_ltdb_server.c
+++ b/server/ctdb_ltdb_server.c
@@ -1042,7 +1042,10 @@ static int ctdb_attach_persistent(struct ctdb_context *ctdb,
 		int invalid_name = 0;
 		
 		s = talloc_strdup(ctdb, de->d_name);
-		CTDB_NO_MEMORY(ctdb, s);
+		if (s == NULL) {
+			closedir(d);
+			CTDB_NO_MEMORY(ctdb, s);
+		}
 
 		/* only accept names ending in .tdb */
 		p = strstr(s, ".tdb.");
diff --git a/server/ctdb_recover.c b/server/ctdb_recover.c
index 9d360c7..f5fa257 100644
--- a/server/ctdb_recover.c
+++ b/server/ctdb_recover.c
@@ -340,10 +340,8 @@ static int traverse_pulldb(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data,
 	}
 	params->pulldata = talloc_realloc_size(NULL, params->pulldata, rec->length + params->len);
 	if (params->pulldata == NULL) {
-		DEBUG(DEBUG_ERR,(__location__ " Failed to expand pulldb_data to %u (%u records)\n", 
-			 rec->length + params->len, params->pulldata->count));
-		params->failed = true;
-		return -1;
+		DEBUG(DEBUG_CRIT,(__location__ " Failed to expand pulldb_data to %u\n", rec->length + params->len));
+		ctdb_fatal(params->ctdb, "failed to allocate memory for recovery. shutting down\n");
 	}
 	params->pulldata->count++;
 	memcpy(params->len+(uint8_t *)params->pulldata, rec, rec->length);
@@ -824,7 +822,9 @@ static int delete_tdb_record(struct ctdb_context *ctdb, struct ctdb_db_context *
 
 	if (data.dsize < sizeof(struct ctdb_ltdb_header)) {
 		if (tdb_lock_nonblock(ctdb_db->ltdb->tdb, -1, F_WRLCK) == 0) {
-			tdb_delete(ctdb_db->ltdb->tdb, key);
+			if (tdb_delete(ctdb_db->ltdb->tdb, key) != 0) {
+				DEBUG(DEBUG_CRIT,(__location__ " Failed to delete corrupt record\n"));
+			}
 			tdb_unlock(ctdb_db->ltdb->tdb, -1, F_WRLCK);
 			DEBUG(DEBUG_CRIT,(__location__ " Deleted corrupt record\n"));
 		}
diff --git a/server/ctdb_recoverd.c b/server/ctdb_recoverd.c
index 9bd7e95..db2a2ca 100644
--- a/server/ctdb_recoverd.c
+++ b/server/ctdb_recoverd.c
@@ -1079,8 +1079,8 @@ static int traverse_recdb(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data,
 	}
 	params->recdata = talloc_realloc_size(NULL, params->recdata, rec->length + params->len);
 	if (params->recdata == NULL) {
-		DEBUG(DEBUG_CRIT,(__location__ " Failed to expand recdata to %u (%u records)\n", 
-			 rec->length + params->len, params->recdata->count));
+		DEBUG(DEBUG_CRIT,(__location__ " Failed to expand recdata to %u\n",
+			 rec->length + params->len));
 		params->failed = true;
 		return -1;
 	}
diff --git a/server/eventscript.c b/server/eventscript.c
index 757b254..182aed6 100644
--- a/server/eventscript.c
+++ b/server/eventscript.c
@@ -222,6 +222,7 @@ static struct ctdb_scripts_wire *ctdb_get_script_list(struct ctdb_context *ctdb,
 		tree_item = talloc(tree, struct ctdb_script_tree_item);
 		if (tree_item == NULL) {
 			DEBUG(DEBUG_ERR, (__location__ " Failed to allocate new tree item\n"));
+			closedir(dir);
 			talloc_free(tmp_ctx);
 			return NULL;
 		}
@@ -234,6 +235,7 @@ static struct ctdb_scripts_wire *ctdb_get_script_list(struct ctdb_context *ctdb,
 		tree_item->name = talloc_strdup(tree_item, de->d_name);
 		if (tree_item->name == NULL) {
 			DEBUG(DEBUG_ERR,(__location__ " Failed to allocate script name.\n"));
+			closedir(dir);
 			talloc_free(tmp_ctx);
 			return NULL;
 		}
@@ -777,10 +779,10 @@ int ctdb_event_script_args(struct ctdb_context *ctdb, enum ctdb_eventscript_call
 	va_start(ap, fmt);
 	ret = ctdb_event_script_callback_v(ctdb,
 			event_script_callback, &status, false, call, fmt, ap);
+	va_end(ap);
 	if (ret != 0) {
 		return ret;
 	}
-	va_end(ap);
 
 	status.status = -1;
 	status.done = false;
diff --git a/tcp/tcp_connect.c b/tcp/tcp_connect.c
index 43ce850..e3d837a 100644
--- a/tcp/tcp_connect.c
+++ b/tcp/tcp_connect.c
@@ -155,6 +155,10 @@ void ctdb_tcp_node_connect(struct event_context *ev, struct timed_event *te,
 	}
 
 	tnode->fd = socket(sock_out.sa.sa_family, SOCK_STREAM, IPPROTO_TCP);
+	if (tnode->fd == -1) {
+		DEBUG(DEBUG_ERR, (__location__ " Failed to create socket.\n"));
+		return;
+	}
 	set_nonblocking(tnode->fd);
 	set_close_on_exec(tnode->fd);
 
@@ -197,7 +201,11 @@ void ctdb_tcp_node_connect(struct event_context *ev, struct timed_event *te,
 	sock_in.ip.sin_len = sockin_size;
 	sock_out.ip.sin_len = sockout_size;
 #endif
-	bind(tnode->fd, (struct sockaddr *)&sock_in, sockin_size);
+	if (bind(tnode->fd, (struct sockaddr *)&sock_in, sockin_size) != 0) {
+		DEBUG(DEBUG_ERR,(__location__ " Failed to bind() to socket. %s(%d)\n", strerror(errno), errno));
+		close(tnode->fd);
+		return;
+	}
 
 	if (connect(tnode->fd, (struct sockaddr *)&sock_out, sockout_size) != 0 &&
 	    errno != EINPROGRESS) {
diff --git a/tests/src/ctdb_fetch.c b/tests/src/ctdb_fetch.c
index 35257e2..6487dc0 100644
--- a/tests/src/ctdb_fetch.c
+++ b/tests/src/ctdb_fetch.c
@@ -84,6 +84,11 @@ static void bench_fetch_1node(struct ctdb_context *ctdb)
 	data.dptr = (uint8_t *)talloc_asprintf_append((char *)data.dptr, 
 						      "msg_count=%d on node %d\n",
 						      msg_count, ctdb_get_pnn(ctdb));
+	if (data.dptr == NULL) {
+		printf("Failed to create record\n");
+		talloc_free(tmp_ctx);
+		return;
+	}
 	data.dsize = strlen((const char *)data.dptr)+1;
 
 	ret = ctdb_record_store(h, data);
diff --git a/tools/ctdb.c b/tools/ctdb.c
index 904ec31..28fa676 100644
--- a/tools/ctdb.c
+++ b/tools/ctdb.c
@@ -499,6 +499,7 @@ static int control_status(struct ctdb_context *ctdb, int argc, const char **argv
 	struct ctdb_node_map *nodemap=NULL;
 	uint32_t recmode, recmaster;
 	int mypnn;
+	int num_deleted_nodes = 0;
 
 	mypnn = ctdb_ctrl_getpnn(ctdb, TIMELIMIT(), options.pnn);
 	if (mypnn == -1) {
@@ -550,7 +551,17 @@ static int control_status(struct ctdb_context *ctdb, int argc, const char **argv
 		return 0;
 	}
 
-	printf("Number of nodes:%d\n", nodemap->num);
+	for (i=0; i<nodemap->num; i++) {
+		if (nodemap->nodes[i].flags & NODE_FLAGS_DELETED) {
+			num_deleted_nodes++;
+		}
+	}
+	if (num_deleted_nodes == 0) {
+		printf("Number of nodes:%d\n", nodemap->num);
+	} else {
+		printf("Number of nodes:%d (including %d deleted nodes)\n",
+		       nodemap->num, num_deleted_nodes);
+	}
 	for(i=0;i<nodemap->num;i++){
 		static const struct {
 			uint32_t flag;


-- 
CTDB repository


More information about the samba-cvs mailing list