Spam filter performance and accuracy improvements (part 3)

This commit is contained in:
mdecimus
2025-12-02 18:11:01 +01:00
parent 72a175a434
commit e127ac0067
26 changed files with 1137 additions and 1395 deletions

View File

@@ -27,7 +27,7 @@ use imap_proto::{
use std::{sync::Arc, time::Instant};
use store::{
roaring::RoaringBitmap,
write::{AlignedBytes, Archive, BatchBuilder, TaskEpoch, TaskQueueClass, ValueClass},
write::{AlignedBytes, Archive, BatchBuilder},
};
use trc::AddContext;
use types::{
@@ -204,7 +204,6 @@ impl<T: SessionStream> SessionData<T> {
// Mailboxes are in the same account
let account_id = src_mailbox.id.account_id;
let dest_mailbox_id = UidMailbox::new_unassigned(dest_mailbox_id);
let mut has_spam_train_tasks = false;
let mut batch = BatchBuilder::new();
for (id, imap_id) in ids {
@@ -319,30 +318,23 @@ impl<T: SessionStream> SessionData<T> {
);
}
// Add bayes train task
if dest_mailbox_id.mailbox_id == JUNK_ID {
batch.set(
ValueClass::TaskQueue(TaskQueueClass::SpamTrain {
due: TaskEpoch::now(),
blob_hash: Default::default(),
learn_spam: true,
}),
vec![],
);
has_spam_train_tasks = true;
// Add message to training queue
let learn_spam = if dest_mailbox_id.mailbox_id == JUNK_ID {
Some(true)
} else if src_mailbox.id.mailbox_id == JUNK_ID
&& dest_mailbox_id.mailbox_id != TRASH_ID
{
batch.set(
ValueClass::TaskQueue(TaskQueueClass::SpamTrain {
due: TaskEpoch::now(),
blob_hash: Default::default(),
learn_spam: false,
}),
vec![],
);
has_spam_train_tasks = true;
Some(false)
} else {
None
};
if let Some(learn_spam) = learn_spam {
self.server
.add_account_spam_sample(&mut batch, account_id, id, learn_spam)
.await
.imap_ctx(&arguments.tag, trc::location!())?;
}
batch.commit_point();
// Update changelog
@@ -356,11 +348,6 @@ impl<T: SessionStream> SessionData<T> {
.commit_batch(batch)
.await
.imap_ctx(&arguments.tag, trc::location!())?;
// Trigger Bayes training
if has_spam_train_tasks {
self.server.notify_task_queue();
}
} else {
// Obtain quota for target account
let src_account_id = src_mailbox.id.account_id;