[PATCH] libosmocore[master]: ctrl: test deferred cmd, show current failure

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Thu Apr 5 00:32:13 UTC 2018


Review at  https://gerrit.osmocom.org/7636

ctrl: test deferred cmd, show current failure

Handling a deferred command currently deallocates the struct ctrl_cmd upon
exiting the initial command handling, while it should actually stay around for
the asynchronous/deferred handling of the ctrl command.

Show the current bug by means of a ctrl test. The test will be adjusted to
expect the correct result when the bug is fixed in a subsequent commit
(I24232be7dcf7be79f4def91ddc8b8f8005b56318).

Change-Id: Ibbc847fc583bdd8e5e53a008258805e634ea12b4
---
M tests/ctrl/ctrl_test.c
M tests/ctrl/ctrl_test.ok
2 files changed, 102 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/36/7636/1

diff --git a/tests/ctrl/ctrl_test.c b/tests/ctrl/ctrl_test.c
index a38591f..86c6a78 100644
--- a/tests/ctrl/ctrl_test.c
+++ b/tests/ctrl/ctrl_test.c
@@ -331,6 +331,101 @@
 	talloc_free(ctrl);
 }
 
+CTRL_CMD_DEFINE(test_defer, "test-defer");
+static void ctrl_test_defer_cb(void *data)
+{
+	struct ctrl_cmd_def *cd = data;
+	struct ctrl_cmd *cmd = cd->cmd;
+	static int i = 0;
+	printf("%s called\n", __func__);
+
+	if (ctrl_cmd_def_is_zombie(cd)) {
+		printf("Is Zombie\n");
+		return;
+	}
+
+	cmd->reply = talloc_asprintf(cmd, "Test Defer #%d", i++);
+
+	ctrl_cmd_def_send(cd);
+	return;
+}
+
+static struct ctrl_cmd_def *test_defer_cd = NULL;
+static int get_test_defer(struct ctrl_cmd *cmd, void *data)
+{
+	void *ctx = cmd->node;
+	printf("%s called\n", __func__);
+
+	test_defer_cd = ctrl_cmd_def_make(ctx, cmd, NULL, 10);
+
+	return CTRL_CMD_HANDLED;
+}
+static int set_test_defer(struct ctrl_cmd *cmd, void *data)
+{
+	return CTRL_CMD_HANDLED;
+}
+static int verify_test_defer(struct ctrl_cmd *cmd, const char *value, void *data)
+{
+	return 0;
+}
+
+static void test_deferred_cmd()
+{
+	struct ctrl_handle *ctrl;
+	struct ctrl_connection *ccon;
+	struct ctrl_cmd *cmd;
+	struct msgb *msg;
+	int result;
+	int ctx_size_was;
+	int ctx_size_before_defer;
+
+	printf("\n%s\n", __func__);
+	ctx_size_was = talloc_total_size(ctx);
+
+	ctrl = ctrl_handle_alloc2(ctx, NULL, NULL, 0);
+	ccon = talloc_zero(ctx, struct ctrl_connection);
+	INIT_LLIST_HEAD(&ccon->def_cmds);
+
+	osmo_wqueue_init(&ccon->write_queue, 1);
+
+	ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_test_defer);
+
+	ctx_size_before_defer = talloc_total_size(ctx);
+
+	msg = msgb_from_string("GET 123 test-defer");
+
+	result = ctrl_handle_msg(ctrl, ccon, msg);
+	printf("ctrl_handle_msg() returned %d\n", result);
+
+	OSMO_ASSERT(result == CTRL_CMD_HANDLED);
+
+	/* Expecting a ctrl_cmd_def as well as the cmd to still be allocated */
+	if (talloc_total_size(ctx) <= ctx_size_before_defer) {
+		printf("deferred command apparently deallocated too soon\n");
+		/* ERROR -- showing current bug in handling deallocated cmds, hence exiting early */
+		goto exit_early;
+		talloc_report_full(ctx, stdout);
+		OSMO_ASSERT(false);
+	}
+
+	printf("invoking ctrl_test_defer_cb() asynchronously\n");
+	ctrl_test_defer_cb(test_defer_cd);
+
+	/* And now the deferred cmd should be cleaned up completely. */
+	if (talloc_total_size(ctx) != ctx_size_before_defer) {
+		printf("mem leak!\n");
+		talloc_report_full(ctx, stdout);
+		OSMO_ASSERT(false);
+	}
+
+	printf("success\n");
+
+exit_early:
+
+	talloc_free(ccon);
+	talloc_free(ctrl);
+}
+
 static struct log_info_cat test_categories[] = {
 };
 
@@ -357,5 +452,7 @@
 
 	test_messages();
 
+	test_deferred_cmd();
+
 	return 0;
 }
diff --git a/tests/ctrl/ctrl_test.ok b/tests/ctrl/ctrl_test.ok
index 087ebbc..2af708a 100644
--- a/tests/ctrl/ctrl_test.ok
+++ b/tests/ctrl/ctrl_test.ok
@@ -172,3 +172,8 @@
 reply = 'OK'
 handling:
 ok
+
+test_deferred_cmd
+get_test_defer called
+ctrl_handle_msg() returned 0
+deferred command apparently deallocated too soon

-- 
To view, visit https://gerrit.osmocom.org/7636
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibbc847fc583bdd8e5e53a008258805e634ea12b4
Gerrit-PatchSet: 1
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>



More information about the gerrit-log mailing list