From: Volker Lendecke Date: Tue, 15 Oct 2019 08:55:25 +0000 (+0200) Subject: dbwrap_watch: Test cleanup of dead watchers X-Git-Tag: talloc-2.3.1~290 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=75433f60522b935adb8c14fc6d0caa14c85281b3;p=thirdparty%2Fsamba.git dbwrap_watch: Test cleanup of dead watchers Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/selftest/knownfail b/selftest/knownfail index 82259dcfe90..7842a78328d 100644 --- a/selftest/knownfail +++ b/selftest/knownfail @@ -16,6 +16,7 @@ ^samba3.smbtorture_s3.crypt_server # expected to give ACCESS_DENIED as SMB1 encryption isn't used ^samba3.smbtorture_s3.*.LOCK12.*\(fileserver\) ^samba3.smbtorture_s3.*.LOCK12.*\(nt4_dc\) +^samba3.smbtorture_s3.LOCAL-DBWRAP-WATCH3 ^samba3.nbt.dgram.*netlogon2\(nt4_dc\) ^samba3.*rap.sam.*.useradd # Not provided by Samba 3 ^samba3.*rap.sam.*.userdelete # Not provided by Samba 3 diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py index 7b600ec64a2..a7b098d6518 100755 --- a/source3/selftest/tests.py +++ b/source3/selftest/tests.py @@ -213,6 +213,7 @@ local_tests = [ "LOCAL-CANONICALIZE-PATH", "LOCAL-DBWRAP-WATCH1", "LOCAL-DBWRAP-WATCH2", + "LOCAL-DBWRAP-WATCH3", "LOCAL-DBWRAP-DO-LOCKED1", "LOCAL-G-LOCK1", "LOCAL-G-LOCK2", diff --git a/source3/torture/proto.h b/source3/torture/proto.h index 578d784b410..f1896d5624e 100644 --- a/source3/torture/proto.h +++ b/source3/torture/proto.h @@ -113,6 +113,7 @@ bool run_notify_bench2(int dummy); bool run_notify_bench3(int dummy); bool run_dbwrap_watch1(int dummy); bool run_dbwrap_watch2(int dummy); +bool run_dbwrap_watch3(int dummy); bool run_dbwrap_do_locked1(int dummy); bool run_idmap_tdb_common_test(int dummy); bool run_local_dbwrap_ctdb(int dummy); diff --git a/source3/torture/test_dbwrap_watch.c b/source3/torture/test_dbwrap_watch.c index 5ef6b105ca2..cdfd8117522 100644 --- a/source3/torture/test_dbwrap_watch.c +++ b/source3/torture/test_dbwrap_watch.c @@ -175,3 +175,106 @@ fail: TALLOC_FREE(ev); return ret; } + +/* + * Test autocleanup of dead watchers + */ + +bool run_dbwrap_watch3(int dummy) +{ + struct tevent_context *ev = NULL; + struct messaging_context *msg = NULL; + struct db_context *backend = NULL; + struct db_context *db = NULL; + const char *keystr = "key"; + TDB_DATA key = string_term_tdb_data(keystr); + NTSTATUS status; + bool ret = false; + pid_t child, waited; + int wstatus, exit_status; + + BlockSignals(true, SIGCHLD); + + child = fork(); + if (child == -1) { + fprintf(stderr, + "fork failed: %s\n", + strerror(errno)); + goto fail; + } + + ev = samba_tevent_context_init(talloc_tos()); + if (ev == NULL) { + fprintf(stderr, "tevent_context_init failed\n"); + goto fail; + } + msg = messaging_init(ev, ev); + if (msg == NULL) { + fprintf(stderr, "messaging_init failed\n"); + goto fail; + } + backend = db_open(msg, "test_watch.tdb", 0, TDB_CLEAR_IF_FIRST, + O_CREAT|O_RDWR, 0644, DBWRAP_LOCK_ORDER_1, + DBWRAP_FLAG_NONE); + if (backend == NULL) { + fprintf(stderr, "db_open failed: %s\n", strerror(errno)); + goto fail; + } + + db = db_open_watched(ev, &backend, msg); + if (db == NULL) { + fprintf(stderr, "db_open_watched failed\n"); + goto fail; + } + + if (child == 0) { + struct db_record *rec = dbwrap_fetch_locked(db, db, key); + struct tevent_req *req = NULL; + + if (rec == NULL) { + fprintf(stderr, "dbwrap_fetch_locked failed\n"); + exit(1); + } + + req = dbwrap_watched_watch_send( + db, ev, rec, (struct server_id) { 0 }); + if (req == NULL) { + fprintf(stderr, "dbwrap_watched_watch_send failed\n"); + exit(2); + } + + exit(0); + } + + waited = waitpid(child, &wstatus, 0); + if (waited == -1) { + fprintf(stderr, "waitpid failed: %s\n", strerror(errno)); + goto fail; + } + if (!WIFEXITED(wstatus)) { + fprintf(stderr, "child did not exit normally\n"); + goto fail; + } + + exit_status = WEXITSTATUS(wstatus); + if (exit_status != 0) { + fprintf(stderr, "exit status is %d\n", exit_status); + goto fail; + } + + status = dbwrap_store_uint32_bystring(db, keystr, 1); + if (!NT_STATUS_EQUAL(status, NT_STATUS_OK)) { + fprintf(stderr, + "dbwrap_store_uint32 returned %s\n", + nt_errstr(status)); + goto fail; + } + + (void)unlink("test_watch.tdb"); + ret = true; +fail: + TALLOC_FREE(db); + TALLOC_FREE(msg); + TALLOC_FREE(ev); + return ret; +} diff --git a/source3/torture/torture.c b/source3/torture/torture.c index e498c162f11..bfc2a2e24c9 100644 --- a/source3/torture/torture.c +++ b/source3/torture/torture.c @@ -14663,6 +14663,10 @@ static struct { .name = "LOCAL-DBWRAP-WATCH2", .fn = run_dbwrap_watch2, }, + { + .name = "LOCAL-DBWRAP-WATCH3", + .fn = run_dbwrap_watch3, + }, { .name = "LOCAL-DBWRAP-DO-LOCKED1", .fn = run_dbwrap_do_locked1,