s4:torture:basic: eliminate potential for false failures in delayed_write_update1
authorMichael Adam <obnox@samba.org>
Thu, 2 Oct 2014 14:11:27 +0000 (16:11 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 3 Oct 2014 06:34:05 +0000 (08:34 +0200)
We want to test that the write did update the write time immediately.
We check this by getting the file info in a loop for a few seconds.
There are several result cases:

- the server updated the write time immediately - success
- the server updated the write time, but not immediately - failure
- the server did not update the write time - failure

The loop is only there to be able to discern between the two
failure cases. The check for success is whether the first
getinfo has reportet the updated write time.

The potential for false failures was the additional timing check.
So if the first fileinfo call just took too long (e.g. due to a
busy system), this was reported as failure.

This patch should eliminate interemittent autobuild failures.

Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/torture/basic/delaywrite.c

index edb3dc9a917b9aa5bf86058f290b5df033be0dc7..423034005953226b0825d04e87914573bff39c1c 100644 (file)
@@ -129,6 +129,8 @@ static bool test_delayed_write_update1(struct torture_context *tctx, struct smbc
        double sec = ((double)used_delay) / ((double)normal_delay);
        int msec = 1000 * sec;
        char buf[2048];
+       bool first;
+       bool updated;
 
        torture_comment(tctx, "\nRunning test_delayed_write_update1\n");
 
@@ -173,6 +175,8 @@ static bool test_delayed_write_update1(struct torture_context *tctx, struct smbc
 
        start = timeval_current();
        end = timeval_add(&start, (120 * sec), 0);
+       first = true;
+       updated = false;
        while (!timeval_expired(&end)) {
                status = smb_raw_fileinfo(cli->tree, tctx, &finfo2);
 
@@ -184,31 +188,27 @@ static bool test_delayed_write_update1(struct torture_context *tctx, struct smbc
 
                torture_comment(tctx, "write time %s\n",
                        nt_time_string(tctx, finfo2.all_info.out.write_time));
-               if (finfo1.all_info.out.write_time != finfo2.all_info.out.write_time) {
-                       double diff = timeval_elapsed(&start);
-                       if (diff > (0.25 * (used_delay / (double)1000000))) {
-                               torture_result(tctx, TORTURE_FAIL, "After SMBwrite truncate "
-                                       "server updated write_time after %.2f seconds"
-                                       "(write time update dealy == %.2f)(wrong!)\n",
-                                              diff, used_delay / (double)1000000);
-                               ret = false;
-                               break;
-                       }
 
-                       torture_comment(tctx, "After SMBwrite truncate "
-                                       "server updated write_time after %.2f seconds"
-                                       "(1 sec == %.2f)(correct)\n",
-                                       diff, used_delay / (double)1000000);
+               if (finfo1.all_info.out.write_time !=
+                   finfo2.all_info.out.write_time)
+               {
+                       updated = true;
                        break;
                }
+
                fflush(stdout);
                smb_msleep(1 * msec);
+               first = false;
        }
 
-       torture_assert_u64_not_equal(tctx,
-                                    finfo2.all_info.out.write_time,
-                                    finfo1.all_info.out.write_time,
-                                    "Server did not update write time");
+       torture_assert(tctx, updated,
+                      "Server did not update write time within 120 seconds");
+
+       torture_assert(tctx, first, talloc_asprintf(tctx,
+                      "Server did not update write time immediately but only "
+                      "after %.2f seconds!", timeval_elapsed(&start)));
+
+       torture_comment(tctx, "Server updated write time immediately. Good!\n");
 
        fflush(stdout);
        smb_msleep(2 * msec);