HintsDB: Support transactions with a TDB backend.
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 18 Jul 2024 13:50:14 +0000 (14:50 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 18 Jul 2024 17:47:17 +0000 (18:47 +0100)
44 files changed:
doc/doc-txt/ChangeLog
src/src/dbfn.c
src/src/dbfunctions.h
src/src/deliver.c
src/src/exim_dbmbuild.c
src/src/exim_dbutil.c
src/src/hintsdb.h
src/src/hintsdb/hints_bdb.h
src/src/hintsdb/hints_gdbm.h
src/src/hintsdb/hints_ndbm.h
src/src/hintsdb/hints_sqlite.h
src/src/hintsdb/hints_tdb.h
src/src/hintsdb_structs.h
src/src/queue.c
src/src/retry.c
test/runtest
test/stderr/0275
test/stderr/0278
test/stderr/0357
test/stderr/0358
test/stderr/0361
test/stderr/0386
test/stderr/0388
test/stderr/0398
test/stderr/0402
test/stderr/0403
test/stderr/0404
test/stderr/0408
test/stderr/0432
test/stderr/0450
test/stderr/0476
test/stderr/0487
test/stderr/0512
test/stderr/0554
test/stderr/0623
test/stderr/0628
test/stderr/0909
test/stderr/2600
test/stderr/2610
test/stderr/2620
test/stderr/4052
test/stderr/5004
test/stderr/5005
test/stderr/5006

index fadb4995a6a0616272b4a4a6dae5a0922d48e399..abf90ca1f6e62b5ce736cdad9501e3f683f003da 100644 (file)
@@ -10,11 +10,11 @@ JH/01 Use fewer forks & execs for sending many messages to a single host.
       we can loop there.  A two-phase queue run will benefit, particularly for
       mailinglist and smarthost cases.
 
-JH/02 Add transaction support for hintsdbs. The sole initial provider is
-      sqlite, and is used for the wait-transport and retry DBs. Transactions
-      imply locking internal to the DB. We no longer need a separate lockfile,
-      can keep the DB handle open for extended periods, yet potentially benefit
-      from concurrency on non-conflicting record uses.
+JH/02 Add transaction support for hintsdbs. The providers supported are tdb and
+      sqlite. Transactions are used for the wait-transport and retry DBs.
+      They imply locking internal to the DB.  We no longer need a separate
+      lockfile, can keep the DB handle open for extended periods, yet
+      potentially benefit from concurrency on non-conflicting record uses.
 
 JH/03 With dkim_verify_minimal, avoid calling the DKIM ACL after the first
       good verify.
index c2c92cf44122f03bf6b7132c2ac02a0caadbfb4c..1f69891646f0a73f6db0dfd146f973bba75f1a99 100644 (file)
@@ -38,8 +38,14 @@ are separate open and close functions. However, the calling modules should
 arrange to hold the locks for the bare minimum of time.
 
 API:
-  dbfn_open
-  dbfn_close
+  exim_lockfile_needed                 facilities predicate
+  dbfn_open                            takes lockfile or opens transaction
+  dbfn_open_multi                      only if transactions supported;
+                                       no lock or transaction taken
+  dbfn_close                           release lockfile or transaction
+  dbfn_close_multi
+  dbfn_transaction_start               only if transactions supported
+  dbfn_transaction_commit
   dbfn_read_with_length
   dbfn_read_enforce_length
   dbfn_write
@@ -166,6 +172,7 @@ exists, there is no error. */
 
 dlen = snprintf(CS dirname, sizeof(dirname), "%s/db", spool_directory);
 
+dbblock->readonly = (flags & O_ACCMODE) == O_RDONLY;
 dbblock->lockfd = -1;
 if (!exim_lockfile_needed())
   db_dir_make(panic);
@@ -194,7 +201,10 @@ open call. */
 snprintf(CS filename, sizeof(filename), "%.*s/%s", dlen, dirname, name);
 
 priv_drop_temp(exim_uid, exim_gid);
-dbblock->dbptr = exim_dbopen(filename, dirname, flags & O_ACCMODE, EXIMDB_MODE);
+dbblock->dbptr = dbblock->readonly && !exim_lockfile_needed()
+  ? exim_dbopen_multi(filename, dirname, flags & O_ACCMODE, EXIMDB_MODE)
+  : exim_dbopen(filename, dirname, flags & O_ACCMODE, EXIMDB_MODE);
+
 if (!dbblock->dbptr && errno == ENOENT && flags & O_CREAT)
   {
   DEBUG(D_hints_lookup)
@@ -220,21 +230,13 @@ if (!dbblock->dbptr)
           filename));
   (void)close(dbblock->lockfd);
   dbblock->lockfd = -1;
-  errno = save_errno;
-  DEBUG(D_hints_lookup) acl_level--;
-  return NULL;
+  dbblock = NULL;
   }
 
-DEBUG(D_hints_lookup)
-  debug_printf_indent("opened hints database %s: flags=%s%s\n", filename,
-    (flags & O_ACCMODE) == O_RDONLY ? "O_RDONLY"
-    : (flags & O_ACCMODE) == O_RDWR ? "O_RDWR"
-    : "??",
-    flags & O_CREAT ? "|O_CREAT" : "");
-
 /* Pass back the block containing the opened database handle and the open fd
 for the lock. */
 
+DEBUG(D_hints_lookup) acl_level--;
 return dbblock;
 }
 
@@ -284,21 +286,11 @@ if (!dbblock->dbptr)
     DEBUG(D_hints_lookup)
       debug_printf_indent("%s\n", CS string_open_failed("DB file %s",
           filename));
-  errno = save_errno;
-  DEBUG(D_hints_lookup) acl_level--;
-  return NULL;
+  dbblock =  NULL;
   }
 
-DEBUG(D_hints_lookup)
-  debug_printf_indent("opened hints database %s for transactions: NOLOCK flags=%s%s\n",
-    filename,
-    (flags & O_ACCMODE) == O_RDONLY ? "O_RDONLY"
-    : (flags & O_ACCMODE) == O_RDWR ? "O_RDWR"
-    : "??",
-    flags & O_CREAT ? "|O_CREAT" : "");
-
 /* Pass back the block containing the opened database handle */
-
+DEBUG(D_hints_lookup) acl_level--;
 return dbblock;
 }
 
@@ -307,13 +299,13 @@ BOOL
 dbfn_transaction_start(open_db * dbp)
 {
 DEBUG(D_hints_lookup) debug_printf_indent("dbfn_transaction_start\n");
-return exim_dbtransaction_start(dbp->dbptr);
+if (!dbp->readonly) return exim_dbtransaction_start(dbp->dbptr);
 }
 void
 dbfn_transaction_commit(open_db * dbp)
 {
 DEBUG(D_hints_lookup) debug_printf_indent("dbfn_transaction_commit\n");
-exim_dbtransaction_commit(dbp->dbptr);
+if (!dbp->readonly) exim_dbtransaction_commit(dbp->dbptr);
 }
 
 
@@ -334,14 +326,15 @@ dbfn_close(open_db * dbp)
 {
 int * fdp = &dbp->lockfd;
 
-exim_dbclose(dbp->dbptr);
+if (dbp->readonly && !exim_lockfile_needed())
+  exim_dbclose_multi(dbp->dbptr);
+else
+  exim_dbclose(dbp->dbptr);
+
 if (*fdp >= 0) (void)close(*fdp);
 DEBUG(D_hints_lookup)
-  {
   debug_printf_indent("closed hints database%s\n",
                      *fdp < 0 ? "" : " and lockfile");
-  acl_level--;
-  }
 *fdp = -1;
 }
 
@@ -351,10 +344,7 @@ dbfn_close_multi(open_db * dbp)
 {
 exim_dbclose_multi(dbp->dbptr);
 DEBUG(D_hints_lookup)
-  {
   debug_printf_indent("closed hints database\n");
-  acl_level--;
-  }
 }
 
 
index 0aa3b777cd3932d97abb6975c79c7f9ebb700671..08f8c23113628de495876a47684e1e64a1498a6c 100644 (file)
@@ -28,16 +28,5 @@ void  dbfn_transaction_commit(open_db *);
 
 #define  dbfn_read(a, b) dbfn_read_with_length(a, b, NULL)
 
-/* Berkeley DB uses a callback function to pass back error details. Its API
-changed at release 4.3. */
-
-#if defined(USE_DB) && defined(DB_VERSION_STRING)
-# if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 3)
-void     dbfn_bdb_error_callback(const DB_ENV *, const char *, const char *);
-# else
-void     dbfn_bdb_error_callback(const char *, char *);
-# endif
-#endif
-
 #endif
 /* End of dbfunctions.h */
index b04fe6f12045794a85d8bad28dbf68ec032da35e..ee7650243199607ae2086f148e3a58d6ac6c4a10 100644 (file)
@@ -2896,7 +2896,12 @@ while (addr_local)
   of these checks, rather than for all local deliveries, because some local
   deliveries (e.g. to pipes) can take a substantial time. */
 
-  if (!(dbm_file = dbfn_open(US"retry", O_RDONLY, &dbblock, FALSE, TRUE)))
+  if (continue_retry_db && continue_retry_db != (open_db *)-1)
+    {
+    DEBUG(D_hints_lookup) debug_printf("using cached retry hintsdb handle\n");
+    dbm_file = continue_retry_db;
+    }
+  else if (!(dbm_file = dbfn_open(US"retry", O_RDONLY, &dbblock, FALSE, TRUE)))
     DEBUG(D_deliver|D_retry|D_hints_lookup)
       debug_printf("no retry data available\n");
 
@@ -2905,61 +2910,66 @@ while (addr_local)
   while (addr2)
     {
     BOOL ok = TRUE;   /* to deliver this address */
-    uschar *retry_key;
-
-    /* Set up the retry key to include the domain or not, and change its
-    leading character from "R" to "T". Must make a copy before doing this,
-    because the old key may be pointed to from a "delete" retry item after
-    a routing delay. */
 
-    retry_key = string_copy(
-      tp->retry_use_local_part ? addr2->address_retry_key :
-        addr2->domain_retry_key);
-    *retry_key = 'T';
+    if (f.queue_2stage)
+      {
+      DEBUG(D_deliver)
+       debug_printf_indent("no router retry check (ph1 qrun)\n");
+      }
+    else
+      {
+      /* Set up the retry key to include the domain or not, and change its
+      leading character from "R" to "T". Must make a copy before doing this,
+      because the old key may be pointed to from a "delete" retry item after
+      a routing delay. */
+      uschar * retry_key = string_copy(tp->retry_use_local_part
+                       ? addr2->address_retry_key : addr2->domain_retry_key);
+      *retry_key = 'T';
 
-    /* Inspect the retry data. If there is no hints file, delivery happens. */
+      /* Inspect the retry data. If there is no hints file, delivery happens. */
 
-    if (dbm_file)
-      {
-      dbdata_retry * retry_record = dbfn_read(dbm_file, retry_key);
+      if (dbm_file)
+       {
+       dbdata_retry * retry_record = dbfn_read(dbm_file, retry_key);
 
-      /* If there is no retry record, delivery happens. If there is,
-      remember it exists so it can be deleted after a successful delivery. */
+       /* If there is no retry record, delivery happens. If there is,
+       remember it exists so it can be deleted after a successful delivery. */
 
-      if (retry_record)
-        {
-        setflag(addr2, af_lt_retry_exists);
+       if (retry_record)
+         {
+         setflag(addr2, af_lt_retry_exists);
 
-        /* A retry record exists for this address. If queue running and not
-        forcing, inspect its contents. If the record is too old, or if its
-        retry time has come, or if it has passed its cutoff time, delivery
-        will go ahead. */
+         /* A retry record exists for this address. If queue running and not
+         forcing, inspect its contents. If the record is too old, or if its
+         retry time has come, or if it has passed its cutoff time, delivery
+         will go ahead. */
 
-        DEBUG(D_retry)
-          {
-          debug_printf("retry record exists: age=%s ",
-            readconf_printtime(now - retry_record->time_stamp));
-          debug_printf("(max %s)\n", readconf_printtime(retry_data_expire));
-          debug_printf("  time to retry = %s expired = %d\n",
-            readconf_printtime(retry_record->next_try - now),
-            retry_record->expired);
-          }
+         DEBUG(D_retry)
+           {
+           debug_printf("retry record exists: age=%s ",
+             readconf_printtime(now - retry_record->time_stamp));
+           debug_printf("(max %s)\n", readconf_printtime(retry_data_expire));
+           debug_printf("  time to retry = %s expired = %d\n",
+             readconf_printtime(retry_record->next_try - now),
+             retry_record->expired);
+           }
 
-        if (f.queue_running && !f.deliver_force)
-          {
-          ok = (now - retry_record->time_stamp > retry_data_expire)
-           || (now >= retry_record->next_try)
-           || retry_record->expired;
+         if (f.queue_running && !f.deliver_force)
+           {
+           ok = (now - retry_record->time_stamp > retry_data_expire)
+             || (now >= retry_record->next_try)
+             || retry_record->expired;
 
-          /* If we haven't reached the retry time, there is one more check
-          to do, which is for the ultimate address timeout. */
+           /* If we haven't reached the retry time, there is one more check
+           to do, which is for the ultimate address timeout. */
 
-          if (!ok)
-            ok = retry_ultimate_address_timeout(retry_key, addr2->domain,
-                retry_record, now);
-          }
-        }
-      else DEBUG(D_retry) debug_printf("no retry record exists\n");
+           if (!ok)
+             ok = retry_ultimate_address_timeout(retry_key, addr2->domain,
+                 retry_record, now);
+           }
+         }
+       else DEBUG(D_retry) debug_printf("no retry record exists\n");
+       }
       }
 
     /* This address is to be delivered. Leave it on the chain. */
@@ -2985,7 +2995,11 @@ while (addr_local)
       }
     }
 
