return FALSE;
return seq_range_exists(&mailbox->uids, uid);
}
-void fts_expunge_log_append_remove(struct fts_expunge_log_append_ctx *from,
+int fts_expunge_log_append_remove(struct fts_expunge_log_append_ctx *from,
const struct fts_expunge_log_read_record *record)
{
const uint8_t *guid_p = record->mailbox_guid;
struct fts_expunge_log_mailbox *mailbox = hash_table_lookup(from->mailboxes, guid_p);
- i_assert(mailbox != NULL); /* may only remove things that exist */
+ if (mailbox == NULL)
+ return 0; /* may only remove things that exist */
+
mailbox->uids_count -= seq_range_array_remove_seq_range(&mailbox->uids, &record->uids);
+ return 1;
}
int fts_expunge_log_subtract(struct fts_expunge_log_append_ctx *from,
struct fts_expunge_log *subtract)
{
+ unsigned int failures = 0;
struct fts_expunge_log_read_ctx *read_ctx = fts_expunge_log_read_begin(subtract);
read_ctx->unlink = FALSE;
const struct fts_expunge_log_read_record *record;
- while ((record = fts_expunge_log_read_next(read_ctx)) != NULL)
- fts_expunge_log_append_remove(from, record);
-
+ while ((record = fts_expunge_log_read_next(read_ctx)) != NULL) {
+ if (fts_expunge_log_append_remove(from, record) <= 0)
+ failures++;
+ }
+ if (failures > 0)
+ i_warning("fts: Expunge log subtract ignored %u nonexistent mailbox GUIDs",
+ failures);
return fts_expunge_log_read_end(&read_ctx);
}
/* It could be argued that somehow adding a log (file) to the append context
const struct seq_range *uids);
void fts_expunge_log_append_record(struct fts_expunge_log_append_ctx *ctx,
const struct fts_expunge_log_read_record *record);
-/* in-memory flattened structures may have records removed from them, file-backed ones may not */
-void fts_expunge_log_append_remove(struct fts_expunge_log_append_ctx *ctx,
- const struct fts_expunge_log_read_record *record);
+/* In-memory flattened structures may have records removed from them,
+ file-backed ones may not. Non-existence of UIDs is not an error,
+ non-existence of mailbox GUID causes an error return of 0. */
+int fts_expunge_log_append_remove(struct fts_expunge_log_append_ctx *ctx,
+ const struct fts_expunge_log_read_record *record);
int fts_expunge_log_append_commit(struct fts_expunge_log_append_ctx **ctx);
/* Do not commit non-backed structures, abort them after use. */
int fts_expunge_log_append_abort(struct fts_expunge_log_append_ctx **ctx);
struct fts_expunge_log_append_ctx **flattened_r);
bool fts_expunge_log_contains(const struct fts_expunge_log_append_ctx *ctx,
const guid_128_t mailbox_guid, uint32_t uid);
-/* Modify in-place a flattened log. */
+/* Modify in-place a flattened log. If non-existent mailbox GUIDs are
+ encountered, a warning will be logged. */
int fts_expunge_log_subtract(struct fts_expunge_log_append_ctx *from,
struct fts_expunge_log *subtract);
/* Write a modified flattened log as a new file. */