diff options
author | Volker Lendecke <vl@samba.org> | 2019-10-15 10:55:25 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2019-10-18 21:06:33 +0000 |
commit | 75433f60522b935adb8c14fc6d0caa14c85281b3 (patch) | |
tree | 0dc5790d32647c56d7e4c237b3459e1ad8043f6f /source3/torture | |
parent | 50f69b60549b5d963e83a96315953e074517c096 (diff) | |
download | samba-75433f60522b935adb8c14fc6d0caa14c85281b3.tar.gz |
dbwrap_watch: Test cleanup of dead watchers
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/torture')
-rw-r--r-- | source3/torture/proto.h | 1 | ||||
-rw-r--r-- | source3/torture/test_dbwrap_watch.c | 103 | ||||
-rw-r--r-- | source3/torture/torture.c | 4 |
3 files changed, 108 insertions, 0 deletions
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 @@ -14664,6 +14664,10 @@ static struct { .fn = run_dbwrap_watch2, }, { + .name = "LOCAL-DBWRAP-WATCH3", + .fn = run_dbwrap_watch3, + }, + { .name = "LOCAL-DBWRAP-DO-LOCKED1", .fn = run_dbwrap_do_locked1, }, |