-  if (dbm_file) dbfn_close(dbm_file);
+  if (dbm_file)
+    if (dbm_file != continue_retry_db)
+      { dbfn_close(dbm_file); dbm_file = NULL; }
+    else
+      DEBUG(D_hints_lookup) debug_printf("retaining retry hintsdb handle\n");
 
   /* If there are no addresses left on the chain, they all deferred. Loop
   for the next set of addresses. */
@@ -7440,8 +7454,13 @@ while (addr_new)           /* Loop until all addresses dealt with */
     {
     /* If we have transaction-capable hintsdbs, open the retry db without
     locking, and leave open for the transport process and for subsequent
-    deliveries. If the open fails, tag that explicitly for the transport but
-    retry the open next time around, in case it was created in the interim. */
+    deliveries. Use a writeable open as we can keep it open all the way through
+    to writing retry records if needed due to message fails.
+    If the open fails, tag that explicitly for the transport but retry the open
+    next time around, in case it was created in the interim.
+    If non-transaction, we are only reading records at this stage and
+    we close the db before running the transport.
+    Either way we do a non-creating open. */
 
     if (continue_retry_db == (open_db *)-1)
       continue_retry_db = NULL;
@@ -7451,7 +7470,7 @@ while (addr_new)           /* Loop until all addresses dealt with */
       DEBUG(D_hints_lookup) debug_printf("using cached retry hintsdb handle\n");
       dbm_file = continue_retry_db;
       }
-    else if (!exim_lockfile_needed() && continue_transport)
+    else if (!exim_lockfile_needed())
       {
       dbm_file = dbfn_open_multi(US"retry", O_RDWR, &dbblock);
       continue_retry_db = dbm_file ? dbm_file : (open_db *)-1;
@@ -7471,7 +7490,7 @@ while (addr_new)           /* Loop until all addresses dealt with */
     {
     int rc;
     tree_node * tnode;
-    dbdata_retry * domain_retry_record, * address_retry_record;
+    dbdata_retry * domain_retry_record = NULL, * address_retry_record = NULL;
 
     addr = addr_new;
     addr_new = addr->next;
@@ -7700,76 +7719,82 @@ while (addr_new)           /* Loop until all addresses dealt with */
       continue;
       }
 
-    /* Get the routing retry status, saving the two retry keys (with and
-    without the local part) for subsequent use. If there is no retry record for
-    the standard address routing retry key, we look for the same key with the
-    sender attached, because this form is used by the smtp transport after a
-    4xx response to RCPT when address_retry_include_sender is true. */
-
-    DEBUG(D_retry)
+    if (f.queue_2stage)
       {
-      debug_printf_indent("checking router retry status\n");
-      acl_level++;
+      DEBUG(D_deliver)
+       debug_printf_indent("no router retry check (ph1 qrun)\n");
       }
-    addr->domain_retry_key = string_sprintf("R:%s", addr->domain);
-    addr->address_retry_key = string_sprintf("R:%s@%s", addr->local_part,
-      addr->domain);
-
-    if (dbm_file)
+    else
       {
-      domain_retry_record = dbfn_read(dbm_file, addr->domain_retry_key);
-      if (  domain_retry_record
-         && now - domain_retry_record->time_stamp > retry_data_expire
-        )
+      /* Get the routing retry status, saving the two retry keys (with and
+      without the local part) for subsequent use. If there is no retry record
+      for the standard address routing retry key, we look for the same key with
+      the sender attached, because this form is used by the smtp transport after
+      a 4xx response to RCPT when address_retry_include_sender is true. */
+
+      DEBUG(D_deliver|D_retry)
        {
-       DEBUG(D_deliver|D_retry)
-         debug_printf_indent("domain retry record present but expired\n");
-        domain_retry_record = NULL;    /* Ignore if too old */
+       debug_printf_indent("checking router retry status\n");
+       acl_level++;
        }
+      addr->domain_retry_key = string_sprintf("R:%s", addr->domain);
+      addr->address_retry_key = string_sprintf("R:%s@%s", addr->local_part,
+       addr->domain);
 
-      address_retry_record = dbfn_read(dbm_file, addr->address_retry_key);
-      if (  address_retry_record
-         && now - address_retry_record->time_stamp > retry_data_expire
-        )
+      if (dbm_file)
        {
-       DEBUG(D_deliver|D_retry)
-         debug_printf_indent("address retry record present but expired\n");
-        address_retry_record = NULL;   /* Ignore if too old */
-       }
+       domain_retry_record = dbfn_read(dbm_file, addr->domain_retry_key);
+       if (  domain_retry_record
+          && now - domain_retry_record->time_stamp > retry_data_expire
+          )
+         {
+         DEBUG(D_deliver|D_retry)
+           debug_printf_indent("domain retry record present but expired\n");
+         domain_retry_record = NULL;    /* Ignore if too old */
+         }
 
-      if (!address_retry_record)
-        {
-        uschar *altkey = string_sprintf("%s:<%s>", addr->address_retry_key,
-          sender_address);
-        address_retry_record = dbfn_read(dbm_file, altkey);
-        if (  address_retry_record
-          && now - address_retry_record->time_stamp > retry_data_expire)
+       address_retry_record = dbfn_read(dbm_file, addr->address_retry_key);
+       if (  address_retry_record
+          && now - address_retry_record->time_stamp > retry_data_expire
+          )
          {
          DEBUG(D_deliver|D_retry)
-           debug_printf_indent("address<sender> retry record present but expired\n");
-          address_retry_record = NULL;   /* Ignore if too old */
+           debug_printf_indent("address retry record present but expired\n");
+         address_retry_record = NULL;   /* Ignore if too old */
          }
-        }
-      }
-    else
-      domain_retry_record = address_retry_record = NULL;
 
-    DEBUG(D_deliver|D_retry)
-      {
-      if (!domain_retry_record)
-       debug_printf_indent("no   domain  retry record\n");
-      else
-       debug_printf_indent("have domain  retry record; next_try = now%+d\n",
-                     f.running_in_test_harness ? 0 :
-                     (int)(domain_retry_record->next_try - now));
+       if (!address_retry_record)
+         {
+         uschar *altkey = string_sprintf("%s:<%s>", addr->address_retry_key,
+           sender_address);
+         address_retry_record = dbfn_read(dbm_file, altkey);
+         if (  address_retry_record
+            && now - address_retry_record->time_stamp > retry_data_expire)
+           {
+           DEBUG(D_deliver|D_retry)
+             debug_printf_indent("address<sender> retry record present but expired\n");
+           address_retry_record = NULL;   /* Ignore if too old */
+           }
+         }
+       }
 
-      if (!address_retry_record)
-       debug_printf_indent("no   address retry record\n");
-      else
-       debug_printf_indent("have address retry record; next_try = now%+d\n",
-                     f.running_in_test_harness ? 0 :
-                     (int)(address_retry_record->next_try - now));
-      acl_level--;
+      DEBUG(D_deliver|D_retry)
+       {
+       if (!domain_retry_record)
+         debug_printf_indent("no   domain  retry record\n");
+       else
+         debug_printf_indent("have domain  retry record; next_try = now%+d\n",
+                       f.running_in_test_harness ? 0 :
+                       (int)(domain_retry_record->next_try - now));
+
+       if (!address_retry_record)
+         debug_printf_indent("no   address retry record\n");
+       else
+         debug_printf_indent("have address retry record; next_try = now%+d\n",
+                       f.running_in_test_harness ? 0 :
+                       (int)(address_retry_record->next_try - now));
+       acl_level--;
+       }
       }
 
     /* If we are sending a message down an existing SMTP connection, we must
@@ -7873,11 +7898,15 @@ while (addr_new)           /* Loop until all addresses dealt with */
       }
     }
 
-  /* The database is closed while routing is actually happening. Requests to
-  update it are put on a chain and all processed together at the end. */
+  /* If not transaction-capable, the database is closed while routing is
+  actually happening. Requests to update it are put on a chain and all processed
+  together at the end. */
 
-  if (dbm_file && !continue_retry_db)
-    { dbfn_close(dbm_file); dbm_file = NULL; }
+  if (dbm_file)
+    if (exim_lockfile_needed())
+      { dbfn_close(dbm_file); dbm_file = NULL; }
+    else
+      DEBUG(D_hints_lookup) debug_printf("retaining retry hintsdb handle\n");
 
   /* If queue_domains is set, we don't even want to try routing addresses in
   those domains. During queue runs, queue_domains is forced to be unset.
@@ -8048,9 +8077,6 @@ while (addr_new)           /* Loop until all addresses dealt with */
   }    /* Loop to process any child addresses that the routers created, and
        any rerouted addresses that got put back on the new chain. */
 
-if (dbm_file)          /* Can only be continue_retry_db */
-  { dbfn_close_multi(continue_retry_db); continue_retry_db = dbm_file = NULL; }
-
 /* Debugging: show the results of the routing */
 
 DEBUG(D_deliver|D_retry|D_route)
@@ -8149,12 +8175,7 @@ if (  mua_wrapper
 
 
 /* If this is a run to continue deliveries to an external channel that is
-already set up, defer any local deliveries.
-
-jgh 2020/12/20: I don't see why; locals should be quick.
-The defer goes back to version 1.62 in 1997.  A local being still deliverable
-during a continued run might result from something like a defer during the
-original delivery, eg. in a DB lookup.  Unlikely but possible.
+already set up, defer any local deliveries because we are handling remotes.
 
 To avoid delaying a local when combined with a callout-hold for a remote
 delivery, test continue_sequence rather than continue_transport. */
@@ -8402,9 +8423,10 @@ if (mua_wrapper)
 
 /* In a normal configuration, we now update the retry database. This is done in
 one fell swoop at the end in order not to keep opening and closing (and
-locking) the database. The code for handling retries is hived off into a
-separate module for convenience. We pass it the addresses of the various
-chains, because deferred addresses can get moved onto the failed chain if the
+locking) the database (at least, for non-transaction-capable DBs.
+The code for handling retries is hived off into a separate module for
+convenience. We pass it the addresses of the various chains,
+because deferred addresses can get moved onto the failed chain if the
 retry cutoff time has expired for all alternative destinations. Bypass the
 updating of the database if the -N flag is set, which is a debugging thing that
 prevents actual delivery. */
@@ -8506,6 +8528,13 @@ f.disable_logging = FALSE;  /* In case left set */
 
 DELIVERY_TIDYUP:
 
+if (dbm_file)          /* Can only be continue_retry_db */
+  {
+  DEBUG(D_hints_lookup) debug_printf("final close of cached retry db\n");
+  dbfn_close_multi(continue_retry_db);
+  continue_retry_db = dbm_file = NULL;
+  }
+
 /* If there are now no deferred addresses, we are done. Preserve the
 message log if so configured, and we are using them. Otherwise, sling it.
 Then delete the message itself. */
index 05387aa3f471b79bb4799f11c623c30842ee5d0e..f8fbd2b8c5450773365889a5d650708ccd1d4171 100644 (file)
@@ -88,6 +88,27 @@ if it is made static. */
 const uschar *hex_digits = CUS"0123456789abcdef";
 
 
+/*******************
+*   Debug output   *
+*******************/
+
+unsigned int debug_selector = 0;       /* set -1 for debugging */
+
+void
+debug_printf(const char * fmt, ...)
+{
+va_list ap;
+va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap);
+}
+void
+debug_printf_indent(const char * fmt, ...)
+{
+va_list ap;
+va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap);
+}
+
+
+
 #ifdef STRERROR_FROM_ERRLIST
 /* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror()
 in their libraries, but can provide the same facility by this simple
index dd1444593b0f5c9d1203e3f69f6d40fc2338145c..f3123c80bcc08b56e5a331cb187b710946a9f1ff 100644 (file)
@@ -112,6 +112,25 @@ exit(EXIT_FAILURE);
 
 
 
+/*******************
+*   Debug output   *
+*******************/
+
+unsigned int debug_selector = 0;       /* set -1 for debugging */
+
+void
+debug_printf(const char * fmt, ...)
+{
+va_list ap;
+va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap);
+}
+void
+debug_printf_indent(const char * fmt, ...)
+{
+va_list ap;
+va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap);
+}
+
 /*************************************************
 *           Sort out the command arguments       *
 *************************************************/
