Migration implementation (part 1)

This commit is contained in:
mdecimus
2025-12-10 19:13:04 +01:00
parent efd1d86ff3
commit f1fe0345ef
86 changed files with 2553 additions and 356 deletions

View File

@@ -7,7 +7,7 @@ homepage = "https://stalw.art/smtp"
keywords = ["smtp", "email", "mail", "server"]
categories = ["email"]
license = "AGPL-3.0-only OR LicenseRef-SEL"
version = "0.14.1"
version = "0.15.0"
edition = "2024"
[dependencies]

View File

@@ -742,7 +742,7 @@ impl<T: SessionStream> Session<T> {
size: 0,
env_id: mail_from.dsn_info.map(|i| i.into_boxed_str()),
blob_hash: Default::default(),
quota_keys: Vec::new(),
quota_keys: Default::default(),
received_from_ip: self.data.remote_ip,
received_via_port: self.data.local_port,
};

View File

@@ -68,7 +68,7 @@ pub struct Message {
pub priority: i16,
pub size: u64,
pub quota_keys: Vec<QuotaKey>,
pub quota_keys: Box<[QuotaKey]>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -91,8 +91,8 @@ pub struct MessageWrapper {
serde::Deserialize,
)]
pub enum QuotaKey {
Size { key: Vec<u8>, id: u64 },
Count { key: Vec<u8>, id: u64 },
Size { key: Box<[u8]>, id: u64 },
Count { key: Box<[u8]>, id: u64 },
}
#[derive(

View File

@@ -112,7 +112,7 @@ impl HasQueueQuota for Server {
}
}
message.message.quota_keys = quota_keys;
message.message.quota_keys = quota_keys.into_boxed_slice();
true
}
@@ -147,7 +147,7 @@ impl HasQueueQuota for Server {
return false;
} else {
refs.push(QuotaKey::Size {
key: key.as_ref().to_vec(),
key: key.as_ref().into(),
id,
});
}
@@ -167,7 +167,7 @@ impl HasQueueQuota for Server {
return false;
} else {
refs.push(QuotaKey::Count {
key: key.as_ref().to_vec(),
key: key.as_ref().into(),
id,
});
}
@@ -202,11 +202,14 @@ impl MessageWrapper {
for quota_key in std::mem::take(&mut self.message.quota_keys) {
match quota_key {
QuotaKey::Count { id, key } if quota_ids.contains(&id) => {
batch.add(ValueClass::Queue(QueueClass::QuotaCount(key)), -1);
batch.add(
ValueClass::Queue(QueueClass::QuotaCount(key.into_vec())),
-1,
);
}
QuotaKey::Size { id, key } if quota_ids.contains(&id) => {
batch.add(
ValueClass::Queue(QueueClass::QuotaSize(key)),
ValueClass::Queue(QueueClass::QuotaSize(key.into_vec())),
-(self.message.size as i64),
);
}
@@ -215,7 +218,7 @@ impl MessageWrapper {
}
}
}
self.message.quota_keys = quota_keys;
self.message.quota_keys = quota_keys.into_boxed_slice();
}
}
}

View File

@@ -90,7 +90,7 @@ impl SmtpSpool for Server {
priority: 0,
size: 0,
blob_hash: Default::default(),
quota_keys: Vec::new(),
quota_keys: Default::default(),
received_from_ip: IpAddr::V4(Ipv4Addr::LOCALHOST),
received_via_port: 0,
},
@@ -417,11 +417,11 @@ impl MessageWrapper {
for quota_key in &self.message.quota_keys {
match quota_key {
QuotaKey::Count { key, .. } => {
batch.add(ValueClass::Queue(QueueClass::QuotaCount(key.clone())), 1);
batch.add(ValueClass::Queue(QueueClass::QuotaCount(key.to_vec())), 1);
}
QuotaKey::Size { key, .. } => {
batch.add(
ValueClass::Queue(QueueClass::QuotaSize(key.clone())),
ValueClass::Queue(QueueClass::QuotaSize(key.to_vec())),
self.message.size as i64,
);
}
@@ -691,11 +691,11 @@ impl MessageWrapper {
for quota_key in self.message.quota_keys {
match quota_key {
QuotaKey::Count { key, .. } => {
batch.add(ValueClass::Queue(QueueClass::QuotaCount(key)), -1);
batch.add(ValueClass::Queue(QueueClass::QuotaCount(key.to_vec())), -1);
}
QuotaKey::Size { key, .. } => {
batch.add(
ValueClass::Queue(QueueClass::QuotaSize(key)),
ValueClass::Queue(QueueClass::QuotaSize(key.to_vec())),
-(self.message.size as i64),
);
}