summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Prouty <tprouty@samba.org>2009-12-02 18:39:05 -0800
committerTim Prouty <tprouty@samba.org>2009-12-03 18:54:52 -0800
commit522d6bc58891b8c25e935bcee3206f03c8ab73cb (patch)
treec81f1faabb3787c7d875925916bd234b6e349881
parentb14da4f7c54e88e615f2bb19bec43bacb7f11de8 (diff)
downloadsamba-522d6bc58891b8c25e935bcee3206f03c8ab73cb.tar.gz
samba-522d6bc58891b8c25e935bcee3206f03c8ab73cb.tar.bz2
samba-522d6bc58891b8c25e935bcee3206f03c8ab73cb.zip
s4 torture: Convert an error to a warning in RAW-OPLOCK-BATCH22
Some servers choose to mark a client as bad if they fail an oplock break request by timing out (win7 is an example). Once the client is marked as bad, future oplock requests will timeout instantly. This causes subsequent runs of this test to fail, so rather than erroring out as a failure, a warning is printed instead. There is also a bug in w2k3 where it was incorrectly returning contending a share mode lock. It worked in XP and has been re-fixed in win7. This can also now be run against samba3.
-rw-r--r--source4/torture/raw/oplock.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/source4/torture/raw/oplock.c b/source4/torture/raw/oplock.c
index 85362d126f..2531989b8c 100644
--- a/source4/torture/raw/oplock.c
+++ b/source4/torture/raw/oplock.c
@@ -34,11 +34,11 @@
ret = false; \
}} while (0)
-#define CHECK_RANGE(v, min, max) do { \
- if ((v) < (min) || (v) > (max)) { \
- torture_result(tctx, TORTURE_FAIL, "(%s): wrong value for %s got %d - should be between %d and %d\n", \
- __location__, #v, (int)v, (int)min, (int)max); \
- ret = false; \
+#define CHECK_RANGE(v, min, max) do { \
+ if ((v) < (min) || (v) > (max)) { \
+ torture_warning(tctx, "(%s): wrong value for %s got " \
+ "%d - should be between %d and %d\n", \
+ __location__, #v, (int)v, (int)min, (int)max); \
}} while (0)
#define CHECK_STRMATCH(v, correct) do { \
@@ -2632,10 +2632,6 @@ static bool test_raw_oplock_batch22(struct torture_context *tctx, struct smbcli_
int timeout = torture_setting_int(tctx, "oplocktimeout", 30);
int te;
- if (torture_setting_bool(tctx, "samba3", false)) {
- torture_skip(tctx, "BATCH22 disabled against samba3\n");
- }
-
if (!torture_setup_dir(cli1, BASEDIR)) {
return false;
}
@@ -2644,7 +2640,6 @@ static bool test_raw_oplock_batch22(struct torture_context *tctx, struct smbcli_
smbcli_unlink(cli1->tree, fname);
smbcli_oplock_handler(cli1->transport, oplock_handler_ack_to_given, cli1->tree);
-
/*
base ntcreatex parms
*/
@@ -2681,9 +2676,23 @@ static bool test_raw_oplock_batch22(struct torture_context *tctx, struct smbcli_
tv = timeval_current();
smbcli_oplock_handler(cli1->transport, oplock_handler_timeout, cli1->tree);
status = smb_raw_open(cli1->tree, tctx, &io);
- CHECK_STATUS(tctx, status, NT_STATUS_SHARING_VIOLATION);
+
+ if (TARGET_IS_W2K3(tctx)) {
+ /* 2k3 has an issue here. xp/win7 are ok. */
+ CHECK_STATUS(tctx, status, NT_STATUS_SHARING_VIOLATION);
+ } else {
+ CHECK_STATUS(tctx, status, NT_STATUS_OK);
+ }
+
torture_wait_for_oplock_break(tctx);
te = (int)timeval_elapsed(&tv);
+
+ /*
+ * Some servers detect clients that let oplocks timeout, so this check
+ * only shows a warning message instead failing the test to eliminate
+ * failures from repeated runs of the test. This isn't ideal, but
+ * it's better than not running the test at all.
+ */
CHECK_RANGE(te, timeout - 1, timeout + 15);
CHECK_VAL(break_info.count, 1);
@@ -2698,7 +2707,13 @@ static bool test_raw_oplock_batch22(struct torture_context *tctx, struct smbcli_
smbcli_oplock_handler(cli1->transport, oplock_handler_ack_to_given, cli1->tree);
status = smb_raw_open(cli1->tree, tctx, &io);
CHECK_STATUS(tctx, status, NT_STATUS_OK);
- CHECK_VAL(io.ntcreatex.out.oplock_level, LEVEL_II_OPLOCK_RETURN);
+ if (TARGET_IS_SAMBA3(tctx)) {
+ /* samba3 doesn't grant additional oplocks to bad clients. */
+ CHECK_VAL(io.ntcreatex.out.oplock_level, NO_OPLOCK_RETURN);
+ } else {
+ CHECK_VAL(io.ntcreatex.out.oplock_level,
+ LEVEL_II_OPLOCK_RETURN);
+ }
torture_wait_for_oplock_break(tctx);
te = (int)timeval_elapsed(&tv);
/* it should come in without delay */