@@ -287,7 +306,6 @@ dbfn_open(const uschar * name, int flags, open_db * dbblock,
 {
 int rc;
 struct flock lock_data;
-BOOL read_only = (flags & (O_WRONLY|O_RDWR)) == O_RDONLY;
 uschar * dirname, * filename;
 
 /* The first thing to do is to open a separate file on which to lock. This
@@ -301,6 +319,7 @@ if (  asprintf(CSS &dirname, "%s/db", spool_directory) < 0
    || asprintf(CSS &filename, "%s/%s.lockfile", dirname, name) < 0)
   return NULL;
 
+dbblock->readonly = (flags & (O_WRONLY|O_RDWR)) == O_RDONLY;
 dbblock->lockfd = -1;
 if (exim_lockfile_needed())
   {
@@ -314,7 +333,7 @@ if (exim_lockfile_needed())
   /* Now we must get a lock on the opened lock file; do this with a blocking
   lock that times out. */
 
-  lock_data.l_type = read_only ? F_RDLCK : F_WRLCK;
+  lock_data.l_type = dbblock->readonly ? F_RDLCK : F_WRLCK;
   lock_data.l_whence = lock_data.l_start = lock_data.l_len = 0;
 
   sigalrm_seen = FALSE;
@@ -327,7 +346,7 @@ if (exim_lockfile_needed())
   if (rc < 0)
     {
     printf("** Failed to get %s lock for %s: %s",
-      read_only ? "read" : "write",
+      dbblock->readonly ? "read" : "write",
       filename,
       errno == ETIMEDOUT ? "timed out" : strerror(errno));
     (void)close(dbblock->lockfd);
@@ -340,10 +359,12 @@ if (exim_lockfile_needed())
 
 if (asprintf(CSS &filename, "%s/%s", dirname, name) < 0) return NULL;
 
-if (!(dbblock->dbptr = exim_dbopen(filename, dirname, flags, 0)))
+if (!(dbblock->dbptr = dbblock->readonly && !exim_lockfile_needed()
+                     ? exim_dbopen_multi(filename, dirname, flags, 0)
+                     : exim_dbopen(filename, dirname, flags, 0)))
   {
   printf("** Failed to open hintsdb file %s for %s: %s%s\n", filename,
-    read_only ? "reading" : "writing", strerror(errno),
+    dbblock->readonly ? "reading" : "writing", strerror(errno),
 #ifdef USE_DB
     " (or Berkeley DB error while opening)"
 #else
@@ -374,8 +395,13 @@ Returns:  nothing
 void
 dbfn_close(open_db * dbp)
 {
-exim_dbclose(dbp->dbptr);
-if (dbp->lockfd >= 0) (void) close(dbp->lockfd);
+if (dbp->readonly && !exim_lockfile_needed())
+  exim_dbclose_multi(dbp->dbptr);
+else
+  exim_dbclose(dbp->dbptr);
+
+if (dbp->lockfd >= 0)
+  (void) close(dbp->lockfd);
 }
 
 
@@ -422,6 +448,7 @@ we should store the taint status along with the data. */
 dlen = exim_datum_size_get(&result_datum);
 yield = store_get(dlen, GET_TAINTED);
 memcpy(yield, exim_datum_data_get(&result_datum), dlen);
+DEBUG(D_hints_lookup) debug_printf_indent("dbfn_read: size %u return\n", dlen);
 if (length) *length = dlen;
 
 exim_datum_free(&result_datum);    /* Some DBM libs require freeing */
index ba50ae1b976bfd75b4224d0ebb5cc064283cfc0c..a357914093a0b33b2969f43cbb7ec4fe5e6c68d3 100644 (file)
@@ -25,7 +25,11 @@ The API is:
   Functions:
     exim_lockfile_needed       API semantics predicate
     exim_dbopen
+    exim_dbopen_multi          only for no-lockfile-needed
     exim_dbclose
+    exim_dbclose_multi         only for no-lockfile-needed
+    exim_dbtransaction_start   only for no-lockfile-needed
+    exim_dbtransaction_commit  only for no-lockfile-needed
     exim_dbget
     exim_dbput
     exim_dbputb                        non-overwriting put
@@ -66,6 +70,9 @@ required by Exim's process transitions)?
 #ifndef HINTSDB_H
 #define HINTSDB_H
 
+/* Include file ordering problem */
+extern void    debug_printf_indent(const char *, ...) PRINTF_FUNCTION(1,2);
+
 
 #ifdef USE_SQLITE
 # if defined(USE_DB) || defined(USE_GDBM) || defined(USE_TDB)
@@ -103,20 +110,6 @@ the default is the NDBM interface (which seems to be a wrapper for GDBM) */
 
 
 
-#if defined(COMPILE_UTILITY) || defined(MACRO_PREDEF)
-
-static inline EXIM_DB *
-exim_dbopen(const uschar * name, const uschar * dirname, int flags,
-  unsigned mode)
-{
-return exim_dbopen__(name, dirname, flags, mode);
-}
-
-static inline void
-exim_dbclose(EXIM_DB * dbp)
-{ exim_dbclose__(dbp); }
-
-#else  /*  exim mainline code */
 
 /* Wrappers for open/close with debug tracing */
 
@@ -147,14 +140,43 @@ DEBUG(D_hints_lookup) debug_printf_indent("returned from EXIM_DBOPEN: %p\n", dbp
 return dbp;
 }
 
+static inline EXIM_DB *
+exim_dbopen_multi(const uschar * name, const uschar * dirname, int flags,
+  unsigned mode)
+{
+void * dbp;
+DEBUG(D_hints_lookup)
+  debug_printf_indent("EXIM_DBOPEN_MULTI: file <%s> dir <%s> flags=%s\n",
+    name, dirname,
+    flags == O_RDONLY ? "O_RDONLY"
+    : flags == O_RDWR ? "O_RDWR"
+    : flags == (O_RDWR|O_CREAT) ? "O_RDWR|O_CREAT"
+    : "??");
+if (is_tainted(name) || is_tainted(dirname))
+  {
+  log_write(0, LOG_MAIN|LOG_PANIC, "Tainted name for DB file not permitted");
+  dbp = NULL;
+  }
+else
+  dbp = exim_dbopen_multi__(name, dirname, flags, mode);
+
+DEBUG(D_hints_lookup) debug_printf_indent("returned from EXIM_DBOPEN_MULTI: %p\n", dbp);
+return dbp;
+}
+
 static inline void
 exim_dbclose(EXIM_DB * dbp)
 {
 DEBUG(D_hints_lookup) debug_printf_indent("EXIM_DBCLOSE(%p)\n", dbp);
 exim_dbclose__(dbp);
 }
+static inline void
+exim_dbclose_multi(EXIM_DB * dbp)
+{
+DEBUG(D_hints_lookup) debug_printf_indent("EXIM_DBCLOSE_MULTI(%p)\n", dbp);
+exim_dbclose_multi__(dbp);
+}
 
-#endif         /* defined(COMPILE_UTILITY) || defined(MACRO_PREDEF) */
 
 /********************* End of dbm library definitions **********************/
 
index e629cce4e4215f1641ff625924c6eb375f204ec6..48573e9072c76ab2d9f44fd4e652d24585a5532f 100644 (file)
@@ -48,6 +48,21 @@ definition of DB_VERSION_STRING, which is present in versions 2.x onwards. */
 #    define DB_FORCESYNC 0
 #   endif
 
+
+
+/* Berkeley DB uses a callback function to pass back error details. Its API
+changed at release 4.3. */
+
+#if defined(DB_VERSION_STRING)
+# if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 3)
+static void     dbfn_bdb_error_callback(const DB_ENV *, const char *, const char *);
+# else
+static void     dbfn_bdb_error_callback(const char *, char *);
+# endif
+#endif
+
+
+
 /* Error callback */
 /* For Berkeley DB >= 2, we can define a function to be called in case of DB
 errors. This should help with debugging strange DB problems, e.g. getting "File
@@ -73,9 +88,9 @@ return TRUE;
 }
 
 static inline EXIM_DB *
-exim_dbopen_multi(const uschar * name, const uschar * dirname, int flags,
+exim_dbopen_multi__(const uschar * name, const uschar * dirname, int flags,
   unsigned mode) { return NULL; }
-static inline void exim_dbclose_multi(EXIM_DB * dbp) {}
+static inline void exim_dbclose_multi__(EXIM_DB * dbp) {}
 static inline BOOL exim_dbtransaction_start(EXIM_DB * dbp) { return FALSE; }
 static inline void exim_dbtransaction_commit(EXIM_DB * dbp) {}
 
@@ -106,6 +121,9 @@ if (db_create(&b, dbp, 0) == 0)
              mode) == 0
          )
     return dbp;
+  else DEBUG(D_hints_lookup)
+    debug_printf_indent("bdb_open(flags 0x%x mode %04o) %s\n",
+             flags, mode, strerror(errno));
 
   b->close(b, 0);
   }
@@ -233,9 +251,9 @@ return TRUE;
 }
 
 static inline EXIM_DB *
-exim_dbopen_multi(const uschar * name, const uschar * dirname, int flags,
+exim_dbopen_multi__(const uschar * name, const uschar * dirname, int flags,
   unsigned mode) { return NULL; }
-static inline void exim_dbclose_multi(EXIM_DB * dbp) {}
+static inline void exim_dbclose_multi__(EXIM_DB * dbp) {}
 static inline BOOL exim_dbtransaction_start(EXIM_DB * dbp) { return FALSE; }
 static inline void exim_dbtransaction_commit(EXIM_DB * dbp) {}
 
index b406d45e0f7effdffbc00f8a62dc184d9b3d255d..6b37899795f1cbbb976e7278c4daa5f65ce96926 100644 (file)
@@ -41,9 +41,9 @@ return TRUE;
 }
 
 static inline EXIM_DB *
-exim_dbopen_multi(const uschar * name, const uschar * dirname, int flags,
+exim_dbopen_multi__(const uschar * name, const uschar * dirname, int flags,
   unsigned mode) { return NULL; }
-static inline void exim_dbclose_multi(EXIM_DB * dbp) {}
+static inline void exim_dbclose_multi__(EXIM_DB * dbp) {}
 static inline BOOL exim_dbtransaction_start(EXIM_DB * dbp) { return FALSE; }
 static inline void exim_dbtransaction_commit(EXIM_DB * dbp) {}
 
@@ -60,7 +60,12 @@ if (dbp)
     flags & O_CREAT ? GDBM_WRCREAT
     : flags & (O_RDWR|O_WRONLY) ? GDBM_WRITER : GDBM_READER,
     mode, 0);
-  if (dbp->gdbm) return dbp;
+  if (dbp->gdbm)
+    return dbp;
+
+  DEBUG(D_hints_lookup)
+    debug_printf_indent("gdbm_open(flags 0x%x mode %04o) %s\n",
+             flags, mode, strerror(errno));
   free(dbp);
   }
 return NULL;
index fb1db57a8f1def8779cac15a4b6d6e641b780471..389abd9e2284c67515aec0cd0a08b7788343cae6 100644 (file)
@@ -36,9 +36,9 @@ return TRUE;
 }
 
 static inline EXIM_DB *
-exim_dbopen_multi(const uschar * name, const uschar * dirname, int flags,
+exim_dbopen_multi__(const uschar * name, const uschar * dirname, int flags,
   unsigned mode) { return NULL; }
-static inline void exim_dbclose_multi(EXIM_DB * dbp) {}
+static inline void exim_dbclose_multi__(EXIM_DB * dbp) {}
 static inline BOOL exim_dbtransaction_start(EXIM_DB * dbp) { return FALSE; }
 static inline void exim_dbtransaction_commit(EXIM_DB * dbp) {}
 
@@ -54,9 +54,10 @@ exim_dbopen__(const uschar * name, const uschar * dirname, int flags,
 struct stat st;
 if (!(flags & O_CREAT) || lstat(CCS name, &st) != 0 && errno == ENOENT)
   return dbm_open(CS name, flags, mode);
-#ifndef COMPILE_UTILITY
-debug_printf("%s %d errno %s\n", __FUNCTION__, __LINE__, strerror(errno));
-#endif
+
+DEBUG(D_hints_lookup)
+  debug_printf_indent("ndbm_open(flags 0x%x mode %04o) %s\n",
+             flags, mode, strerror(errno));
 errno = (st.st_mode & S_IFMT) == S_IFDIR ? EISDIR : EEXIST;
 return NULL;
 }
index da3bc2bffeb16eae2b26d95d0102e2412021f813..262a414f62f467852405026f4eeab9e291888ccb 100644 (file)
@@ -35,11 +35,12 @@ return FALSE;       /* We do transaction; no extra locking needed */
 
 /* EXIM_DBOPEN - return pointer to an EXIM_DB, NULL if failed */
 static inline EXIM_DB *
-exim_dbopen_multi(const uschar * name, const uschar * dirname, int flags,
+exim_dbopen_multi__(const uschar * name, const uschar * dirname, int flags,
   unsigned mode)
 {
 EXIM_DB * dbp;
 int ret, sflags = flags & O_RDWR ? SQLITE_OPEN_READWRITE : SQLITE_OPEN_READONLY;
+
 if (flags & O_CREAT) sflags |= SQLITE_OPEN_CREATE;
 if ((ret = sqlite3_open_v2(CCS name, &dbp, sflags, NULL)) == SQLITE_OK)
   {
@@ -51,8 +52,9 @@ if ((ret = sqlite3_open_v2(CCS name, &dbp, sflags, NULL)) == SQLITE_OK)
   if (ret != SQLITE_OK)
     sqlite3_close(dbp);
   }
-//else
-//  fprintf(stderr, "sqlite3_open_v2: %s\n", sqlite3_errmsg(dbp));
+else DEBUG(D_hints_lookup)
+  debug_printf_indent("sqlite_open(flags 0x%x mode %04o) %s\n",
+                     flags, mode, sqlite3_errmsg(dbp));
 return ret == SQLITE_OK ? dbp : NULL;
 }
 
@@ -286,7 +288,7 @@ store_free(cursor);
 
 /* EXIM_DBCLOSE */
 static inline void
-exim_dbclose_multi(EXIM_DB * dbp)
+exim_dbclose_multi__(EXIM_DB * dbp)
 {
 sqlite3_close(dbp);
 }
index 436597115d4090bf7b21f0da30930148a9e33984..2b4fcc7f6c6c943661a692897d264265c230b797 100644 (file)
@@ -11,9 +11,6 @@
 backend provider. */
 
 /* ************************* tdb interface ************************ */
-/*XXX https://manpages.org/tdb/3 mentions concurrent writes.
-Could we lose the file lock? */
-
 # include <tdb.h>
 
 /* Basic DB type */
@@ -34,22 +31,39 @@ tdb_traverse to be called) */
 static inline BOOL
 exim_lockfile_needed(void)
 {
-return TRUE;
+return FALSE;          /* Transactions are supported */
 }
 
-static inline EXIM_DB *
-exim_dbopen_multi(const uschar * name, const uschar * dirname, int flags,
-  unsigned mode) { return NULL; }
-static inline void exim_dbclose_multi(EXIM_DB * dbp) {}
-static inline BOOL exim_dbtransaction_start(EXIM_DB * dbp) { return FALSE; }
-static inline void exim_dbtransaction_commit(EXIM_DB * dbp) {}
 
 /* EXIM_DBOPEN - return pointer to an EXIM_DB, NULL if failed */
 static inline EXIM_DB *
 exim_dbopen__(const uschar * name, const uschar * dirname, int flags,
   unsigned mode)
 {
-return tdb_open(CS name, 0, TDB_DEFAULT, flags, mode);
+EXIM_DB * db = tdb_open(CS name, 0, TDB_DEFAULT, flags, mode);
+int e;
+
+DEBUG(D_hints_lookup) if (!db)
+  debug_printf_indent("tdb_open(flags 0x%x mode %04o) %s\n",
+             flags, mode, strerror(errno));
+if (!db || tdb_transaction_start(db) == 0) return db;
+e = errno;
+DEBUG(D_hints_lookup) if (db)
+  debug_printf_indent("tdb_transaction_start: %s\n", tdb_errorstr(db));
+tdb_close(db);
+errno = e;
+return NULL;
+}
+
+static inline EXIM_DB *
+exim_dbopen_multi__(const uschar * name, const uschar * dirname, int flags,
+  unsigned mode)
+{
+EXIM_DB * db = tdb_open(CS name, 0, TDB_DEFAULT, flags, mode);
+DEBUG(D_hints_lookup) if (!db)
+  debug_printf_indent("tdb_open(flags 0x%x mode %04o) %s\n",
+             flags, mode, strerror(errno));
+return db;
 }
 
 /* EXIM_DBGET - returns TRUE if successful, FALSE otherwise */
@@ -60,10 +74,36 @@ exim_dbget(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * res)
 return res->dptr != NULL;
 }
 
+
+static inline BOOL
+exim_dbtransaction_start(EXIM_DB * db)
+{
+BOOL ok = tdb_transaction_start(db) == 0;
+DEBUG(D_hints_lookup) if (!ok)
+  debug_printf_indent("tdb_transaction_start: %s\n", tdb_errorstr(db));
+return ok;
+}
+
+static inline void
+exim_dbtransaction_commit(EXIM_DB * db)
+{
+BOOL ok = tdb_transaction_commit(db) == 0;
+DEBUG(D_hints_lookup) if (!ok)
+  debug_printf_indent("tdb_transaction_commit: %s\n", tdb_errorstr(db));
+return;
+}
+
+
+
 /* EXIM_DBPUT - returns nothing useful, assumes replace mode */
 static inline int
 exim_dbput(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data)
-{ return tdb_store(dbp, *key, *data, TDB_REPLACE); }
+{
+int rc = tdb_store(dbp, *key, *data, TDB_REPLACE);
+DEBUG(D_hints_lookup) if (rc != 0)
+  debug_printf_indent("tdb_store: %s\n", tdb_errorstr(dbp));
+return rc;
+}
 
 /* EXIM_DBPUTB - non-overwriting for use by dbmbuild */
 static inline int
@@ -109,12 +149,33 @@ return key->dptr != NULL;
 /* EXIM_DBDELETE_CURSOR - terminate scanning operation. */
 static inline void
 exim_dbdelete_cursor(EXIM_CURSOR * cursor)
-{ store_free(cursor); }
+{
+#ifdef COMPILE_UTILITY
+free(cursor);
+#else
+store_free(cursor);
+#endif
+}
 
 /* EXIM_DBCLOSE */
+static inline void
+exim_dbclose_multi__(EXIM_DB * db)
+{
+int rc = tdb_close(db);
+DEBUG(D_hints_lookup) if (rc != 0)
+  debug_printf_indent("tdb_close: %s\n", tdb_errorstr(db));
+}
+
 static inline void
 exim_dbclose__(EXIM_DB * db)
-{ tdb_close(db); }
+{
+int rc = tdb_transaction_commit(db);
+DEBUG(D_hints_lookup) if (rc != 0)
+  debug_printf_indent("tdb_transaction_commit: %s\n", tdb_errorstr(db));
+rc = tdb_close(db);
+DEBUG(D_hints_lookup) if (rc != 0)
+  debug_printf_indent("tdb_close: %s\n", tdb_errorstr(db));
+}
 
 /* Datum access */
 
index 5f50dfd5f38342a0d2d82eaadc5a7ab93599ed5c..5adb68eb5b406c4e4a3ff5087913878e87b7e851 100644 (file)
@@ -21,6 +21,7 @@ that relates to it. */
 typedef struct {
   void *       dbptr;
   int          lockfd;
+  BOOL         readonly;
 } open_db;
 
 
index 3073ee7805cefd6654a6474cc88e7529873fad45..57e5eb7692be9a25209b34c4259bee929ca9c206 100644 (file)
@@ -513,23 +513,31 @@ for (int i = queue_run_in_order ? -1 : 0;
           (double)load_average/1000.0,
           (double)deliver_queue_load_max/1000.0);
 
-    /* If initial of a 2-phase run, maintain a set of child procs
-    to get disk parallelism */
+    /* If initial of a 2-phase run (and not under the test-harness)
+    maintain a set of child procs to get disk parallelism */
 
     if (q->queue_2stage && !queue_run_in_order)
       {
       int i;
-      if (qpid[f.running_in_test_harness ? 0 : nelem(qpid) - 1])
-       {
-       DEBUG(D_queue_run) debug_printf("q2stage waiting for child %d\n", (int)qpid[0]);
+      if (qpid[
+#ifndef MEASURE_TIMING
+             f.running_in_test_harness ? 0 :
+#endif
+             nelem(qpid) - 1])
+       {               /* The child table is maxed out; wait for the oldest */
+       DEBUG(D_queue_run)
+         debug_printf("q2stage waiting for child %d\n", (int)qpid[0]);
        waitpid(qpid[0], NULL, 0);
-       DEBUG(D_queue_run) debug_printf("q2stage reaped child %d\n", (int)qpid[0]);
-       if (f.running_in_test_harness) i = 0;
-       else for (i = 0; i < nelem(qpid) - 1; i++) qpid[i] = qpid[i+1];
+       DEBUG(D_queue_run)
+         debug_printf("q2stage reaped child %d\n", (int)qpid[0]);
+#ifndef MEASURE_TIMING
+       if (f.running_in_test_harness) i = 0; else
+#endif
+         for (i = 0; i < nelem(qpid) - 1; i++) qpid[i] = qpid[i+1];
        qpid[i] = 0;
        }
       else
-       for (i = 0; qpid[i]; ) i++;
+       for (i = 0; qpid[i]; ) i++;             /* find first spare slot */
       if ((qpid[i] = exim_fork(US"qrun-phase-one")))
        continue;       /* parent loops around */
       }
@@ -565,7 +573,8 @@ for (int i = queue_run_in_order ? -1 : 0;
       follow. If the message is chosen for delivery, the header is read again
       in the deliver_message() function, in a subprocess. */
 
-      if (spool_read_header(fq->text, FALSE, TRUE) != spool_read_OK) goto go_around;
+      if (spool_read_header(fq->text, FALSE, TRUE) != spool_read_OK)
+       goto go_around;
       f.dont_deliver = orig_dont_deliver;
 
       /* Now decide if we want to deliver this message. As we have read the
@@ -739,6 +748,7 @@ single_item_retry:
     set_process_info("running queue");
 
     /* If initial of a 2-phase run, we are a child - so just exit */
+
     if (q->queue_2stage && !queue_run_in_order)
       exim_exit(EXIT_SUCCESS);
 
index e86b1afe8dbee4042400398e9c690511c237b351..c32bd85b7c21e85f3842f37e875979735bdddbcd 100644 (file)
@@ -153,19 +153,23 @@ retry_check_address(const uschar *domain, host_item *host, uschar *portstring,
 BOOL yield = FALSE;
 time_t now = time(NULL);
 const uschar * host_key, * message_key;
-open_db dbblock, * dbm_file;
+open_db dbblock, * dbm_file = NULL;
 tree_node * node;
 dbdata_retry * host_retry_record, * message_retry_record;
 
 *retry_host_key = *retry_message_key = NULL;
 
-DEBUG(D_transport|D_retry) debug_printf("checking retry status of %s\n", host->name);
-
 /* Do nothing if status already set; otherwise initialize status as usable. */
 
 if (host->status != hstatus_unknown) return FALSE;
 host->status = hstatus_usable;
 
+DEBUG(D_transport|D_retry)
+  {
+  debug_printf_indent("checking retry status of %s\n", host->name);
+  acl_level++;
+  }
+
 /* Generate the host key for the unusable tree and the retry database. Ensure
 host names are lower cased (that's what %S does).
 Generate the message-specific key too.
@@ -182,11 +186,12 @@ the retry database when it is updated). */
 
 if ((node = tree_search(tree_unusable, host_key)))
   {
-  DEBUG(D_transport|D_retry) debug_printf("found in tree of unusables\n");
-  host->status = (node->data.val > 255)?
-    hstatus_unusable_expired : hstatus_unusable;
+  DEBUG(D_transport|D_retry)
+    debug_printf_indent("found in tree of unusables\n");
+  host->status = node->data.val > 255
+    ? hstatus_unusable_expired : hstatus_unusable;
   host->why = node->data.val & 255;
-  return FALSE;
+  goto out;
   }
 
 /* Open the retry database, giving up if there isn't one. Otherwise, search for
@@ -194,40 +199,49 @@ the retry records, and then close the database again. */
 
 if (!continue_retry_db)
   dbm_file = dbfn_open(US"retry", O_RDONLY, &dbblock, FALSE, TRUE);
-else if ((dbm_file = continue_retry_db) == (open_db *)-1)
-  dbm_file = NULL;
+else if (continue_retry_db != (open_db *)-1)
+  {
+  DEBUG(D_hints_lookup)
+    debug_printf_indent(" using cached retry hintsdb handle\n");
+  dbm_file = continue_retry_db;
+  }
+else DEBUG(D_hints_lookup)
+    debug_printf_indent(" using cached retry hintsdb nonpresence\n");
 
 if (!dbm_file)
   {
   DEBUG(D_deliver|D_retry|D_hints_lookup)
-    debug_printf("no retry data available\n");
-  return FALSE;
+    debug_printf_indent("no retry data available\n");
+  goto out;
   }
 host_retry_record = dbfn_read(dbm_file, host_key);
 message_retry_record = dbfn_read(dbm_file, message_key);
 if (!continue_retry_db)
   dbfn_close(dbm_file);
+else
+  DEBUG(D_hints_lookup) debug_printf_indent("retaining retry hintsdb handle\n");
 
 /* Ignore the data if it is too old - too long since it was written */
 
 if (!host_retry_record)
   {
-  DEBUG(D_transport|D_retry) debug_printf("no host retry record\n");
+  DEBUG(D_transport|D_retry) debug_printf_indent("no host retry record\n");
   }
 else if (now - host_retry_record->time_stamp > retry_data_expire)
   {
   host_retry_record = NULL;
-  DEBUG(D_transport|D_retry) debug_printf("host retry record too old\n");
+  DEBUG(D_transport|D_retry) debug_printf_indent("host retry record too old\n");
   }
 
 if (!message_retry_record)
   {
-  DEBUG(D_transport|D_retry) debug_printf("no message retry record\n");
+  DEBUG(D_transport|D_retry) debug_printf_indent("no message retry record\n");
   }
 else if (now - message_retry_record->time_stamp > retry_data_expire)
   {
   message_retry_record = NULL;
-  DEBUG(D_transport|D_retry) debug_printf("message retry record too old\n");
+  DEBUG(D_transport|D_retry)
+    debug_printf_indent("message retry record too old\n");
   }
 
 /* If there's a host-specific retry record, check for reaching the retry
@@ -249,7 +263,7 @@ if (host_retry_record)
     if (!host_retry_record->expired &&
         retry_ultimate_address_timeout(host_key, domain,
           host_retry_record, now))
-      return FALSE;
+      goto out;
 
     /* We have not hit the ultimate address timeout; host is unusable. */
 
@@ -257,7 +271,7 @@ if (host_retry_record)
       hstatus_unusable_expired : hstatus_unusable;
     host->why = hwhy_retry;
     host->last_try = host_retry_record->last_try;
-    return FALSE;
+    goto out;
     }
 
   /* Host is usable; set return TRUE if expired. */
@@ -280,10 +294,12 @@ if (message_retry_record)
       host->status = hstatus_unusable;
       host->why = hwhy_retry;
       }
-    return FALSE;
+    yield = FALSE; goto out;
     }
   }
 
+out:
+DEBUG(D_transport|D_retry) acl_level--;
 return yield;
 }
 
@@ -531,6 +547,7 @@ return yield;
 /* Update the retry data for any directing/routing/transporting that was
 deferred, or delete it for those that succeeded after a previous defer. This is
 done all in one go to minimize opening/closing/locking of the database file.
+Called (only) from deliver_message().
 
 Note that, because SMTP delivery involves a list of destinations to try, there
 may be defer-type retry information for some of them even when the message was
@@ -590,8 +607,7 @@ for (int i = 0; i < 3; i++)
 
     for (addr = endaddr; addr; addr = addr->parent)
       {
-      int update_count = 0;
-      int timedout_count = 0;
+      int update_count = 0, timedout_count = 0;
 
       DEBUG(D_retry)
        {
@@ -617,14 +633,20 @@ for (int i = 0; i < 3; i++)
         reached their retry next try time. */
 
         if (!dbm_file)
-          dbm_file = dbfn_open(US"retry", O_RDWR|O_CREAT, &dbblock, TRUE, TRUE);
-
-        if (!dbm_file)
-          {
-          DEBUG(D_deliver|D_retry|D_hints_lookup)
-            debug_printf_indent("retry database not available for updating\n");
-          return;
-          }
+         if (continue_retry_db && continue_retry_db != (open_db *)-1)
+           {
+           DEBUG(D_hints_lookup)
+             debug_printf_indent("using cached retry hintsdb handle\n");
+           dbm_file = continue_retry_db;
+           }
+         else if (!(dbm_file = exim_lockfile_needed()
+                   ? dbfn_open(US"retry", O_RDWR|O_CREAT, &dbblock, TRUE, TRUE)
+                   : dbfn_open_multi(US"retry", O_RDWR|O_CREAT, &dbblock)))
+           {
+           DEBUG(D_deliver|D_retry|D_hints_lookup)
+             debug_printf_indent("retry db not available for updating\n");
+           return;
+           }
 
         /* If there are no deferred addresses, that is, if this message is
         completing, and the retry item is for a message-specific SMTP error,
@@ -699,6 +721,12 @@ for (int i = 0; i < 3; i++)
          message_length = EXIM_DB_RLIMIT;
          }
 
+       /* For a transaction-capable DB, open one for the read,write
+       sequence used for this retry record */
+
+       if (!exim_lockfile_needed())
+         dbfn_transaction_start(dbm_file);
+
         /* Read a retry record from the database or construct a new one.
         Ignore an old one if it is too old since it was last updated. */
 
@@ -888,8 +916,12 @@ for (int i = 0; i < 3; i++)
           debug_printf(" %s\n", retry_record->text);
           }
 
-        (void)dbfn_write(dbm_file, rti->key, retry_record,
-          sizeof(dbdata_retry) + message_length);
+        if (dbfn_write(dbm_file, rti->key, retry_record,
+                     sizeof(dbdata_retry) + message_length) != 0)
+         DEBUG(D_retry) debug_printf_indent("retry record write failed\n");
+
+       if (!exim_lockfile_needed())
+         dbfn_transaction_commit(dbm_file);
         }                            /* Loop for each retry item */
       DEBUG(D_retry) acl_level--;
 
