flare_dht/shard/
hashmap.rs

1use std::sync::Arc;
2
3use scc::HashMap;
4use tracing::info;
5
6use crate::error::FlareError;
7
8use super::{ByteEntry, KvShard, ShardFactory, ShardMetadata};
9
10#[allow(dead_code)]
11#[derive(Debug, Clone, Default)]
12pub struct HashMapShard {
13    pub shard_metadata: ShardMetadata,
14    pub map: HashMap<String, ByteEntry>,
15}
16
17#[async_trait::async_trait]
18impl KvShard for HashMapShard {
19    type Key = String;
20    type Entry = ByteEntry;
21
22    fn meta(&self) -> &ShardMetadata {
23        &self.shard_metadata
24    }
25
26    async fn get(&self, key: &String) -> Result<Option<ByteEntry>, FlareError> {
27        let out = self.map.get_async(key).await;
28        let out = out.map(|r| r.clone());
29        Ok(out)
30    }
31
32    // async fn modify<F, O>(&self, key: &Self::Key, f: F) -> Result<O, FlareError>
33    // where
34    //     F: FnOnce(&mut Self::Entry) -> O + Send,
35    // {
36    //     let out = match self.map.entry_async(key.clone()).await {
37    //         Occupied(mut occupied_entry) => {
38    //             let entry = occupied_entry.get_mut();
39    //             f(entry)
40    //         }
41    //         Vacant(vacant_entry) => {
42    //             let mut entry = Self::Entry::default();
43    //             let o = f(&mut entry);
44    //             vacant_entry.insert_entry(entry);
45    //             o
46    //         }
47    //     };
48    //     Ok(out)
49    // }
50
51    async fn set(
52        &self,
53        key: String,
54        value: ByteEntry,
55    ) -> Result<(), FlareError> {
56        self.map.upsert_async(key, value).await;
57        Ok(())
58    }
59
60    async fn delete(&self, key: &String) -> Result<(), FlareError> {
61        self.map.remove_async(key).await;
62        Ok(())
63    }
64}
65
66pub struct HashMapShardFactory {}
67
68impl ShardFactory<HashMapShard> for HashMapShardFactory {
69    fn create_shard(
70        &self,
71        shard_metadata: ShardMetadata,
72    ) -> std::sync::Arc<HashMapShard> {
73        info!("create shard {:?}", &shard_metadata);
74        let shard = HashMapShard {
75            shard_metadata: shard_metadata,
76            ..Default::default()
77        };
78        let shard = Arc::new(shard);
79        shard
80    }
81}