uint32_t last_read_log_file_seq;
uint32_t last_read_log_file_tail_offset;
+ /* log file which last updated index_deleted */
+ uint32_t index_delete_changed_file_seq;
+
/* transaction log head seq/offset when we last fscked */
uint32_t fsck_log_head_file_seq;
uoff_t fsck_log_head_file_offset;
return ret < 0 ? -1 : 1;
break;
case MAIL_TRANSACTION_INDEX_DELETED:
- if (file->sync_offset < file->index_undeleted_offset)
+ if (file->sync_offset < file->index_undeleted_offset ||
+ file->hdr.file_seq < file->log->index->index_delete_changed_file_seq)
break;
file->log->index->index_deleted = TRUE;
file->log->index->index_delete_requested = FALSE;
+ file->log->index->index_delete_changed_file_seq = file->hdr.file_seq;
file->index_deleted_offset = file->sync_offset + trans_size;
break;
case MAIL_TRANSACTION_INDEX_UNDELETED:
- if (file->sync_offset < file->index_deleted_offset)
+ if (file->sync_offset < file->index_deleted_offset ||
+ file->hdr.file_seq < file->log->index->index_delete_changed_file_seq)
break;
file->log->index->index_deleted = FALSE;
file->log->index->index_delete_requested = FALSE;
+ file->log->index->index_delete_changed_file_seq = file->hdr.file_seq;
file->index_undeleted_offset = file->sync_offset + trans_size;
break;
case MAIL_TRANSACTION_BOUNDARY: {