@@ -971,9 +1003,17 @@ for (int i = 0; i < 3; i++)
 
 /* Close and unlock the database */
 
-if (dbm_file) dbfn_close(dbm_file);
+if (dbm_file)
+  if (dbm_file != continue_retry_db)
+      if (exim_lockfile_needed())
+       dbfn_close(dbm_file);
+      else
+       dbfn_close_multi(dbm_file);
+  else DEBUG(D_hints_lookup)
+    debug_printf_indent("retaining retry hintsdb handle\n");
 
-DEBUG(D_retry) { acl_level--; debug_printf_indent("end of retry processing\n"); }
+DEBUG(D_retry)
+  { acl_level--; debug_printf_indent("end of retry processing\n"); }
 }
 
 /* End of retry.c */
index a41298f73b7b2e2634dc01cb05e79fe6ed674c1b..6a00a464250a687eaa3cc20cb7d76e6ab28dbdaa 100755 (executable)
@@ -1178,6 +1178,30 @@ RESET_AFTER_EXTRA_LINE_READ:
     next if /lock(?:ing|ed) .*\/spool\/db\/[^.]+\.lockfile$/;
     s/closed hints database\K and lockfile$//;
 
+    # Hints DBs with transactions are provider-dependent, and flow changes
+    # to take advantage of them need different opens and different flags.
+    # Drop all the debug output for opens and closes.
+    if (/EXIM_DBOPEN(_MULTI)?: file <.*spool\/db\/retry>/)
+      {
+      $_ = <IN>;
+      next if (/returned from EXIM_DBOPEN(_MULTI)?: 0x[[:xdigit:]]+$/);
+      $_ = <IN>;
+      <IN> if (/returned from EXIM_DBOPEN(_MULTI)?: \(nil\)$/);
+      next;
+      }
+    if (/EXIM_DBCLOSE(_MULTI)?/) { <IN>; next; }
+    next if /retaining retry hintsdb handle$/;
+    next if /using cached retry hintsdb (?:handle|nonpresence)$/;
+    if (/final close of cached retry db$/) { <IN>; <IN>; next; }
+    next if /dbfn_transaction_(?:start|commit)$/;
+
+    # Various hintsdb backends
+    s/(?:bdb|tdb|gdbm|ndbm|sqlite)
+      _open\(flags\ 0x(\d)
+      \ mode\ 0640\)
+      (?=\ No\ such\ file\ or\ directory$)
+     /hintsdb_open(flags 0x$1 mode 0640)/x;
+
     # Lines with a leading pid.  Only handle >= 4-digit PIDs to avoid converting SMTP respose codes
     s/^\s*(\d{4,})\s(?!(?:previous message|in\s|bytes remain in|SMTP accept process running))/new_value($1, "p%s", \$next_pid) . ' '/e;
 
