Flapping nbt.dgram tests

Andrew Bartlett abartlet at samba.org
Thu May 24 18:37:28 UTC 2018


Many of you would have seen this:

[171(827)/543 at 23m29s] samba3.nbt.dgram(ad_dc)
UNEXPECTED(failure): samba3.nbt.dgram.ntlogon(ad_dc)
REASON: Exception: Exception: ../source4/torture/nbt/dgram.c:616:
Expression `response != ((void *)0)' failed: Failed to receive a
netlogon reply packet

I've tried a few approaches, both a retry (see the attached patches)
and increasing the timeout (also aattached) and neither work, so
something more complex is going on here.

Just mentioning it here so others don't go down the same rat-hole and
perhaps come up with better ideas.

Sorry,

Andrew Bartlett

-- 
Andrew Bartlett                       http://samba.org/~abartlet/
Authentication Developer, Samba Team  http://samba.org
Samba Developer, Catalyst IT          http://catalyst.net.nz/services/samba
-------------- next part --------------
From ea74ea8947160ede9bbe0eb002a57ebd57db07f4 Mon Sep 17 00:00:00 2001
From: Andrew Bartlett <abartlet at samba.org>
Date: Thu, 24 May 2018 14:52:45 +1200
Subject: [PATCH 1/2] torture: Add a retry to the troublesome
 samba3.nbt.dgram.netlogon2 test

This test has been flapping for a time and this might help.

Signed-off-by: Andrew Bartlett <abartlet at samba.org>
---
 source4/torture/nbt/dgram.c | 125 +++++++++++++++++++++++++++++++-------------
 1 file changed, 90 insertions(+), 35 deletions(-)

diff --git a/source4/torture/nbt/dgram.c b/source4/torture/nbt/dgram.c
index 2f7ea19443f..92ec8837ae5 100644
--- a/source4/torture/nbt/dgram.c
+++ b/source4/torture/nbt/dgram.c
@@ -177,6 +177,7 @@ static bool nbt_test_netlogon2(struct torture_context *tctx)
 	struct test_join *join_ctx;
 	struct cli_credentials *machine_credentials;
 	const struct dom_sid *dom_sid;
+	int retry;
 	
 	name.name = lpcfg_workgroup(tctx->lp_ctx);
 	name.type = NBT_NAME_LOGON;
@@ -231,17 +232,30 @@ static bool nbt_test_netlogon2(struct torture_context *tctx)
 					   address, lpcfg_dgram_port(tctx->lp_ctx));
 
 	torture_assert(tctx, dest != NULL, "Error getting address");
-	status = dgram_mailslot_netlogon_send(dgmsock, &name, dest,
-					      NBT_MAILSLOT_NETLOGON, 
-					      &myname, &logon);
-	torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
-		tevent_loop_once(dgmsock->event_ctx);
+	for (retry = 0; retry < 2; retry ++) {
+		status = dgram_mailslot_netlogon_send(dgmsock,
+						      &name,
+						      dest,
+						      NBT_MAILSLOT_NETLOGON,
+						      &myname,
+						      &logon);
+		torture_assert_ntstatus_ok(tctx,
+					   status,
+					   "Failed to send netlogon request");
+
+		while (timeval_elapsed(&tv) < 5
+		       && dgmslot->private_data == NULL) {
+			tevent_loop_once(dgmsock->event_ctx);
+		}
+
+		response = talloc_get_type(dgmslot->private_data,
+					   struct nbt_netlogon_response);
+		if (response != NULL) {
+			break;
+		}
 	}
 
-	response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
-
 	torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
 
 	torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
@@ -276,17 +290,31 @@ static bool nbt_test_netlogon2(struct torture_context *tctx)
 					   address, lpcfg_dgram_port(tctx->lp_ctx));
 
 	torture_assert(tctx, dest != NULL, "Error getting address");
-	status = dgram_mailslot_netlogon_send(dgmsock, &name, dest,
-					      NBT_MAILSLOT_NETLOGON, 
-					      &myname, &logon);
-	torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
-		tevent_loop_once(dgmsock->event_ctx);
+	for (retry = 0; retry < 2; retry ++) {
+		status = dgram_mailslot_netlogon_send(dgmsock,
+						      &name,
+						      dest,
+						      NBT_MAILSLOT_NETLOGON,
+						      &myname,
+						      &logon);
+		torture_assert_ntstatus_ok(tctx,
+					   status,
+					   "Failed to send netlogon request");
+
+		while (timeval_elapsed(&tv) < 5
+		       && dgmslot->private_data == NULL) {
+			tevent_loop_once(dgmsock->event_ctx);
+		}
+
+		response = talloc_get_type(dgmslot->private_data,
+					   struct nbt_netlogon_response);
+
+		if (response != NULL) {
+			break;
+		}
 	}
 
-	response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
-
 	torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
 
 	torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
@@ -331,18 +359,32 @@ static bool nbt_test_netlogon2(struct torture_context *tctx)
 					   address, lpcfg_dgram_port(tctx->lp_ctx));
 
 	torture_assert(tctx, dest != NULL, "Error getting address");
-	status = dgram_mailslot_netlogon_send(dgmsock, &name, dest,
-					      NBT_MAILSLOT_NETLOGON, 
-					      &myname, &logon);
-	torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
-
 
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
-		tevent_loop_once(dgmsock->event_ctx);
+	for (retry = 0; retry < 2; retry ++) {
+		status = dgram_mailslot_netlogon_send(dgmsock,
+						      &name,
+						      dest,
+						      NBT_MAILSLOT_NETLOGON,
+						      &myname,
+						      &logon);
+		torture_assert_ntstatus_ok(tctx,
+					   status,
+					   "Failed to send netlogon request");
+
+
+		while (timeval_elapsed(&tv) < 5
+		       && dgmslot->private_data == NULL) {
+			tevent_loop_once(dgmsock->event_ctx);
+		}
+
+		response = talloc_get_type(dgmslot->private_data,
+					   struct nbt_netlogon_response);
+
+		if (response != NULL) {
+			break;
+		}
 	}
 
-	response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
-
 	torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
 
 	torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
@@ -420,18 +462,31 @@ static bool nbt_test_netlogon2(struct torture_context *tctx)
 					   address, lpcfg_dgram_port(tctx->lp_ctx));
 
 	torture_assert(tctx, dest != NULL, "Error getting address");
-	status = dgram_mailslot_netlogon_send(dgmsock, &name, dest,
-					      NBT_MAILSLOT_NETLOGON, 
-					      &myname, &logon);
-	torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
-
-
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
-		tevent_loop_once(dgmsock->event_ctx);
+	for (retry = 0; retry < 2; retry ++) {
+		status = dgram_mailslot_netlogon_send(dgmsock,
+						      &name,
+						      dest,
+						      NBT_MAILSLOT_NETLOGON,
+						      &myname,
+						      &logon);
+		torture_assert_ntstatus_ok(tctx,
+					   status,
+					   "Failed to send netlogon request");
+
+
+		while (timeval_elapsed(&tv) < 5
+		       && dgmslot->private_data == NULL) {
+			tevent_loop_once(dgmsock->event_ctx);
+		}
+
+		response = talloc_get_type(dgmslot->private_data,
+					   struct nbt_netlogon_response);
+
+		if (response != NULL) {
+			break;
+		}
 	}
 
-	response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
-
 	torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
 
 	torture_assert_int_equal(tctx, response->response_type, NETLOGON_SAMLOGON, "Got incorrect type of netlogon response");
-- 
2.14.3


From 93bbfecf1fde2cd83bb6c2ca5618cec7300ffdd3 Mon Sep 17 00:00:00 2001
From: Andrew Bartlett <abartlet at samba.org>
Date: Thu, 24 May 2018 15:02:00 +1200
Subject: [PATCH 2/2] torture: Add a retry to the troublesome
 samba3.nbt.dgram.ntlogon test

This test has been flapping for a time and this might help.

Signed-off-by: Andrew Bartlett <abartlet at samba.org>
---
 source4/torture/nbt/dgram.c | 88 +++++++++++++++++++++++++++++++--------------
 1 file changed, 61 insertions(+), 27 deletions(-)

diff --git a/source4/torture/nbt/dgram.c b/source4/torture/nbt/dgram.c
index 92ec8837ae5..0c7e0cd9c59 100644
--- a/source4/torture/nbt/dgram.c
+++ b/source4/torture/nbt/dgram.c
@@ -525,6 +525,7 @@ static bool nbt_test_ntlogon(struct torture_context *tctx)
 	struct nbt_name name;
 
 	struct interface *ifaces;
+	int retry;
 	
 	name.name = lpcfg_workgroup(tctx->lp_ctx);
 	name.type = NBT_NAME_LOGON;
@@ -588,17 +589,29 @@ static bool nbt_test_ntlogon(struct torture_context *tctx)
 	dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name, 
 					   address, lpcfg_dgram_port(tctx->lp_ctx));
 	torture_assert(tctx, dest != NULL, "Error getting address");
-	status = dgram_mailslot_netlogon_send(dgmsock, 
-					      &name, dest, 
-					      NBT_MAILSLOT_NTLOGON, 
-					      &myname, &logon);
-	torture_assert_ntstatus_ok(tctx, status, "Failed to send ntlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
-		tevent_loop_once(dgmsock->event_ctx);
-	}
+	for (retry = 0; retry < 2; retry ++) {
+		status = dgram_mailslot_netlogon_send(dgmsock,
+						      &name,
+						      dest,
+						      NBT_MAILSLOT_NTLOGON,
+						      &myname,
+						      &logon);
+		torture_assert_ntstatus_ok(tctx,
+					   status,
+					   "Failed to send ntlogon request");
 
-	response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
+		while (timeval_elapsed(&tv) < 5
+		       && dgmslot->private_data == NULL) {
+			tevent_loop_once(dgmsock->event_ctx);
+		}
+
+		response = talloc_get_type(dgmslot->private_data,
+					   struct nbt_netlogon_response);
+		if (response != NULL) {
+			break;
+		}
+	}
 
 	torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
 
@@ -635,17 +648,28 @@ static bool nbt_test_ntlogon(struct torture_context *tctx)
 	dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name, 
 					   address, lpcfg_dgram_port(tctx->lp_ctx));
 	torture_assert(tctx, dest != NULL, "Error getting address");
-	status = dgram_mailslot_netlogon_send(dgmsock, 
-					      &name, dest, 
-					      NBT_MAILSLOT_NTLOGON, 
-					      &myname, &logon);
-	torture_assert_ntstatus_ok(tctx, status, "Failed to send ntlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
-		tevent_loop_once(dgmsock->event_ctx);
-	}
+	for (retry = 0; retry < 2; retry ++) {
+		status = dgram_mailslot_netlogon_send(dgmsock,
+						      &name,
+						      dest,
+						      NBT_MAILSLOT_NTLOGON,
+						      &myname,
+						      &logon);
+		torture_assert_ntstatus_ok(tctx,
+					   status,
+					   "Failed to send ntlogon request");
 
-	response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
+		while (timeval_elapsed(&tv) < 5
+		       && dgmslot->private_data == NULL) {
+			tevent_loop_once(dgmsock->event_ctx);
+		}
+
+		response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
+		if (response != NULL) {
+			break;
+		}
+	}
 
 	torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
 
@@ -679,17 +703,27 @@ static bool nbt_test_ntlogon(struct torture_context *tctx)
 	dest = socket_address_from_strings(dgmsock, dgmsock->sock->backend_name, 
 					   address, lpcfg_dgram_port(tctx->lp_ctx));
 	torture_assert(tctx, dest != NULL, "Error getting address");
-	status = dgram_mailslot_netlogon_send(dgmsock, 
-					      &name, dest, 
-					      NBT_MAILSLOT_NTLOGON, 
-					      &myname, &logon);
-	torture_assert_ntstatus_ok(tctx, status, "Failed to send ntlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && !dgmslot->private_data) {
-		tevent_loop_once(dgmsock->event_ctx);
-	}
+	for (retry = 0; retry < 2; retry ++) {
+		status = dgram_mailslot_netlogon_send(dgmsock,
+						      &name,
+						      dest,
+						      NBT_MAILSLOT_NTLOGON,
+						      &myname,
+						      &logon);
+		torture_assert_ntstatus_ok(tctx, status, "Failed to send ntlogon request");
 
-	response = talloc_get_type(dgmslot->private_data, struct nbt_netlogon_response);
+		while (timeval_elapsed(&tv) < 5
+		       && !dgmslot->private_data) {
+			tevent_loop_once(dgmsock->event_ctx);
+		}
+
+		response = talloc_get_type(dgmslot->private_data,
+					   struct nbt_netlogon_response);
+		if (response != NULL) {
+			break;
+		}
+	}
 
 	torture_assert(tctx, response != NULL, "Failed to receive a netlogon reply packet");
 
-- 
2.14.3

-------------- next part --------------
From c658b1824a46f83c360863c8b99d607d121383a8 Mon Sep 17 00:00:00 2001
From: Andrew Bartlett <abartlet at samba.org>
Date: Wed, 11 Apr 2018 07:25:58 +1200
Subject: [PATCH] torture: Allow 15 seconds for a netlogon dgram reply

The selftest env can be a bit busy so allow a bit more time.

Signed-off-by: Andrew Bartlett <abartlet at samba.org>
---
 source4/torture/nbt/dgram.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/source4/torture/nbt/dgram.c b/source4/torture/nbt/dgram.c
index 2f7ea19443f..e26852a5571 100644
--- a/source4/torture/nbt/dgram.c
+++ b/source4/torture/nbt/dgram.c
@@ -140,7 +140,7 @@ static bool nbt_test_netlogon(struct torture_context *tctx)
 					      &myname, &logon);
 	torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && !dgmslot->private_data) {
+	while (timeval_elapsed(&tv) < 15 && !dgmslot->private_data) {
 		tevent_loop_once(dgmsock->event_ctx);
 	}
 
@@ -236,7 +236,7 @@ static bool nbt_test_netlogon2(struct torture_context *tctx)
 					      &myname, &logon);
 	torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
+	while (timeval_elapsed(&tv) < 15 && dgmslot->private_data == NULL) {
 		tevent_loop_once(dgmsock->event_ctx);
 	}
 
@@ -281,7 +281,7 @@ static bool nbt_test_netlogon2(struct torture_context *tctx)
 					      &myname, &logon);
 	torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
+	while (timeval_elapsed(&tv) < 15 && dgmslot->private_data == NULL) {
 		tevent_loop_once(dgmsock->event_ctx);
 	}
 
@@ -337,7 +337,7 @@ static bool nbt_test_netlogon2(struct torture_context *tctx)
 	torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
 
 
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
+	while (timeval_elapsed(&tv) < 15 && dgmslot->private_data == NULL) {
 		tevent_loop_once(dgmsock->event_ctx);
 	}
 
@@ -383,7 +383,7 @@ static bool nbt_test_netlogon2(struct torture_context *tctx)
 	torture_assert_ntstatus_ok(tctx, status, "Failed to send netlogon request");
 
 
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
+	while (timeval_elapsed(&tv) < 15 && dgmslot->private_data == NULL) {
 		tevent_loop_once(dgmsock->event_ctx);
 	}
 
@@ -539,7 +539,7 @@ static bool nbt_test_ntlogon(struct torture_context *tctx)
 					      &myname, &logon);
 	torture_assert_ntstatus_ok(tctx, status, "Failed to send ntlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && dgmslot->private_data == NULL) {
+	while (timeval_elapsed(&tv) < 15 && dgmslot->private_data == NULL) {
 		tevent_loop_once(dgmsock->event_ctx);
 	}
 
@@ -630,7 +630,7 @@ static bool nbt_test_ntlogon(struct torture_context *tctx)
 					      &myname, &logon);
 	torture_assert_ntstatus_ok(tctx, status, "Failed to send ntlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && !dgmslot->private_data) {
+	while (timeval_elapsed(&tv) < 15 && !dgmslot->private_data) {
 		tevent_loop_once(dgmsock->event_ctx);
 	}
 
@@ -668,7 +668,7 @@ static bool nbt_test_ntlogon(struct torture_context *tctx)
 					      &myname, &logon);
 	torture_assert_ntstatus_ok(tctx, status, "Failed to send ntlogon request");
 
-	while (timeval_elapsed(&tv) < 5 && !dgmslot->private_data) {
+	while (timeval_elapsed(&tv) < 15 && !dgmslot->private_data) {
 		tevent_loop_once(dgmsock->event_ctx);
 	}
 
-- 
2.14.3



More information about the samba-technical mailing list