X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/2a10b70b1cdbd55e9f2c26ed52dcff5255cd6e96..a9f0ad12d639cdb5186f0482d2856278b41671a2:/server/trackdb.c diff --git a/server/trackdb.c b/server/trackdb.c index 07fdd28..6a7759d 100644 --- a/server/trackdb.c +++ b/server/trackdb.c @@ -69,6 +69,7 @@ static int trackdb_get_global_tid(const char *name, static char **trackdb_new_tid(int *ntracksp, int maxtracks, DB_TXN *tid); +static int trackdb_expire_noticed_tid(time_t earliest, DB_TXN *tid); const struct cache_type cache_files_type = { 86400 }; unsigned long cache_files_hits, cache_files_misses; @@ -129,7 +130,7 @@ void trackdb_init(int recover) { |DB_CREATE |recover_type[recover], 0666))) - fatal(0, "trackdb_env->open: %s", db_strerror(err)); + fatal(0, "trackdb_env->open %s: %s", config->home, db_strerror(err)); trackdb_env->set_errpfx(trackdb_env, "DB"); trackdb_env->set_errfile(trackdb_env, stderr); trackdb_env->set_verbose(trackdb_env, DB_VERB_DEADLOCK, 1); @@ -1748,6 +1749,7 @@ static int reap_rescan(ev_source attribute((unused)) *ev, D(("disorderd-rescan terminate: %s", wstat(status))); /* Our cache of file lookups is out of date now */ cache_clean(&cache_files_type); + eventlog("rescanned", (char *)0); return 0; } @@ -1920,6 +1922,63 @@ static char **trackdb_new_tid(int *ntracksp, return tracks->vec; } +/** @brief Expire noticed.db + * @param earliest Earliest timestamp to keep + */ +void trackdb_expire_noticed(time_t earliest) { + DB_TXN *tid; + + for(;;) { + tid = trackdb_begin_transaction(); + if(!trackdb_expire_noticed_tid(earliest, tid)) + break; + trackdb_abort_transaction(tid); + } + trackdb_commit_transaction(tid); +} + +/** @brief Expire noticed.db + * @param earliest Earliest timestamp to keep + * @param tid Transaction ID + * @return 0 or DB_LOCK_DEADLOCK + */ +static int trackdb_expire_noticed_tid(time_t earliest, DB_TXN *tid) { + DBC *c; + DBT k, d; + int err = 0, ret; + time_t when; + uint32_t *kk; + int count = 0; + + c = trackdb_opencursor(trackdb_noticeddb, tid); + while(!(err = c->c_get(c, prepare_data(&k), prepare_data(&d), DB_NEXT))) { + kk = k.data; + when = (time_t)(((uint64_t)ntohl(kk[0]) << 32) + ntohl(kk[1])); + if(when >= earliest) + break; + if((err = c->c_del(c, 0))) { + if(err != DB_LOCK_DEADLOCK) + fatal(0, "error deleting expired noticed.db entry: %s", + db_strerror(err)); + break; + } + ++count; + } + if(err == DB_NOTFOUND) + err = 0; + if(err && err != DB_LOCK_DEADLOCK) + fatal(0, "error expiring noticed.db: %s", db_strerror(err)); + ret = err; + if((err = trackdb_closecursor(c))) { + if(err != DB_LOCK_DEADLOCK) + fatal(0, "error closing cursor: %s", db_strerror(err)); + ret = err; + } + if(!ret && count) + info("expired %d tracks from noticed.db", count); + return ret; +} + /* tidying up ****************************************************************/ void trackdb_gc(void) {