@@ -1390,19 +1414,6 @@ RESET_AFTER_EXTRA_LINE_READ:
 
     next if /failed to load readline:/;
 
-    # Some DBM libraries seem to make DBM files on opening with O_RDWR without
-    # O_CREAT; other's don't. In the latter case there is some debugging output
-    # which is not present in the former. Skip the relevant lines (there are
-    # three of them).
-
-    if (/returned from EXIM_DBOPEN: \(nil\)/)
-      {
-      $_ .= <IN>;
-      s?\Q$parm_cwd\E?TESTSUITE?g;
-      if (/TESTSUITE\/spool\/db\/\S+ appears not to exist: trying to create/)
-       { $_ = <IN>; next; }
-      }
-
     # Some tests turn on +expand debugging to check on expansions.
     # Unfortunately, the Received: expansion varies, depending on whether TLS
     # is compiled or not. So we must remove the relevant debugging if it is.
index c4638ea603cf1ed14efbc5a4ba34e3f2daa65480..aa6187d0d2a595b9cc2efc8b3b2a10d576cce933 100644 (file)
@@ -259,9 +259,6 @@ body_linecount=0 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@test.ex
@@ -459,9 +456,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> userx@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to userx <userx@test.ex> transport=t1
index 58729d516afe50fe81b623b6865203b2301c23d2..fd94ee0c007bbd621df606920ccf39633c39fd29 100644 (file)
@@ -164,9 +164,6 @@ body_linecount=0 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   CALLER@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: CALLER@test.ex
@@ -259,9 +256,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> CALLER@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to CALLER <CALLER@test.ex> transport=t1
index a861c737ddfe85724fc8d0e8780ee5ee2e0fe5ce..4048d801fa6ba40a3294c1979a7d00f177c14ed1 100644 (file)
@@ -25,7 +25,7 @@ After routing:
   Failed addresses:
   Deferred addresses:
 checking retry status of 127.0.0.1
