diff options
author | mdecimus <mauro@stalw.art> | 2024-04-28 19:52:02 +0200 |
---|---|---|
committer | mdecimus <mauro@stalw.art> | 2024-05-02 10:19:06 +0100 |
commit | 91f674d9211393c755f5cf24a2e407583d2780cc (patch) | |
tree | 7a102533410a7b926ff9bc6bcb72eacd9db2bb94 /crates/store/src/write | |
parent | fb110fb078e40d866b9432c2ceb47e3298f5885d (diff) |
Support for concurrent index updates
Diffstat (limited to 'crates/store/src/write')
-rw-r--r-- | crates/store/src/write/key.rs | 21 | ||||
-rw-r--r-- | crates/store/src/write/mod.rs | 8 |
2 files changed, 21 insertions, 8 deletions
diff --git a/crates/store/src/write/key.rs b/crates/store/src/write/key.rs index 98bad51d..26b74d44 100644 --- a/crates/store/src/write/key.rs +++ b/crates/store/src/write/key.rs @@ -34,8 +34,8 @@ use crate::{ }; use super::{ - AnyKey, AssignedIds, BitmapClass, BlobOp, DirectoryClass, LookupClass, QueueClass, ReportClass, - ReportEvent, ResolveId, TagValue, ValueClass, + AnyKey, AssignedIds, BitmapClass, BlobOp, DirectoryClass, IndexEmailClass, LookupClass, + QueueClass, ReportClass, ReportEvent, ResolveId, TagValue, ValueClass, }; pub struct KeySerializer { @@ -271,9 +271,16 @@ impl<T: ResolveId> ValueClass<T> { .write(account_id) .write(collection) .write(document_id), - ValueClass::IndexEmail(seq) => { - serializer.write(*seq).write(account_id).write(document_id) - } + ValueClass::IndexEmail(index) => match index { + IndexEmailClass::Insert { seq, hash } => serializer + .write(*seq) + .write(account_id) + .write(document_id) + .write::<&[u8]>(hash.as_ref()), + IndexEmailClass::Delete { seq } => { + serializer.write(*seq).write(account_id).write(document_id) + } + }, ValueClass::Blob(op) => match op { BlobOp::Reserve { hash, until } => serializer .write(account_id) @@ -527,7 +534,7 @@ impl<T> ValueClass<T> { BlobOp::Reserve { .. } => BLOB_HASH_LEN + U64_LEN + U32_LEN + 1, BlobOp::Commit { .. } | BlobOp::Link { .. } => BLOB_HASH_LEN + U32_LEN * 2 + 2, }, - ValueClass::IndexEmail { .. } => U64_LEN * 2, + ValueClass::IndexEmail { .. } => BLOB_HASH_LEN + U64_LEN * 2, ValueClass::Queue(q) => match q { QueueClass::Message(_) => U64_LEN, QueueClass::MessageEvent(_) => U64_LEN * 2, @@ -554,7 +561,7 @@ impl<T> ValueClass<T> { } ValueClass::TermIndex => SUBSPACE_TERM_INDEX, ValueClass::Acl(_) => SUBSPACE_ACL, - ValueClass::IndexEmail(_) => SUBSPACE_FTS_INDEX, + ValueClass::IndexEmail { .. } => SUBSPACE_FTS_INDEX, ValueClass::Blob(op) => match op { BlobOp::Reserve { .. } => SUBSPACE_BLOB_RESERVE, BlobOp::Commit { .. } | BlobOp::Link { .. } => SUBSPACE_BLOB_LINK, diff --git a/crates/store/src/write/mod.rs b/crates/store/src/write/mod.rs index 7990c9fe..f62db0c5 100644 --- a/crates/store/src/write/mod.rs +++ b/crates/store/src/write/mod.rs @@ -167,13 +167,19 @@ pub enum ValueClass<T> { TermIndex, Directory(DirectoryClass<T>), Blob(BlobOp), - IndexEmail(u64), + IndexEmail(IndexEmailClass), Config(Vec<u8>), Queue(QueueClass), Report(ReportClass), } #[derive(Debug, PartialEq, Clone, Eq, Hash)] +pub enum IndexEmailClass { + Insert { seq: u64, hash: BlobHash }, + Delete { seq: u64 }, +} + +#[derive(Debug, PartialEq, Clone, Eq, Hash)] pub enum LookupClass { Key(Vec<u8>), Counter(Vec<u8>), |