/* 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);
}
/*
- * 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,
{
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;
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");
*/
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);
}
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);
}
/* 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);
}
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);
}
}
/*
* 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;
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;
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 */
/*
tempcdb->len = dret.size;
tempcdb->ptr = dret.data;
-#ifdef HAVE_ZLIB
cdb_decompress_if_necessary(tempcdb);
-#endif
return (tempcdb);
}
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);
}
/* 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 {