From a125e49d6740c44a36e6d5a1af33700163a11e95 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 8 Jun 2004 19:25:26 +0000 Subject: [PATCH] r1086: Add defer open test to check timeout on sharing violation open. This has found some signing errors in the Samba3.0 implementation of the deferred open code. Still working on these... Jeremy (This used to be commit 0068cb12ef91515a95f17a1be7dfbc83fbb89eba) --- source4/lib/time.c | 7 ++++ source4/torture/basic/denytest.c | 20 +++++++++-- source4/torture/torture.c | 61 ++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 2 deletions(-) diff --git a/source4/lib/time.c b/source4/lib/time.c index dbbfab24b5b..9d906af2fae 100644 --- a/source4/lib/time.c +++ b/source4/lib/time.c @@ -409,3 +409,10 @@ NTTIME nttime_from_string(const char *s) { return strtoull(s, NULL, 0); } + +long long usec_time_diff(struct timeval *larget, struct timeval *smallt) +{ + long long sec_diff = larget->tv_sec - smallt->tv_sec; + return (sec_diff * 1000000) + (long long)(larget->tv_usec - smallt->tv_usec); +} + diff --git a/source4/torture/basic/denytest.c b/source4/torture/basic/denytest.c index 102b44fbd34..13cb38633c6 100644 --- a/source4/torture/basic/denytest.c +++ b/source4/torture/basic/denytest.c @@ -1409,6 +1409,7 @@ BOOL torture_denytest1(int dummy) int fnum1, fnum2; int i; BOOL correct = True; + struct timeval tv, tv_start; const char *fnames[2] = {"\\denytest1.dat", "\\denytest1.exe"}; if (!torture_open_connection(&cli1)) { @@ -1428,6 +1429,8 @@ BOOL torture_denytest1(int dummy) printf("testing %d entries\n", ARRAY_SIZE(denytable1)); + GetTimeOfDay(&tv_start); + for (i=0; itree, fnum1); } + GetTimeOfDay(&tv_start); + for (i=0; itree, fname, 0, GENERIC_RIGHTS_FILE_ALL_ACCESS, + FILE_ATTRIBUTE_NORMAL, NTCREATEX_SHARE_ACCESS_NONE, + NTCREATEX_DISP_OPEN_IF, 0, 0); + if (fnum != -1) { + break; + } + } while (NT_STATUS_EQUAL(cli_nt_error(cli->tree),NT_STATUS_SHARING_VIOLATION)); + + if (fnum == -1) { + fprintf(stderr,"Failed to open %s, error=%s\n", fname, cli_errstr(cli->tree)); + return False; + } + + printf("pid %u open %d\n", getpid(), i); + + sleep(10); + i++; + if (NT_STATUS_IS_ERR(cli_close(cli->tree, fnum))) { + fprintf(stderr,"Failed to close %s, error=%s\n", fname, cli_errstr(cli->tree)); + return False; + } + sleep(2); + } + + if (NT_STATUS_IS_ERR(cli_unlink(cli->tree, fname))) { + /* All until the last unlink will fail with sharing violation. */ + if (!NT_STATUS_EQUAL(cli_nt_error(cli->tree),NT_STATUS_SHARING_VIOLATION)) { + printf("unlink of %s failed (%s)\n", fname, cli_errstr(cli->tree)); + correct = False; + } + } + + printf("deferred test finished\n"); + if (!torture_close_connection(cli)) { + correct = False; + } + return correct; +} + /* test how many open files this server supports on the one socket */ @@ -4089,6 +4149,7 @@ static struct { #if 1 {"OPENATTR", run_openattrtest, 0}, #endif + {"DEFER_OPEN", run_deferopen, FLAG_MULTIPROC}, {"XCOPY", run_xcopy, 0}, {"RENAME", run_rename, 0}, {"DELETE", run_deletetest, 0},