-no retry data available
+ no retry data available
 added retry item for R:userx@test.ex:<CALLER@test.ex>: errno=-44 more_errno=dd,A flags=0
 cmdlog: '220:EHLO:250:MAIL:250:RCPT:451:QUIT+:250'
 >>>>>>>>>>>>>>>> Exim pid=p1239 (transport) terminating with rc=0 >>>>>>>>>>>>>>>>
@@ -69,8 +69,8 @@ After routing:
   Failed addresses:
   Deferred addresses:
 checking retry status of 127.0.0.1
-no host retry record
-no message retry record
+ no host retry record
+ no message retry record
 added retry item for R:userx@test.ex:<CALLER@test.ex>: errno=-44 more_errno=dd,A flags=0
 cmdlog: '220:EHLO:250:MAIL:250:RCPT:451:QUIT+:250'
 >>>>>>>>>>>>>>>> Exim pid=p1240 (transport) terminating with rc=0 >>>>>>>>>>>>>>>>
@@ -127,8 +127,8 @@ After routing:
   Failed addresses:
   Deferred addresses:
 checking retry status of 127.0.0.1
-no host retry record
-no message retry record
+ no host retry record
+ no message retry record
 added retry item for R:userx@test.ex:<CALLER@test.ex>: errno=-44 more_errno=dd,A flags=0
 cmdlog: '220:EHLO:250:MAIL:250:RCPT:451:QUIT+:250'
 >>>>>>>>>>>>>>>> Exim pid=p1242 (transport) terminating with rc=0 >>>>>>>>>>>>>>>>
index b4c68382ba043c857d5e4e15dc3efded20e76782..d51bcf1a90014cd632ba11d624fff93e6a2c5d70 100644 (file)
@@ -31,7 +31,7 @@ After routing:
   Failed addresses:
   Deferred addresses:
 checking retry status of 127.0.0.1
-no retry data available
+ no retry data available
 added retry item for R:userx@test.ex:<CALLER@test.ex>: errno=-44 more_errno=dd,A flags=0
 added retry item for R:usery@test.ex:<CALLER@test.ex>: errno=-44 more_errno=dd,A flags=0
 cmdlog: '220:EHLO:250:MAIL:250:RCPT:451:RCPT:451:QUIT+:250'
@@ -95,8 +95,8 @@ After routing:
   Failed addresses:
   Deferred addresses:
 checking retry status of 127.0.0.1
-no host retry record
-no message retry record
+ no host retry record
+ no message retry record
 added retry item for R:userx@test.ex:<CALLER@test.ex>: errno=-44 more_errno=dd,A flags=0
 added retry item for R:usery@test.ex:<CALLER@test.ex>: errno=-44 more_errno=dd,A flags=0
 cmdlog: '220:EHLO:250:MAIL:250:RCPT:451:RCPT:451:QUIT+:250'
index d54cdc43d063a55bb3e469aeb68694fb6534189d..171d925e6ba7a9a574421a968ed010dfcad7ee88 100644 (file)
@@ -78,9 +78,6 @@ body_linecount=0 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   kilos@recurse.test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: kilos@recurse.test.ex
@@ -136,9 +133,6 @@ rewriting header lines
 rewrite_one_header: type=F:
   From: CALLER_NAME <CALLER@test.ex>
 re-routed to kilos@recurse.test.ex.test.ex
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: kilos@recurse.test.ex.test.ex
@@ -182,9 +176,6 @@ r3 router generated kilos@recurse.test.ex.test.ex
 routed by r3 router
   envelope to: kilos@recurse.test.ex.test.ex
   transport: <none>
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: kilos@recurse.test.ex.test.ex
@@ -235,9 +226,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> kilos@recurse.test.ex.test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to kilos <kilos@recurse.test.ex.test.ex> transport=t2
index db54ea8f40bb6f4bf5478ac4ded535a89d8f0e7f..fa1cfb63ed0c8d50392ac3d3631e626d13b92371 100644 (file)
@@ -312,9 +312,6 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   2@b 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: 2@b
@@ -348,9 +345,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> 2@b <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to 2 <2@b> transport=t1
@@ -508,9 +502,6 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   2@b 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: 2@b
@@ -544,9 +535,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> 2@b <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to 2 <2@b> transport=t1
index 152c91a27b24eb6193890f890118aadda4899f36..d924179fa5173d39d28ee825503887d138c1c8a0 100644 (file)
@@ -7,9 +7,6 @@ admin user
 dropping to exim gid; retaining priv uid
 set_process_info: pppp delivering specified messages
 set_process_info: pppp delivering 10HmaX-000000005vi-0000
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: x@y
@@ -77,10 +74,7 @@ changed uid/gid: remote delivery to x@y with transport=smtp
   uid=EXIM_UID gid=EXIM_GID pid=p1235
 set_process_info: pppp delivering 10HmaX-000000005vi-0000 using smtp
 checking retry status of 127.0.0.1
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
-no retry data available
+ no retry data available
 127.0.0.1 in serialize_hosts? no (option unset)
 set_process_info: pppp delivering 10HmaX-000000005vi-0000 to 127.0.0.1 [127.0.0.1]:PORT_S (x@y)
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ...
@@ -118,10 +112,7 @@ set_process_info: pppp delivering 10HmaX-000000005vi-0000: just tried 127.0.0.1
  *@127.0.0.1 in "*"? yes (matched "*")
 Clearing TFO as not first host for message
 checking retry status of V4NET.0.0.0
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
-no retry data available
+ no retry data available
 V4NET.0.0.0 in serialize_hosts? no (option unset)
 set_process_info: pppp delivering 10HmaX-000000005vi-0000 to V4NET.0.0.0 [V4NET.0.0.0]:PORT_S (x@y)
 Connecting to V4NET.0.0.0 [V4NET.0.0.0]:PORT_S ...
@@ -152,45 +143,40 @@ Processing retry items
  Failed addresses:
  Deferred addresses:
   x@y
-   ╎EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDWR
-   ╎returned from EXIM_DBOPEN: 0xAAAAAAAA
-   ╎opened hints database TESTSUITE/spool/db/retry: flags=O_RDWR|O_CREAT
-   ╎x@y in "*"?
+   x@y in "*"?
+   ╎list element: *
+   ╎address match test: subject=x@y pattern=*
+   ╎y in "*"?
    ╎ list element: *
-   ╎ address match test: subject=x@y pattern=*
-   ╎ y in "*"?
-   ╎  list element: *
-   ╎  y in "*"? yes (matched "*")
-   ╎ x@y in "*"? yes (matched "*")
-   ╎retry for R:x@y = * 0 0
-   ╎dbfn_read: key=R:x@y
-   ╎dbfn_read: null return
-   ╎failing_interval=ttt message_age=ttt
-   ╎Writing retry data for R:x@y
-   ╎  first failed=dddd last try=dddd next try=+1 expired=1
-   ╎  errno=-44 more_errno=dd,A H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<x@y>: 451 Temporary error
-   ╎dbfn_write: key=R:x@y datalen nn
-   ╎*@V4NET.0.0.0 in "*"?
+   ╎ y in "*"? yes (matched "*")
+   ╎x@y in "*"? yes (matched "*")
+   retry for R:x@y = * 0 0
+   dbfn_read: key=R:x@y
+   dbfn_read: null return
+   failing_interval=ttt message_age=ttt
+   Writing retry data for R:x@y
+     first failed=dddd last try=dddd next try=+1 expired=1
+     errno=-44 more_errno=dd,A H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<x@y>: 451 Temporary error
+   dbfn_write: key=R:x@y datalen nn
+   *@V4NET.0.0.0 in "*"?
+   ╎list element: *
+   ╎address match test: subject=*@V4NET.0.0.0 pattern=*
+   ╎V4NET.0.0.0 in "*"?
    ╎ list element: *
-   ╎ address match test: subject=*@V4NET.0.0.0 pattern=*
-   ╎ V4NET.0.0.0 in "*"?
-   ╎  list element: *
-   ╎  V4NET.0.0.0 in "*"? yes (matched "*")
-   ╎ *@V4NET.0.0.0 in "*"? yes (matched "*")
-   ╎retry for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S (y) = * 0 0
-   ╎dbfn_read: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S
-   ╎dbfn_read: null return
-   ╎failing_interval=ttt message_age=ttt
-   ╎on queue longer than maximum retry
-   ╎Writing retry data for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S
-   ╎  first failed=dddd last try=dddd next try=+0 expired=0
-   ╎  errno=dd more_errno=dd,A Network Error
-   ╎dbfn_write: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S datalen nn
-   timed out: all retries expired
+   ╎ V4NET.0.0.0 in "*"? yes (matched "*")
+   ╎*@V4NET.0.0.0 in "*"? yes (matched "*")
+   retry for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S (y) = * 0 0
+   dbfn_read: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S
+   dbfn_read: null return
+   failing_interval=ttt message_age=ttt
+   on queue longer than maximum retry
+   Writing retry data for T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S
+     first failed=dddd last try=dddd next try=+0 expired=0
+     errno=dd more_errno=dd,A Network Error
+   dbfn_write: key=T:[V4NET.0.0.0]:V4NET.0.0.0:PORT_S datalen nn
+  timed out: all retries expired
 LOG: MAIN
   ** x@y: retry timeout exceeded
-  EXIM_DBCLOSE(0xAAAAAAAA)
-  closed hints database
 end of retry processing
 exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xd7715ced -MCd bounce-message -odi -odi -t -oem -oi -f <> -E10HmaX-000000005vi-0000
 Exim version x.yz ....
@@ -263,24 +249,19 @@ admin user
 dropping to exim gid; retaining priv uid
 set_process_info: pppp delivering specified messages
 set_process_info: pppp delivering 10HmaY-000000005vi-0000
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/retry: flags=O_RDONLY
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: CALLER@myhost.test.ex
 unique = CALLER@myhost.test.ex
- checking router retry status
 dbfn_read: key=R:myhost.test.ex
 dbfn_read: null return
 dbfn_read: key=R:CALLER@myhost.test.ex
 dbfn_read: null return
 dbfn_read: key=R:CALLER@myhost.test.ex:<>
 dbfn_read: null return
 no   domain  retry record
 no   address retry record
+checking router retry status
+ dbfn_read: key=R:myhost.test.ex
+ dbfn_read: null return
+ dbfn_read: key=R:CALLER@myhost.test.ex
+ dbfn_read: null return
+ dbfn_read: key=R:CALLER@myhost.test.ex:<>
+ dbfn_read: null return
+ no   domain  retry record
+ no   address retry record
 CALLER@myhost.test.ex: queued for routing
- EXIM_DBCLOSE(0xAAAAAAAA)
- closed hints database
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 routing CALLER@myhost.test.ex
 --------> r0 router <--------
index 169c332ad00abd645bc39968813c8c82ebf9c53c..86fbb5acdd115531e6cec2b8461b07b5151df7d7 100644 (file)
@@ -141,15 +141,12 @@ routed by r2 router
 Attempting full verification using callout
  EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR
  returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR|O_CREAT
- dbfn_read: key=remote
- dbfn_read: size nnn return
- callout cache: found domain record for remote
- dbfn_read: key=qq@remote
- dbfn_read: null return
- callout cache: no address record found for qq@remote
- EXIM_DBCLOSE(0xAAAAAAAA)
- closed hints database
+dbfn_read: key=remote
+dbfn_read: size nnn return
+callout cache: found domain record for remote
+dbfn_read: key=qq@remote
+dbfn_read: null return
+callout cache: no address record found for qq@remote
 interface=NULL port=PORT_S
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ...
  127.0.0.1 in hosts_try_fastopen?
@@ -177,14 +174,11 @@ cmd buf flush ddd bytes
 cmdlog: '220:EHLO:250:MAIL:250:RCPT:550:QUIT:250'
  EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR
  returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR|O_CREAT
