summaryrefslogtreecommitdiff
path: root/crates/store/src/write
diff options
context:
space:
mode:
authormdecimus <mauro@stalw.art>2024-04-28 19:52:02 +0200
committermdecimus <mauro@stalw.art>2024-05-02 10:19:06 +0100
commit91f674d9211393c755f5cf24a2e407583d2780cc (patch)
tree7a102533410a7b926ff9bc6bcb72eacd9db2bb94 /crates/store/src/write
parentfb110fb078e40d866b9432c2ceb47e3298f5885d (diff)
Support for concurrent index updates
Diffstat (limited to 'crates/store/src/write')
-rw-r--r--crates/store/src/write/key.rs21
-rw-r--r--crates/store/src/write/mod.rs8
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>),