chiark / gitweb /
sync with trunk
authorRichard Kettlewell <rjk@greenend.org.uk>
Thu, 22 Nov 2007 13:17:54 +0000 (13:17 +0000)
committerRichard Kettlewell <rjk@greenend.org.uk>
Thu, 22 Nov 2007 13:17:54 +0000 (13:17 +0000)
server/disorderd.c
server/trackdb.c
tests/alltests
tests/dbversion.py
tests/dtest.py
tests/files.py
tests/nothing.py
tests/version.py

index e8e1046067bc1d9fc831e7cbd31220e13e1d4f8a..758907cbd0ac4370fe99ad9e6729191ded725f43 100644 (file)
@@ -289,8 +289,11 @@ int main(int argc, char **argv) {
   /* ignore SIGPIPE */
   signal(SIGPIPE, SIG_IGN);
   /* start a rescan straight away */
-  if(initial_rescan)
-    trackdb_rescan(ev);
+  if(initial_rescan) {
+    trackdb_rescan(0/*ev*/);
+    /* No ev -> the rescan will block.  Since we called reconfigure() already
+     * any clients will also be forced to block. */
+  }
   rescan_after(86400);
   /* periodically tidy up the database */
   dbgc_after(60);
index c977b6aec71d42d32886d48ea22c627c519e99b5..cb6b45a8191d33b4542c20f3445f71ba6a8f905c 100644 (file)
@@ -1981,9 +1981,9 @@ static int reap_rescan(ev_source attribute((unused)) *ev,
                        void attribute((unused)) *u) {
   if(pid == rescan_pid) rescan_pid = -1;
   if(status)
-    error(0, "disorderd-rescan: %s", wstat(status));
+    error(0, RESCAN": %s", wstat(status));
   else
-    D(("disorderd-rescan terminate: %s", wstat(status)));
+    D((RESCAN" terminated: %s", wstat(status)));
   /* Our cache of file lookups is out of date now */
   cache_clean(&cache_files_type);
   eventlog("rescanned", (char *)0);
@@ -1991,14 +1991,22 @@ static int reap_rescan(ev_source attribute((unused)) *ev,
 }
 
 void trackdb_rescan(ev_source *ev) {
+  int w;
+
   if(rescan_pid != -1) {
     error(0, "rescan already underway");
     return;
   }
   rescan_pid = subprogram(ev, RESCAN, -1);
-  ev_child(ev, rescan_pid, 0, reap_rescan, 0);
-  D(("started rescanner"));
-  
+  if(ev) {
+    ev_child(ev, rescan_pid, 0, reap_rescan, 0);
+    D(("started rescanner"));
+  } else {
+    /* This is the first rescan, we block until it is complete */
+    while(waitpid(rescan_pid, &w, 0) < 0 && errno == EINTR)
+      ;
+    reap_rescan(0, rescan_pid, w, 0, 0);
+  }
 }
 
 int trackdb_rescan_cancel(void) {
index b115f7d1e226c0c113e5858c30a83024f85873df..812b53a2404533d35d9ad7e834e8a6cac1dc11e4 100755 (executable)
@@ -56,7 +56,7 @@ for f in os.listdir(testdir):
 tests.sort()                            # let's have a consistent order
 
 for test in tests:
-    print "Test '%s'" % test
+    print "-------- Test '%s' --------" % test
     dtest.run(test, report=False)
 
 print "%d tests" % dtest.tests
index 78788b1e0ca45a090bb3e5e5ef1e7ae082883c0e..d7f58a59f6a5b3a8e63a5bb5d1724301544c9efb 100755 (executable)
@@ -28,13 +28,11 @@ def test():
     dtest.copyfile(config, configsave)
     open(config, "a").write("dbversion 1\n")
     dtest.start_daemon()
-    time.sleep(2)
     dtest.stop_daemon()
     # Revert to default configuration
     dtest.copyfile(configsave, config)
     print "Testing daemon manages to upgrade..."
     dtest.start_daemon()
-    time.sleep(4)
     assert dtest.check_files() == 0
 
 if __name__ == '__main__':
index 00c5ead8b6af810ad727ca7195dfd8a47bb1874f..ab76991b8e04568c7d56c4888b8d0c62996f4ec8 100644 (file)
@@ -21,7 +21,7 @@
 
 """Utility module used by tests"""
 
-import os,os.path,subprocess,sys,re,unicodedata
+import os,os.path,subprocess,sys,re,time,unicodedata
 
 def fatal(s):
     """Write an error message and exit"""
@@ -177,10 +177,32 @@ Start the daemon."""
     global daemon, errs
     assert daemon == None
     print " starting daemon"
+    # remove the socket if it exists
+    socket = "%s/socket" % testroot
+    try:
+        os.remove(socket)
+    except:
+        pass
     daemon = subprocess.Popen(["disorderd",
                                "--foreground",
                                "--config", "%s/config" % testroot],
                               stderr=errs)
+    # Wait for the socket to be created
+    waited = 0
+    while not os.path.exists(socket):
+        rc = daemon.poll()
+        if rc is not None:
+            print "FATAL: daemon failed to start up"
+            sys.exit(1)
+        waited += 1
+        if waited == 1:
+            print "  waiting for socket..."
+        elif waited >= 60:
+            print "FATAL: took too long for socket to appear"
+            sys.exit(1)
+        time.sleep(1)
+    if waited > 0:
+        print "  took about %ds for socket to appear" % waited
 
 def stop_daemon():
     """stop_daemon()
@@ -193,8 +215,11 @@ Stop the daemon if it has not stopped already"""
     if rc == None:
         print " stopping daemon"
         os.kill(daemon.pid, 15)
+        print "  waiting for daemon"
         rc = daemon.wait()
-    print " daemon has stopped"
+        print "  daemon has stopped"
+    else:
+        print "  daemon already stopped"
     daemon = None
 
 def run(module=None, report=True):
index 24d4ea458f5d3781dc66aaa67b059fef2fe91aaf..3fc19f4577d3c427bbeac17e98b10ccc4737d2fe 100755 (executable)
@@ -23,7 +23,6 @@ import dtest,time,disorder,sys
 def test():
     """Check that the file listing comes out right"""
     dtest.start_daemon()
-    time.sleep(2)                       # give rescan a chance
     assert dtest.check_files() == 0
 
 if __name__ == '__main__':
index f3bdeb94e777784c8390f5a59ff386db18d314f3..c12443eb7e523177d99a17cfe071dbb9c4428e98 100755 (executable)
@@ -21,9 +21,8 @@
 import dtest,time
 
 def test():
-    """Just start the server and then stop it a few seconds later"""
+    """Just start the server and then stop it"""
     dtest.start_daemon()
-    time.sleep(2)
 
 if __name__ == '__main__':
     dtest.run()
index dbb0df62abbdeea18a987ee5756cc62618f8236e..9ec922c014357f02b0967c51585f86201a7fb680 100755 (executable)
@@ -23,7 +23,6 @@ import dtest,time,disorder
 def test():
     """Ask the server its version number"""
     dtest.start_daemon()
-    time.sleep(2)                       # give the daemon a chance to start up
     c = disorder.client()
     v = c.version()
     print "Server version: %s" % v