mail-transaction-log.c revision 8dfabfbc7715df1c9e2016f6a3f2db575265524b
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2003-2016 Dovecot authors, see the included COPYING file */
401b0787fff2dc986a5321ddb32acb1947ff66b0Timo Sirainenmail_transaction_log_set_head(struct mail_transaction_log *log,
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen i_assert(log->files->next != NULL || log->files == file);
615c4aba4cc0b17eefba3263b85972adaba04586Timo Sirainenmail_transaction_log_alloc(struct mail_index *index)
06e56a69f41fa7efd131179f2abfeabe825ac25fTimo Sirainenstatic void mail_transaction_log_2_unlink_old(struct mail_transaction_log *log)
9f82881b46c5b00889dabe945872556660b5d45cTimo Sirainen if (st.st_mtime + MAIL_TRANSACTION_LOG2_STALE_SECS <= ioloop_time &&
7d102c66eb1755e1894cf56e3594cd744e855238Timo Sirainenint mail_transaction_log_open(struct mail_transaction_log *log)
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen log->filepath = i_strconcat(log->index->filepath,
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen log->filepath2 = i_strconcat(log->filepath, ".2", NULL);
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen /* these settings aren't available at alloc() time, so we need to
50782de8a9d5ebe11ee61496b4e695a1d3875230Timo Sirainen set them here: */
657afb33796f8216c568ad813627da89970760beTimo Sirainen (log->index->flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0;
ab90f702ceedb7ba445a9a592be0b213b27cbafaStephan Bosch mail_transaction_log_file_free(&log->open_file);
657afb33796f8216c568ad813627da89970760beTimo Sirainen file = mail_transaction_log_file_alloc(log, log->filepath);
48ac75465ae154b1d705f18de6d95045ab714b65Timo Sirainen if ((ret = mail_transaction_log_file_open(file)) <= 0) {
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen /* leave the file for _create() */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainenint mail_transaction_log_create(struct mail_transaction_log *log, bool reset)
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen file = mail_transaction_log_file_alloc_in_memory(log);
15e1aa97d4b3d74f58e291e2edaadc2fa1564c43Timo Sirainen file = mail_transaction_log_file_alloc(log, log->filepath);
657afb33796f8216c568ad813627da89970760beTimo Sirainen /* remember what file we tried to open. if someone else created
e31bf6003e580bcb28af333119da9dd1e16fc811Timo Sirainen a new file, use it instead of recreating it */
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen file->last_mtime = log->open_file->last_mtime;
ce89e2964b6bc4925d2dd690417200a110d041c5Timo Sirainen mail_transaction_log_file_free(&log->open_file);
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen if (mail_transaction_log_file_create(file, reset) < 0) {
20230315dc9cd159c41ba76d24557807b6ad5a61Timo Sirainenvoid mail_transaction_log_close(struct mail_transaction_log *log)
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen mail_transaction_log_file_free(&log->open_file);
39dcbe101c4538ee25d8b196eab30e5f0faa22eeTimo Sirainenvoid mail_transaction_log_free(struct mail_transaction_log **_log)
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainenvoid mail_transaction_log_move_to_memory(struct mail_transaction_log *log)
657afb33796f8216c568ad813627da89970760beTimo Sirainen if (!log->index->initial_mapped && log->files != NULL &&
657afb33796f8216c568ad813627da89970760beTimo Sirainen /* we couldn't read dovecot.index and we don't have the first
657afb33796f8216c568ad813627da89970760beTimo Sirainen .log file, so just start from scratch */
ab122a3bbae3b5fd2aad66e2f2840149d98cee52Timo Sirainen log->filepath = i_strconcat(log->index->filepath,
ab122a3bbae3b5fd2aad66e2f2840149d98cee52Timo Sirainen log->filepath2 = i_strconcat(log->filepath, ".2", NULL);
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen mail_transaction_log_file_move_to_memory(log->head);
1e21e6be70994b1aa9e52ca0e2f51afefca6d0dfTimo Sirainen file = mail_transaction_log_file_alloc_in_memory(log);
1e21e6be70994b1aa9e52ca0e2f51afefca6d0dfTimo Sirainenvoid mail_transaction_log_indexid_changed(struct mail_transaction_log *log)
1e21e6be70994b1aa9e52ca0e2f51afefca6d0dfTimo Sirainen for (file = log->files; file != NULL; file = file->next) {
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen if (file->hdr.indexid != log->index->indexid) {
8eb94c5190ba09bb6f6f068eec7bf96750f08d1dTimo Sirainen "indexid changed: %u -> %u",
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen log->head->hdr.indexid != log->index->indexid) {
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen (void)mail_transaction_log_create(log, FALSE);
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainenvoid mail_transaction_logs_clean(struct mail_transaction_log *log)
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen struct mail_transaction_log_file *file, *next;
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen /* remove only files from the beginning. this way if a view has
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen referenced an old file, it can still find the new files even if
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen there aren't any references to it currently. */
8be0af2dd41283fdd250b9a0d8fad28bfe80ca85Timo Sirainen for (file = log->files; file != NULL; file = next) {
6420154390295de70cfd90be8766f2b10f07c1a8Timo Sirainen /* sanity check: we shouldn't have locked refcount=0 files */
6420154390295de70cfd90be8766f2b10f07c1a8Timo Sirainen i_assert(!file->locked || file->refcount > 0);
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen i_assert(log->head == NULL || log->files != NULL);
4bbc8a478be20d0be16e92179fc32327004ebf86Timo Sirainen (((file)->sync_offset > MAIL_TRANSACTION_LOG_ROTATE_MIN_SIZE && \
fca7aa88ab19375aba5a8fd9d4100ea885dccb68Timo Sirainen ioloop_time - MAIL_TRANSACTION_LOG_ROTATE_TIME) || \
3c9783956dea385b322cd7fa6bf8c98c17a907a0Timo Sirainen ((file)->sync_offset > MAIL_TRANSACTION_LOG_ROTATE_MAX_SIZE))
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainenbool mail_transaction_log_want_rotate(struct mail_transaction_log *log)
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainenint mail_transaction_log_rotate(struct mail_transaction_log *log, bool reset)
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen file = mail_transaction_log_file_alloc_in_memory(log);
a8e132559a7ebe54c8269d79ce29fa3338c76199Timo Sirainen /* we're locked, we shouldn't need to worry about ESTALE
35136dd2baf8dc30e4e754294ed81ff48e8c1e64Timo Sirainen problems in here. */
if (ret == 0) {
int ret;
return ret;
const char *lock_reason)
int ret = 0;
if (ret < 0)
return ret;
const char *lock_reason,
const char *lock_reason)
*mtime_r = 0;