- dbfn_write: key=remote datalen nn
- wrote callout cache domain record for remote:
-   result=1 postmaster=0 random=0
- dbfn_write: key=qq@remote datalen nn
- wrote negative callout cache address record for qq@remote
- EXIM_DBCLOSE(0xAAAAAAAA)
- closed hints database
+dbfn_write: key=remote datalen nn
+wrote callout cache domain record for remote:
+  result=1 postmaster=0 random=0
+dbfn_write: key=qq@remote datalen nn
+wrote negative callout cache address record for qq@remote
 ----------- end verify ------------
 l_message: $acl_verify_message
 warn: condition test succeeded in ACL "rcpt"
@@ -274,16 +268,13 @@ routed by r2 router
 Attempting full verification using callout
  EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR
  returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR|O_CREAT
- dbfn_read: key=remote
- dbfn_read: size nnn return
- callout cache: found domain record for remote
- dbfn_read: key=qq@remote
- dbfn_read: size nnn return
- callout cache: found address record for qq@remote
- callout cache: address record is negative
- EXIM_DBCLOSE(0xAAAAAAAA)
- closed hints database
+dbfn_read: key=remote
+dbfn_read: size nnn return
+callout cache: found domain record for remote
+dbfn_read: key=qq@remote
+dbfn_read: size nnn return
+callout cache: found address record for qq@remote
+callout cache: address record is negative
 ----------- end verify ------------
 l_message: $acl_verify_message
 warn: condition test succeeded in ACL "rcpt"
index bf80809c83bb4ed1217ac561f32fb1e5041ba8f9..a9dab0cdc8cdb76c0fd2b465a0a60a50b0aa4b31 100644 (file)
@@ -447,9 +447,6 @@ Delivery address list:
   userz@test.ex 
   rd+CALLER@test.ex 
   rd+usery@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: CALLER@test.ex
@@ -724,9 +721,6 @@ try option unseen
 routed by r1 router
   envelope to: CALLER@test.ex
   transport: t1
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: TESTSUITE/test-mail/junk
@@ -750,9 +744,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> TESTSUITE/test-mail/junk <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 try option max_parallel
 try option return_path
@@ -849,9 +840,6 @@ rd+usery@test.ex: children all complete
 LOG: MAIN
   => TESTSUITE/test-mail/junk <rd+usery@test.ex> R=r5 T=ft1
 --------> TESTSUITE/test-mail/junk <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 try option max_parallel
 try option return_path
@@ -940,9 +928,6 @@ rd+CALLER@test.ex: children all complete
 LOG: MAIN
   => TESTSUITE/test-mail/junk <rd+CALLER@test.ex> R=r4 T=ft1
 --------> CALLER@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 try option max_parallel
 try option return_path
@@ -974,9 +959,6 @@ CALLER@test.ex delivered
 LOG: MAIN
   => CALLER <CALLER@test.ex> R=r1 T=t1
 --------> usery@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 try option max_parallel
 try option return_path
@@ -1016,9 +998,6 @@ usery@test.ex delivered
 LOG: MAIN
   => usery <usery@test.ex> R=r2 T=t1
 --------> userz@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 try option max_parallel
 try option return_path
index 79dde380b5453055e1cb561d120ed24b82a9ebba..449b63a6d190f9792bd09c4ff2d2d5690cc610a8 100644 (file)
@@ -72,9 +72,6 @@ body_linecount=0 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@test.ex
@@ -160,9 +157,6 @@ r2 router generated TESTSUITE/test-mail/junk
 routed by r2 router
   envelope to: userx@test.ex
   transport: <none>
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: TESTSUITE/test-mail/junk
@@ -178,9 +172,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> TESTSUITE/test-mail/junk <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to TESTSUITE/test-mail/junk <TESTSUITE/test-mail/junk> transport=t1
@@ -311,9 +302,6 @@ body_linecount=0 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   charlie@dom1.ain 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: charlie@dom1.ain
@@ -377,9 +365,6 @@ r1 router generated TESTSUITE/test-mail/junk
 routed by r1 router
   envelope to: charlie@dom1.ain
   transport: <none>
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: TESTSUITE/test-mail/junk
@@ -395,9 +380,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> TESTSUITE/test-mail/junk <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to TESTSUITE/test-mail/junk <TESTSUITE/test-mail/junk> transport=t1
index e1dbb4656b016bea9bc77e6efd2c08c55de804e8..b3b91e2279839fc8df4ca9dbf1b5d6f6cb470297 100644 (file)
@@ -173,9 +173,6 @@ body_linecount=0 message_linecount=160
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@test.ex
@@ -218,9 +215,6 @@ r2 router generated >sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex
 routed by r2 router
   envelope to: userx@test.ex
   transport: <none>
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: >sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex, ...
@@ -236,9 +230,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> >sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex, ... <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to >sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex, ... <>sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex,sender@test.ex, ...> transport=t1
@@ -2762,9 +2753,6 @@ Delivery address list:
   sender@test.ex 
   sender@test.ex 
   sender@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: sender@test.ex
@@ -19191,9 +19179,6 @@ sender@test.ex is a duplicate address: discarded
 sender@test.ex is a duplicate address: discarded
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> sender@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to sender <sender@test.ex> transport=t2
index 6666f2209420a2cc4c87dd99d9182278c108ffc4..38c34876511d7545dc151e98f2a2058374374efa 100644 (file)
@@ -72,9 +72,6 @@ body_linecount=0 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@test.ex
@@ -140,9 +137,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> userx@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to userx <userx@test.ex> transport=t1
index 162877b7a9c0150e4d06e18e631c02d5332e6406..b6629f8932e4f7cce148fb1693d510882d396807 100644 (file)
@@ -93,16 +93,17 @@ get[host|ipnode]byname[2] looked up these IP addresses:
   name=127.0.0.1 address=127.0.0.1
 Attempting full verification using callout
  EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR
+ hintsdb_open(flags 0x2 mode 0640) No such file or directory
+ returned from EXIM_DBOPEN: (nil)
+ TESTSUITE/spool/db/callout appears not to exist: trying to create
+ EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR|O_CREAT
  returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR|O_CREAT
- dbfn_read: key=y
- dbfn_read: null return
- callout cache: no domain record found for y
- dbfn_read: key=x@y
- dbfn_read: null return
- callout cache: no address record found for x@y
- EXIM_DBCLOSE(0xAAAAAAAA)
- closed hints database
+dbfn_read: key=y
+dbfn_read: null return
+callout cache: no domain record found for y
+dbfn_read: key=x@y
+dbfn_read: null return
+callout cache: no address record found for x@y
 interface=NULL port=PORT_S
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_S ...
  127.0.0.1 in hosts_try_fastopen?
@@ -130,14 +131,11 @@ cmd buf flush ddd bytes
 cmdlog: '220:EHLO:250:MAIL:250:RCPT:250:QUIT:220'
  EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR
  returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR|O_CREAT
- dbfn_write: key=y datalen nn
- wrote callout cache domain record for y:
-   result=1 postmaster=0 random=0
- dbfn_write: key=x@y datalen nn
- wrote positive callout cache address record for x@y
- EXIM_DBCLOSE(0xAAAAAAAA)
- closed hints database
+dbfn_write: key=y datalen nn
+wrote callout cache domain record for y:
+  result=1 postmaster=0 random=0
+dbfn_write: key=x@y datalen nn
+wrote positive callout cache address record for x@y
 ----------- end verify ------------
 sender x@y verified ok
 accept: condition test succeeded in ACL "mail"
@@ -216,16 +214,13 @@ get[host|ipnode]byname[2] looked up these IP addresses:
 Attempting full verification using callout
  EXIM_DBOPEN: file <TESTSUITE/spool/db/callout> dir <TESTSUITE/spool/db> flags=O_RDWR
  returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/callout: flags=O_RDWR|O_CREAT
- dbfn_read: key=y
- dbfn_read: size nnn return
- callout cache: found domain record for y
- dbfn_read: key=x@y
- dbfn_read: size nnn return
- callout cache: found address record for x@y
- callout cache: address record is positive
- EXIM_DBCLOSE(0xAAAAAAAA)
- closed hints database
+dbfn_read: key=y
+dbfn_read: size nnn return
+callout cache: found domain record for y
+dbfn_read: key=x@y
+dbfn_read: size nnn return
+callout cache: found address record for x@y
+callout cache: address record is positive
 ----------- end verify ------------
 sender x@y verified ok
 accept: condition test succeeded in ACL "mail"
index 75b2e88ff248a04729fd161af2a2b0f5787c18ae..dec7fe0acf6c1c551b062ea1d8606f1d4a090edc 100644 (file)
@@ -49,8 +49,8 @@ t1 transport entered
 using the transport's hosts: 127.0.0.1
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no host retry record
-no message retry record
+ no host retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1112 retry-status = usable
 delivering 10HmaX-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@test.ex)
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_D2 ...
index e83c006cb4e260ca1e30791db432dbb3dcfe567c..3a321a72727693a3d1d5e15829184986cd9775e8 100644 (file)
@@ -125,7 +125,7 @@ t1 transport entered
 hostlist:
   '127.0.0.1' IP 127.0.0.1 port -1
 checking retry status of 127.0.0.1
-no message retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = unusable
 all IP addresses skipped or deferred at least one address
 updating wait-t1 database
index 3b692c2c5c3d6aa802ed8752caed74fcca3db3e2..868741f5bc420dc5fbeb98e89199c6aa2a1b6889 100644 (file)
@@ -106,9 +106,6 @@ body_linecount=1 message_linecount=9
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@test.ex
@@ -142,9 +139,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> userx@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to userx <userx@test.ex> transport=t1
index e7fe36f86cb27b12fc19d4294f907bc61c3ae6f1..1d4a61b5393d3ee2a357053733f88f5a6c656649 100644 (file)
@@ -14,7 +14,7 @@ t1 transport entered
 using the transport's hosts: 127.0.0.1 : 127.0.0.1 : 127.0.0.1 : 127.0.0.1
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no message retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmaX-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@myhost.test.ex)
 hosts_max_try limit reached with this host
@@ -28,7 +28,7 @@ temporary delivery error(s) override hosts_max_try (message older than host's re
 Clearing TFO as not first host for message
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no message retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmaX-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@myhost.test.ex)
 hosts_max_try limit reached with this host
@@ -42,7 +42,7 @@ temporary delivery error(s) override hosts_max_try (message older than host's re
 Clearing TFO as not first host for message
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no message retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmaX-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@myhost.test.ex)
 hosts_max_try limit reached with this host
@@ -56,7 +56,7 @@ temporary delivery error(s) override hosts_max_try (message older than host's re
 Clearing TFO as not first host for message
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no message retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmaX-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@myhost.test.ex)
 hosts_max_try limit reached with this host
@@ -119,7 +119,7 @@ t1 transport entered
 using the transport's hosts: 127.0.0.1 : 127.0.0.1 : 127.0.0.1 : 127.0.0.1
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no message retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmaZ-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@myhost.test.ex)
 hosts_max_try limit reached with this host
