]> code.citadel.org Git - citadel.git/blobdiff - citadel/database.c
* when db->truncate() fails with ENOMEM, refer the user to http://www.citadel.org...
[citadel.git] / citadel / database.c
index 891e31fb54eb294e9cbcff9f1db97f1940937512..2101e4899900d5c68134ad4e9f44a7584cc9f963 100644 (file)
@@ -69,14 +69,16 @@ static DB_ENV *dbenv;               /* The DB environment (global) */
 /* Verbose logging callback */
 void cdb_verbose_log(const DB_ENV *dbenv, const char *msg)
 {
-       CtdlLogPrintf(CTDL_DEBUG, "BDB: %s\n", msg);
+       if (!IsEmptyStr(msg)) {
+               CtdlLogPrintf(CTDL_DEBUG, "DB: %s\n", msg);
+       }
 }
 
 
 /* Verbose logging callback */
 void cdb_verbose_err(const DB_ENV *dbenv, const char *errpfx, const char *msg)
 {
-       CtdlLogPrintf(CTDL_ALERT, "BDB: %s\n", msg);
+       CtdlLogPrintf(CTDL_ALERT, "DB: %s\n", msg);
 }
 
 
@@ -222,22 +224,11 @@ void cmd_cull(char *argbuf) {
 
 
 /*
- * Request a checkpoint of the database.
+ * Request a checkpoint of the database.  Called once per minute by the thread manager.
  */
 void cdb_checkpoint(void)
 {
        int ret;
-//     static time_t last_run = 0L;
-
-       /* Only do a checkpoint once per minute. */
-/*
- * Don't need this any more, since the thread that calls us sleeps for 60 seconds between calls
-       if ((time(NULL) - last_run) < 60L) {
-               return;
-       }
-       last_run = time(NULL);
-*/
 
        CtdlLogPrintf(CTDL_DEBUG, "-- db checkpoint --\n");
        ret = dbenv->txn_checkpoint(dbenv,
@@ -268,7 +259,7 @@ void open_databases(void)
 {
        int ret;
        int i;
-       char dbfilename[SIZ];
+       char dbfilename[32];
        u_int32_t flags = 0;
        int dbversion_major, dbversion_minor, dbversion_patch;
        int current_dbversion = 0;
@@ -311,8 +302,8 @@ void open_databases(void)
        db_env_set_func_yield(sched_yield);
        ret = db_env_create(&dbenv, 0);
        if (ret) {
-               CtdlLogPrintf(CTDL_EMERG, "cdb_*: db_env_create: %s\n",
-                       db_strerror(ret));
+               CtdlLogPrintf(CTDL_EMERG, "cdb_*: db_env_create: %s\n", db_strerror(ret));
+               CtdlLogPrintf(CTDL_EMERG, "exit code %d\n", ret);
                exit(CTDLEXIT_DB);
        }
        dbenv->set_errpfx(dbenv, "citserver");
@@ -331,16 +322,16 @@ void open_databases(void)
         */
        ret = dbenv->set_cachesize(dbenv, 0, 64 * 1024, 0);
        if (ret) {
-               CtdlLogPrintf(CTDL_EMERG, "cdb_*: set_cachesize: %s\n",
-                       db_strerror(ret));
+               CtdlLogPrintf(CTDL_EMERG, "cdb_*: set_cachesize: %s\n", db_strerror(ret));
                dbenv->close(dbenv, 0);
+               CtdlLogPrintf(CTDL_EMERG, "exit code %d\n", ret);
                exit(CTDLEXIT_DB);
        }
 
        if ((ret = dbenv->set_lk_detect(dbenv, DB_LOCK_DEFAULT))) {
-               CtdlLogPrintf(CTDL_EMERG, "cdb_*: set_lk_detect: %s\n",
-                       db_strerror(ret));
+               CtdlLogPrintf(CTDL_EMERG, "cdb_*: set_lk_detect: %s\n", db_strerror(ret));
                dbenv->close(dbenv, 0);
+               CtdlLogPrintf(CTDL_EMERG, "exit code %d\n", ret);
                exit(CTDLEXIT_DB);
        }
 
@@ -361,8 +352,9 @@ void open_databases(void)
                ret = dbenv->open(dbenv, ctdl_data_dir, flags, 0);
        }
        if (ret) {
-               CtdlLogPrintf(CTDL_DEBUG, "dbenv->open: %s\n", db_strerror(ret));
+               CtdlLogPrintf(CTDL_EMERG, "dbenv->open: %s\n", db_strerror(ret));
                dbenv->close(dbenv, 0);
+               CtdlLogPrintf(CTDL_EMERG, "exit code %d\n", ret);
                exit(CTDLEXIT_DB);
        }
 
@@ -373,8 +365,8 @@ void open_databases(void)
                /* Create a database handle */
                ret = db_create(&dbp[i], dbenv, 0);
                if (ret) {
-                       CtdlLogPrintf(CTDL_DEBUG, "db_create: %s\n",
-                               db_strerror(ret));
+                       CtdlLogPrintf(CTDL_EMERG, "db_create: %s\n", db_strerror(ret));
+                       CtdlLogPrintf(CTDL_EMERG, "exit code %d\n", ret);
                        exit(CTDLEXIT_DB);
                }
 
@@ -392,8 +384,11 @@ void open_databases(void)
                                   DB_CREATE | DB_AUTO_COMMIT | DB_THREAD,
                                   0600);
                if (ret) {
-                       CtdlLogPrintf(CTDL_EMERG, "db_open[%02x]: %s\n", i,
-                               db_strerror(ret));
+                       CtdlLogPrintf(CTDL_EMERG, "db_open[%02x]: %s\n", i, db_strerror(ret));
+                       if (ret == ENOMEM) {
+                               CtdlLogPrintf(CTDL_EMERG, "You may need to tune your database; please read http://www.citadel.org/doku.php/faq:troubleshooting:out_of_lock_entries for more information.\n");
+                       }
+                       CtdlLogPrintf(CTDL_EMERG, "exit code %d\n", ret);
                        exit(CTDLEXIT_DB);
                }
        }
@@ -476,15 +471,9 @@ void close_databases(void)
 /*
  * Compression functions only used if we have zlib
  */
-#ifdef HAVE_ZLIB
-
 void cdb_decompress_if_necessary(struct cdbdata *cdb)
 {
        static int magic = COMPRESS_MAGIC;
-       struct CtdlCompressHeader zheader;
-       char *uncompressed_data;
-       char *compressed_data;
-       uLongf destLen, sourceLen;
 
        if (cdb == NULL)
                return;
@@ -493,7 +482,14 @@ void cdb_decompress_if_necessary(struct cdbdata *cdb)
        if (memcmp(cdb->ptr, &magic, sizeof(magic)))
                return;
 
+#ifdef HAVE_ZLIB
        /* At this point we know we're looking at a compressed item. */
+
+       struct CtdlCompressHeader zheader;
+       char *uncompressed_data;
+       char *compressed_data;
+       uLongf destLen, sourceLen;
+
        memcpy(&zheader, cdb->ptr, sizeof(struct CtdlCompressHeader));
 
        compressed_data = cdb->ptr;
@@ -514,9 +510,12 @@ void cdb_decompress_if_necessary(struct cdbdata *cdb)
        free(cdb->ptr);
        cdb->len = (size_t) destLen;
        cdb->ptr = uncompressed_data;
+#else                          /* HAVE_ZLIB */
+       CtdlLogPrintf(CTDL_EMERG, "Database contains compressed data, but this citserver was built without compression support.\n");
+       abort();
+#endif                         /* HAVE_ZLIB */
 }
 
-#endif                         /* HAVE_ZLIB */
 
 
 /*
@@ -742,9 +741,7 @@ struct cdbdata *cdb_fetch(int cdb, void *key, int keylen)
 
        tempcdb->len = dret.size;
        tempcdb->ptr = dret.data;
-#ifdef HAVE_ZLIB
        cdb_decompress_if_necessary(tempcdb);
-#endif
        return (tempcdb);
 }
 
@@ -833,9 +830,7 @@ struct cdbdata *cdb_next_item(int cdb)
        cdbret = (struct cdbdata *) malloc(sizeof(struct cdbdata));
        cdbret->len = data.size;
        cdbret->ptr = data.data;
-#ifdef HAVE_ZLIB
        cdb_decompress_if_necessary(cdbret);
-#endif
 
        return (cdbret);
 }
@@ -912,9 +907,10 @@ void cdb_trunc(int cdb)
                                /* txabort(tid); */
                                goto retry;
                        } else {
-                               CtdlLogPrintf(CTDL_EMERG,
-                                       "cdb_truncate(%d): %s\n", cdb,
-                                       db_strerror(ret));
+                               CtdlLogPrintf(CTDL_EMERG, "cdb_truncate(%d): %s\n", cdb, db_strerror(ret));
+                               if (ret == ENOMEM) {
+                                       CtdlLogPrintf(CTDL_EMERG, "You may need to tune your database; please read http://www.citadel.org/doku.php/faq:troubleshooting:out_of_lock_entries for more information.\n");
+                               }
                                abort();
                        }
                } else {