[PATCHES] net: Add net tdb command to print information from tdb records

Christof Schmitt cs at samba.org
Fri Apr 22 22:42:37 UTC 2016


From d09af7183760492848a33e3ef04d4b5614e1bbeb Mon Sep 17 00:00:00 2001
From: Christof Schmitt <cs at samba.org>
Date: Tue, 19 Apr 2016 15:53:41 -0700
Subject: [PATCH 1/2] net: Add net tdb command to print information from tdb
 records

The main purpose is to debug "hot" records from ctdb. ctdb tracks
contended records and identifies them by key in the dbstatistics:

DB Statistics: locking.tdb
[...]
 Num Hot Keys:     1
     Count:3 Key:6a4128e3ced4681b02a00000000000000000000000000000

This command allows querying additional information for the associated
key to identify the affected file. For now this only adds a subcommand
for the locking.tdb, but could be extended to others:

net tdb locking 6a4128e3ced4681b02a00000000000000000000000000000
Share path: /test/share
Name:       README

Signed-off-by: Christof Schmitt <cs at samba.org>
---
 source3/utils/net.c       |  8 +++++
 source3/utils/net_proto.h |  3 ++
 source3/utils/net_tdb.c   | 79 +++++++++++++++++++++++++++++++++++++++++++++++
 source3/wscript_build     |  1 +
 4 files changed, 91 insertions(+)
 create mode 100644 source3/utils/net_tdb.c

diff --git a/source3/utils/net.c b/source3/utils/net.c
index 3d0940d..a6817f5 100644
--- a/source3/utils/net.c
+++ b/source3/utils/net.c
@@ -751,6 +751,14 @@ static struct functable net_func[] = {
 		   "'net notify' commands.")
 	},
 
+	{	"tdb",
+		net_tdb,
+		NET_TRANSPORT_LOCAL,
+		N_("Show information from tdb records"),
+		N_("  Use 'net help tdb' to get more information about "
+		   "'net tdb' commands.")
+	},
+
 #ifdef WITH_FAKE_KASERVER
 	{	"afs",
 		net_afs,
diff --git a/source3/utils/net_proto.h b/source3/utils/net_proto.h
index 093aa4b..f0ae538 100644
--- a/source3/utils/net_proto.h
+++ b/source3/utils/net_proto.h
@@ -462,4 +462,7 @@ int net_rpc_trust(struct net_context *c, int argc, const char **argv);
 int net_rpc_conf(struct net_context *c, int argc, const char **argv);
 
 int net_notify(struct net_context *c, int argc, const char **argv);
+
+int net_tdb(struct net_context *c, int argc, const char **argv);
+
 #endif /*  _NET_PROTO_H_  */
diff --git a/source3/utils/net_tdb.c b/source3/utils/net_tdb.c
new file mode 100644
index 0000000..d33de20
--- /dev/null
+++ b/source3/utils/net_tdb.c
@@ -0,0 +1,79 @@
+/*
+ * Samba Unix/Linux client library
+ * net tdb commands to query tdb record information
+ * Copyright (C) 2016 Christof Schmitt <cs at samba.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+#include "utils/net.h"
+#include "locking/proto.h"
+#include "librpc/gen_ndr/open_files.h"
+
+static int net_tdb_locking(struct net_context *c, int argc, const char **argv)
+{
+	DATA_BLOB blob;
+	TALLOC_CTX *mem_ctx = talloc_stackframe();
+	const char *hexkey;
+	struct file_id id;
+	struct share_mode_lock *lock;
+
+	if (argc != 1) {
+		d_printf("Usage: net tdb locking <key>\n");
+		TALLOC_FREE(mem_ctx);
+		return -1;
+	}
+
+	hexkey = argv[0];
+
+	blob = strhex_to_data_blob(mem_ctx, hexkey);
+	if (blob.length != sizeof(struct file_id)) {
+		d_printf("Invalid length of key\n");
+		TALLOC_FREE(mem_ctx);
+		return -1;
+	}
+
+	id = *(struct file_id *)blob.data;
+
+	locking_init_readonly();
+
+	lock = fetch_share_mode_unlocked(mem_ctx, id);
+
+	if (lock == NULL) {
+		d_printf("Record with key %s not found.\n", hexkey);
+		return -1;
+	}
+
+	d_printf("Share path: %s\n", lock->data->servicepath);
+	d_printf("Name:       %s\n", lock->data->base_name);
+
+	TALLOC_FREE(mem_ctx);
+	return 0;
+}
+
+int net_tdb(struct net_context *c, int argc, const char **argv)
+{
+	struct functable func[] = {
+		{ "locking",
+		  net_tdb_locking,
+		  NET_TRANSPORT_LOCAL,
+		  N_("Show information for a record in locking.tdb"),
+		  N_("net tdb locking <key>")
+		},
+		{NULL, NULL, 0, NULL, NULL}
+	};
+
+	return net_run_function(c, argc, argv, "net tdb", func);
+}
diff --git a/source3/wscript_build b/source3/wscript_build
index ed2424d..383e225 100755
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -1117,6 +1117,7 @@ bld.SAMBA3_BINARY('net',
                  utils/net_rpc_conf.c
                  utils/net_afs.c
                  utils/net_notify.c
+                 utils/net_tdb.c
                  registry/reg_parse.c
                  registry/reg_format.c
                  registry/reg_import.c
-- 
1.8.3.1


From b048732fcaf3e39126ce7d208c54511a696e5807 Mon Sep 17 00:00:00 2001
From: Christof Schmitt <cs at samba.org>
Date: Fri, 22 Apr 2016 15:38:43 -0700
Subject: [PATCH 2/2] docs-xml: Document net tdb command

Signed-off-by: Christof Schmitt <cs at samba.org>
---
 docs-xml/manpages/net.8.xml | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/docs-xml/manpages/net.8.xml b/docs-xml/manpages/net.8.xml
index 6612191..0497e57 100644
--- a/docs-xml/manpages/net.8.xml
+++ b/docs-xml/manpages/net.8.xml
@@ -2708,6 +2708,27 @@ Dump the locking table of a certain global lock.
 </refsect2>
 
 <refsect2>
+	<title>TDB</title>
+
+	<para>Print information from tdb records.</para>
+
+	<refsect3>
+		<title>TDB LOCKING <replaceable>key</replaceable></title>
+
+		<para>List sharename and filename for a record from
+		locking.tdb</para>
+
+		<itemizedlist>
+			<listitem>
+				<para><replaceable>KEY</replaceable>
+				Key of the tdb record as hex string.</para>
+			</listitem>
+		</itemizedlist>
+
+	</refsect3>
+</refsect2>
+
+<refsect2>
 <title>HELP [COMMAND]</title>
 
 <para>Gives usage information for the specified command.</para>
-- 
1.8.3.1



More information about the samba-technical mailing list