gid_t gid;
char *gid_origin;
+ uoff_t log_rotate_min_size, log_rotate_max_size;
+ unsigned int log_rotate_min_created_ago_secs;
+ unsigned int log_rotate_log2_stale_secs;
+
pool_t extension_pool;
ARRAY(struct mail_index_registered_ext) extensions;
#include "mail-index-view-private.h"
#include "mail-index-sync-private.h"
#include "mail-index-modseq.h"
-#include "mail-transaction-log.h"
+#include "mail-transaction-log-private.h"
#include "mail-transaction-log-view-private.h"
#include "mail-cache.h"
index->lock_method = FILE_LOCK_METHOD_FCNTL;
index->max_lock_timeout_secs = UINT_MAX;
+ index->log_rotate_min_size =
+ MAIL_TRANSACTION_LOG_ROTATE_DEFAULT_MIN_SIZE;
+ index->log_rotate_max_size =
+ MAIL_TRANSACTION_LOG_ROTATE_DEFAULT_MAX_SIZE;
+ index->log_rotate_min_created_ago_secs =
+ MAIL_TRANSACTION_LOG_ROTATE_DEFAULT_TIME;
+ index->log_rotate_log2_stale_secs =
+ MAIL_TRANSACTION_LOG2_DEFAULT_STALE_SECS;
+
index->keywords_ext_id =
mail_index_ext_register(index, MAIL_INDEX_EXT_KEYWORDS,
128, 2, 1);
index->max_lock_timeout_secs = max_timeout_secs;
}
+void mail_index_set_log_rotation(struct mail_index *index,
+ uoff_t min_size, uoff_t max_size,
+ unsigned int min_created_ago_secs,
+ unsigned int log2_stale_secs)
+{
+ index->log_rotate_min_size = min_size;
+ index->log_rotate_max_size = max_size;
+ index->log_rotate_min_created_ago_secs = min_created_ago_secs;
+ index->log_rotate_log2_stale_secs = log2_stale_secs;
+}
+
void mail_index_set_ext_init_data(struct mail_index *index, uint32_t ext_id,
const void *data, size_t size)
{
void mail_index_set_lock_method(struct mail_index *index,
enum file_lock_method lock_method,
unsigned int max_timeout_secs);
+/* Rotate transaction log after it's a) min_size or larger and it was created
+ at least min_created_ago_secs or b) larger than max_size. Delete .log.2 when
+ it's older than log2_stale_secs. The defaults are min_size=32kB, max_size=1M,
+ min_created_ago_secs=5min, log2_stale_secs=2d. */
+void mail_index_set_log_rotation(struct mail_index *index,
+ uoff_t min_size, uoff_t max_size,
+ unsigned int min_created_ago_secs,
+ unsigned int log2_stale_secs);
/* When creating a new index file or reseting an existing one, add the given
extension header data immediately to it. */
void mail_index_set_ext_init_data(struct mail_index *index, uint32_t ext_id,
#define MAIL_TRANSACTION_LOG_LOCK_CHANGE_TIMEOUT (3*60)
/* Rotate when log is older than ROTATE_TIME and larger than MIN_SIZE */
-#define MAIL_TRANSACTION_LOG_ROTATE_MIN_SIZE (1024*32)
+#define MAIL_TRANSACTION_LOG_ROTATE_DEFAULT_MIN_SIZE (1024*32)
/* If log is larger than MAX_SIZE, rotate regardless of the time */
-#define MAIL_TRANSACTION_LOG_ROTATE_MAX_SIZE (1024*1024)
-#define MAIL_TRANSACTION_LOG_ROTATE_TIME (60*5)
+#define MAIL_TRANSACTION_LOG_ROTATE_DEFAULT_MAX_SIZE (1024*1024)
+#define MAIL_TRANSACTION_LOG_ROTATE_DEFAULT_TIME (60*5)
/* Delete .log.2 files older than this many seconds. Don't be too eager,
older files are useful for QRESYNC and dsync. */
-#define MAIL_TRANSACTION_LOG2_STALE_SECS (60*60*24*2)
+#define MAIL_TRANSACTION_LOG2_DEFAULT_STALE_SECS (60*60*24*2)
#define MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file) ((file)->fd == -1)
return;
}
- if (st.st_mtime + MAIL_TRANSACTION_LOG2_STALE_SECS <= ioloop_time &&
+ if (st.st_mtime + log->index->log_rotate_log2_stale_secs <= ioloop_time &&
!log->index->readonly)
i_unlink_if_exists(log->filepath2);
}
}
#define LOG_WANT_ROTATE(file) \
- (((file)->sync_offset > MAIL_TRANSACTION_LOG_ROTATE_MIN_SIZE && \
+ (((file)->sync_offset > (file)->log->index->log_rotate_min_size && \
(time_t)(file)->hdr.create_stamp < \
- ioloop_time - MAIL_TRANSACTION_LOG_ROTATE_TIME) || \
- ((file)->sync_offset > MAIL_TRANSACTION_LOG_ROTATE_MAX_SIZE))
+ ioloop_time - (file)->log->index->log_rotate_min_created_ago_secs) || \
+ ((file)->sync_offset > (file)->log->index->log_rotate_max_size))
bool mail_transaction_log_want_rotate(struct mail_transaction_log *log)
{