unsigned int mapping:1;
unsigned int syncing:1;
unsigned int need_recreate:1;
+ unsigned int initial_create:1;
};
extern struct mail_index_module_register mail_index_module_register;
/* Create a new indexid for us. If we're opening index
into memory, index->map doesn't exist yet. */
index->indexid = ioloop_time;
+ index->initial_create = TRUE;
if (index->map != NULL)
index->map->hdr.indexid = index->indexid;
}
- ret = mail_transaction_log_create(index->log);
+ ret = mail_transaction_log_create(index->log, FALSE);
+ index->initial_create = FALSE;
created = TRUE;
}
if (ret >= 0) {
- ret = index->map != NULL ? 0 : mail_index_try_open(index);
+ ret = index->map != NULL ? 1 : mail_index_try_open(index);
if (ret == 0) {
- /* doesn't exist / corrupted */
+ /* corrupted */
mail_transaction_log_close(index->log);
- ret = mail_transaction_log_create(index->log);
+ ret = mail_transaction_log_create(index->log, TRUE);
if (ret == 0) {
if (index->map != NULL)
mail_index_unmap(&index->map);
return 0;
}
if (file->hdr.indexid != file->log->index->indexid) {
- if (file->log->index->indexid != 0) {
+ if (file->log->index->indexid != 0 &&
+ !file->log->index->initial_create) {
/* index file was probably just rebuilt and we don't
know about it yet */
mail_transaction_log_file_set_corrupted(file,
file->fd = fd;
if (mail_transaction_log_file_read_hdr(file,
FALSE) > 0 &&
- file->hdr.file_seq == 1 &&
- file->hdr.prev_file_seq == 0 &&
mail_transaction_log_file_stat(file, FALSE) == 0) {
/* yes, it was ok */
(void)file_dotlock_delete(dotlock);
return 1;
}
-int mail_transaction_log_create(struct mail_transaction_log *log)
+int mail_transaction_log_create(struct mail_transaction_log *log, bool reset)
{
struct mail_transaction_log_file *file;
const char *path;
mail_transaction_log_file_free(&log->open_file);
}
- if (mail_transaction_log_file_create(file, FALSE) < 0) {
+ if (mail_transaction_log_file_create(file, reset) < 0) {
mail_transaction_log_file_free(&file);
return -1;
}
log->head->hdr.indexid != log->index->indexid) {
if (--log->head->refcount == 0)
mail_transaction_log_file_free(&log->head);
- (void)mail_transaction_log_create(log);
+ (void)mail_transaction_log_create(log, FALSE);
}
}
someone deleted it manually while the index was open. try to
handle this nicely by creating a new log file. */
file = log->head;
- if (mail_transaction_log_create(log) < 0)
+ if (mail_transaction_log_create(log, FALSE) < 0)
return -1;
i_assert(file->refcount > 0);
file->refcount--;
is corrupted, -1 if there was some I/O error. */
int mail_transaction_log_open(struct mail_transaction_log *log);
/* Create, or recreate, the transaction log. Returns 0 if ok, -1 if error. */
-int mail_transaction_log_create(struct mail_transaction_log *log);
+int mail_transaction_log_create(struct mail_transaction_log *log, bool reset);
/* Close all the open transactions log files. */
void mail_transaction_log_close(struct mail_transaction_log *log);