@@ -133,7 +133,7 @@ temporary delivery error(s) override hosts_max_try (message older than host's re
 Clearing TFO as not first host for message
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no message retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmaZ-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (userx@myhost.test.ex)
 hosts_max_try limit reached with this host
index f9bbb7dd0ae1bfd368e874f54397cc074bc2e342..d8ee0171aff33da2e3de21b35746f560427b51d6 100644 (file)
@@ -17,7 +17,7 @@ After routing:
   Failed addresses:
   Deferred addresses:
 checking retry status of 127.0.0.1
-no retry data available
+ no retry data available
 added retry item for R:x@y:<CALLER@myhost.test.ex>: errno=-44 more_errno=dd,A flags=0
 cmdlog: '220:EHLO:250:MAIL:250:RCPT:451:QUIT+:250'
 >>>>>>>>>>>>>>>> Exim pid=p1235 (transport) terminating with rc=0 >>>>>>>>>>>>>>>>
@@ -58,8 +58,8 @@ After routing:
   Failed addresses:
   Deferred addresses:
 checking retry status of 127.0.0.1
-no host retry record
-no message retry record
+ no host retry record
+ no message retry record
 added retry item for R:x@y:<CALLER@myhost.test.ex>: errno=dd more_errno=dd,A flags=1
 added retry item for R:x@y: errno=dd more_errno=dd,A flags=1
 cmdlog: '220:EHLO:250:MAIL:250:RCPT:250:DATA:354:.:250:QUIT+:250'
index 3786f716814883ad937a56dd5500ad95744b2fad..659aa892cac10d3407d8fbae210325e0002daf92 100644 (file)
@@ -85,8 +85,8 @@ send_to_server transport entered
 using the transport's hosts: 127.0.0.1
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no host retry record
-no message retry record
+ no host retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmbA-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (permreject@test.ex)
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_D ...
@@ -155,8 +155,8 @@ send_to_server transport entered
 using the transport's hosts: 127.0.0.1
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no host retry record
-no message retry record
+ no host retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmbB-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (permreject@test.ex)
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_D ...
index 21921848400c767a9d59e66f37250457821a1dfa..225347acc5dd5082ae6ff1fa79e20ebb854ae0a6 100644 (file)
@@ -53,9 +53,6 @@
 01:01:01 p1239  DSN: set orcpt:   flags: 0x0
 01:01:01 p1239  Delivery address list:
 01:01:01 p1239    dest@test.ex 
-01:01:01 p1239   EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
-01:01:01 p1239   returned from EXIM_DBOPEN: (nil)
-01:01:01 p1239   failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 01:01:01 p1239  no retry data available
 01:01:01 p1239  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 01:01:01 p1239  Considering: dest@test.ex
 01:01:01 p1241  DSN: set orcpt:   flags: 0x0
 01:01:01 p1241  Delivery address list:
 01:01:01 p1241    dest2@test.ex 
-01:01:01 p1241   EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
-01:01:01 p1241   returned from EXIM_DBOPEN: (nil)
-01:01:01 p1241   failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 01:01:01 p1241  no retry data available
 01:01:01 p1241  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 01:01:01 p1241  Considering: dest2@test.ex
index 3ba13b3b08c65836aef5ac6f8aebef98b488f3ef..ffaf71b8c3fe5c5e1ecd8513174f59a657bbba45 100644 (file)
@@ -232,8 +232,8 @@ send_to_server transport entered
 using the transport's hosts: 127.0.0.1
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no host retry record
-no message retry record
+ no host retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmbA-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (permreject@test.ex)
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_D ...
@@ -306,8 +306,8 @@ send_to_server transport entered
 using the transport's hosts: 127.0.0.1
 getting address for 127.0.0.1
 checking retry status of 127.0.0.1
-no host retry record
-no message retry record
+ no host retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmbB-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (dataloss@test.ex)
 Connecting to 127.0.0.1 [127.0.0.1]:PORT_D ...
index b7b55388c96f8533f5e6bba4628758d4131d6c1b..dee2ef5c7329f955fe4d10c4669a01288d1f4c31 100644 (file)
@@ -586,9 +586,6 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@myhost.test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@myhost.test.ex
@@ -633,9 +630,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> userx@myhost.test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to userx <userx@myhost.test.ex> transport=t1
index a4a46c552a59b78a5a92817ee2503772bfcd8274..93c24bf58f9e8ed79445c221f484f46d655fe21c 100644 (file)
@@ -808,9 +808,6 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   ph10@myhost.test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: ph10@myhost.test.ex
@@ -876,9 +873,6 @@ search_tidyup called
 close MYSQL connection: 127.0.0.1:PORT_N/test/root
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> ph10@myhost.test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to ph10 <ph10@myhost.test.ex> transport=t1
index 40fc08f8ad7296e7534af7e814a6db1a64ca2a14..7193592a98ab1c92cac9f3791230167c779c6b17 100644 (file)
@@ -727,9 +727,6 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   CALLER@myhost.test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: CALLER@myhost.test.ex
@@ -776,9 +773,6 @@ search_tidyup called
 close PGSQL connection: localhost:PORT_N/test/CALLER
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> CALLER@myhost.test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to CALLER <CALLER@myhost.test.ex> transport=t1
index f902651497f4d426d5cfb81abf61d5f9748722b2..31baec047edd314a9ad5c87c5435b7489a111c50 100644 (file)
@@ -17,8 +17,8 @@ smtp transport entered
 hostlist:
   '127.0.0.1' IP 127.0.0.1 port PORT_D
 checking retry status of 127.0.0.1
-no host retry record
-no message retry record
+ no host retry record
+ no message retry record
 127.0.0.1 [127.0.0.1]:1111 retry-status = usable
 delivering 10HmbP-000000005vi-0000 to 127.0.0.1 [127.0.0.1] (extchange@test.ex)
 Transport port=25 replaced by host-specific port=PORT_D
index bf1ed20dbfeadcc327280dd142f245a14f22fa75..fdeed81accefc30b2dbdc1bd7d3edd27a2134835 100644 (file)
@@ -76,9 +76,6 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@test.ex
@@ -113,9 +110,6 @@ r1 router generated TESTSUITE/test-mail
 routed by r1 router
   envelope to: userx@test.ex
   transport: <none>
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: TESTSUITE/test-mail
@@ -131,9 +125,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> TESTSUITE/test-mail <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to TESTSUITE/test-mail <TESTSUITE/test-mail> transport=t1
index 2e1c3b08dadb604adc5c17bd4b1a3e6c03aecde0..9f3d8c172bb524c474442942e02314a8518156a6 100644 (file)
@@ -72,9 +72,6 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   nofile@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: nofile@test.ex
@@ -108,9 +105,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> nofile@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to nofile <nofile@test.ex> transport=t1
@@ -262,9 +256,6 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@test.ex
@@ -298,9 +289,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> userx@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to userx <userx@test.ex> transport=t1
@@ -454,9 +442,6 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@test.ex
@@ -490,9 +475,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> userx@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to userx <userx@test.ex> transport=t1
@@ -550,26 +532,21 @@ Processing retry items
  Failed addresses:
  Deferred addresses:
   userx@test.ex
-   ╎EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDWR
-   ╎returned from EXIM_DBOPEN: 0xAAAAAAAA
-   ╎opened hints database TESTSUITE/spool/db/retry: flags=O_RDWR|O_CREAT
-   ╎userx@test.ex in "*"?
+   userx@test.ex in "*"?
+   ╎list element: *
+   ╎address match test: subject=userx@test.ex pattern=*
+   ╎test.ex in "*"?
    ╎ list element: *
-   ╎ address match test: subject=userx@test.ex pattern=*
-   ╎ test.ex in "*"?
-   ╎  list element: *
-   ╎  test.ex in "*"? yes (matched "*")
-   ╎ userx@test.ex in "*"? yes (matched "*")
-   ╎retry for T:userx@test.ex = * 0 0
-   ╎dbfn_read: key=T:userx@test.ex
-   ╎dbfn_read: null return
-   ╎failing_interval=ttt message_age=ttt
-   ╎Writing retry data for T:userx@test.ex
-   ╎  first failed=dddd last try=dddd next try=+86400 expired=0
-   ╎  errno=-22 more_errno=dd mailbox is full (MTA-imposed quota exceeded while writing to tmp/MAILDIR.myhost.test.ex)
-   ╎dbfn_write: key=T:userx@test.ex datalen nn
-  EXIM_DBCLOSE(0xAAAAAAAA)
-  closed hints database
+   ╎ test.ex in "*"? yes (matched "*")
+   ╎userx@test.ex in "*"? yes (matched "*")
+   retry for T:userx@test.ex = * 0 0
+   dbfn_read: key=T:userx@test.ex
+   dbfn_read: null return
+   failing_interval=ttt message_age=ttt
+   Writing retry data for T:userx@test.ex
+     first failed=dddd last try=dddd next try=+86400 expired=0
+     errno=-22 more_errno=dd mailbox is full (MTA-imposed quota exceeded while writing to tmp/MAILDIR.myhost.test.ex)
+   dbfn_write: key=T:userx@test.ex datalen nn
 end of retry processing
 delivery deferred: update_spool=1 header_rewritten=0
 Writing spool header file: TESTSUITE/spool//input//hdr.10HmaZ-000000005vi-0000
@@ -655,24 +632,19 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/retry: flags=O_RDONLY
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@test.ex
 unique = userx@test.ex
- checking router retry status
 dbfn_read: key=R:test.ex
 dbfn_read: null return
 dbfn_read: key=R:userx@test.ex
 dbfn_read: null return
 dbfn_read: key=R:userx@test.ex:<CALLER@test.ex>
 dbfn_read: null return
 no   domain  retry record
 no   address retry record
+checking router retry status
+ dbfn_read: key=R:test.ex
+ dbfn_read: null return
+ dbfn_read: key=R:userx@test.ex
+ dbfn_read: null return
+ dbfn_read: key=R:userx@test.ex:<CALLER@test.ex>
+ dbfn_read: null return
+ no   domain  retry record
+ no   address retry record
 userx@test.ex: queued for routing
- EXIM_DBCLOSE(0xAAAAAAAA)
- closed hints database
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 routing userx@test.ex
 --------> r1 router <--------
@@ -698,15 +670,10 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> userx@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: 0xAAAAAAAA
- opened hints database TESTSUITE/spool/db/retry: flags=O_RDONLY
- dbfn_read: key=T:userx@test.ex
- dbfn_read: size nnn return
+dbfn_read: key=T:userx@test.ex
+dbfn_read: size nnn return
 retry record exists: age=ttt (max 1w)
   time to retry = tttt expired = 0
- EXIM_DBCLOSE(0xAAAAAAAA)
- closed hints database
 search_tidyup called
 changed uid/gid: local delivery to userx <userx@test.ex> transport=t1
   uid=CALLER_UID gid=CALLER_GID pid=p1245
@@ -750,26 +717,21 @@ Processing retry items
  Failed addresses:
  Deferred addresses:
   userx@test.ex
-   ╎EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDWR
-   ╎returned from EXIM_DBOPEN: 0xAAAAAAAA
-   ╎opened hints database TESTSUITE/spool/db/retry: flags=O_RDWR|O_CREAT
-   ╎userx@test.ex in "*"?
+   userx@test.ex in "*"?
+   ╎list element: *
+   ╎address match test: subject=userx@test.ex pattern=*
+   ╎test.ex in "*"?
    ╎ list element: *
-   ╎ address match test: subject=userx@test.ex pattern=*
-   ╎ test.ex in "*"?
-   ╎  list element: *
-   ╎  test.ex in "*"? yes (matched "*")
-   ╎ userx@test.ex in "*"? yes (matched "*")
-   ╎retry for T:userx@test.ex = * 0 0
-   ╎dbfn_read: key=T:userx@test.ex
-   ╎dbfn_read: size nnn return
-   ╎failing_interval=ttt message_age=ttt
-   ╎Writing retry data for T:userx@test.ex
-   ╎  first failed=dddd last try=dddd next try=+86400 expired=0
-   ╎  errno=-22 more_errno=dd mailbox is full (MTA-imposed quota exceeded while writing to tmp/MAILDIR.myhost.test.ex)
-   ╎dbfn_write: key=T:userx@test.ex datalen nn
-  EXIM_DBCLOSE(0xAAAAAAAA)
-  closed hints database
+   ╎ test.ex in "*"? yes (matched "*")
+   ╎userx@test.ex in "*"? yes (matched "*")
+   retry for T:userx@test.ex = * 0 0
+   dbfn_read: key=T:userx@test.ex
+   dbfn_read: size nnn return
+   failing_interval=ttt message_age=ttt
+   Writing retry data for T:userx@test.ex
+     first failed=dddd last try=dddd next try=+86400 expired=0
+     errno=-22 more_errno=dd mailbox is full (MTA-imposed quota exceeded while writing to tmp/MAILDIR.myhost.test.ex)
+   dbfn_write: key=T:userx@test.ex datalen nn
 end of retry processing
 delivery deferred: update_spool=1 header_rewritten=0
 Writing spool header file: TESTSUITE/spool//input//hdr.10HmbA-000000005vi-0000
index f13b5b879e68ee5b5f2f21e2e4876875fb8aa3c3..d9e4556ef82df26534ca4b1f184d06ffac2bbeff 100644 (file)
@@ -72,9 +72,6 @@ body_linecount=1 message_linecount=8
 DSN: set orcpt:   flags: 0x0
 Delivery address list:
   userx@test.ex 
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 Considering: userx@test.ex
@@ -108,9 +105,6 @@ After routing:
 search_tidyup called
 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
 --------> userx@test.ex <--------
- EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
- returned from EXIM_DBOPEN: (nil)
- failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
 search_tidyup called
 changed uid/gid: local delivery to userx <userx@test.ex> transport=t1