Skip to content

Commit a7d2575

Browse files
committed
refactor: start a meta-service as local meta for testing
- Replaced the in-memory meta-store with a meta-service running in a temporary directory for testing purposes. - The in-memory meta-store was limited in functionality and did not provide a complete feature set. - The new approach ensures full functionality during testing by simulating a real meta-service.
1 parent e8d8ea3 commit a7d2575

File tree

7 files changed

+324
-52
lines changed

7 files changed

+324
-52
lines changed

Cargo.lock

+5-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/meta/store/Cargo.toml

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,20 @@ edition = { workspace = true }
1111
io-uring = []
1212

1313
[dependencies]
14+
anyhow = { workspace = true }
1415
async-trait = { workspace = true }
1516
databend-common-base = { workspace = true }
1617
databend-common-grpc = { workspace = true }
1718
databend-common-meta-client = { workspace = true }
18-
databend-common-meta-embedded = { workspace = true }
1919
databend-common-meta-kvapi = { workspace = true }
2020
databend-common-meta-semaphore = { workspace = true }
2121
databend-common-meta-types = { workspace = true }
22+
databend-meta = { workspace = true }
2223
log = { workspace = true }
24+
tempfile = { workspace = true }
25+
tokio = { workspace = true }
2326
tokio-stream = { workspace = true }
27+
tonic = { workspace = true }
2428

2529
[lints]
2630
workspace = true

src/meta/store/src/lib.rs

+30-48
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,32 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
use std::collections::hash_map::Entry;
15+
pub(crate) mod local;
16+
17+
use std::ops::Deref;
1618
use std::pin::Pin;
1719
use std::sync::Arc;
1820
use std::task::Context;
1921
use std::task::Poll;
2022
use std::time::Duration;
2123

22-
use databend_common_base::base::tokio::sync::Semaphore as TokioSemaphore;
2324
use databend_common_grpc::RpcClientConf;
2425
use databend_common_meta_client::errors::CreationError;
2526
use databend_common_meta_client::ClientHandle;
2627
use databend_common_meta_client::MetaGrpcClient;
27-
use databend_common_meta_embedded::MemMeta;
2828
use databend_common_meta_kvapi::kvapi;
2929
use databend_common_meta_kvapi::kvapi::KVStream;
3030
use databend_common_meta_kvapi::kvapi::UpsertKVReply;
3131
use databend_common_meta_semaphore::acquirer::Permit;
3232
use databend_common_meta_semaphore::errors::AcquireError;
33-
use databend_common_meta_semaphore::errors::ConnectionClosed;
3433
use databend_common_meta_semaphore::Semaphore;
3534
use databend_common_meta_types::protobuf::WatchRequest;
3635
use databend_common_meta_types::protobuf::WatchResponse;
3736
use databend_common_meta_types::MetaError;
3837
use databend_common_meta_types::TxnReply;
3938
use databend_common_meta_types::TxnRequest;
4039
use databend_common_meta_types::UpsertKV;
40+
pub use local::LocalMetaService;
4141
use log::info;
4242
use tokio_stream::Stream;
4343

@@ -52,7 +52,7 @@ pub struct MetaStoreProvider {
5252
/// MetaStore is impl with either a local embedded meta store, or a grpc-client of metasrv
5353
#[derive(Clone)]
5454
pub enum MetaStore {
55-
L(Arc<MemMeta>),
55+
L(Arc<LocalMetaService>),
5656
R(Arc<ClientHandle>),
5757
}
5858

@@ -69,23 +69,23 @@ impl MetaStore {
6969
}
7070

7171
pub async fn get_local_addr(&self) -> std::result::Result<Option<String>, MetaError> {
72-
match self {
73-
MetaStore::L(_) => Ok(None),
74-
MetaStore::R(grpc_client) => {
75-
let client_info = grpc_client.get_client_info().await?;
76-
Ok(Some(client_info.client_addr))
77-
}
78-
}
72+
let client = match self {
73+
MetaStore::L(l) => l.deref().deref(),
74+
MetaStore::R(grpc_client) => grpc_client,
75+
};
76+
77+
let client_info = client.get_client_info().await?;
78+
Ok(Some(client_info.client_addr))
7979
}
8080

8181
pub async fn watch(&self, request: WatchRequest) -> Result<WatchStream, MetaError> {
82-
match self {
83-
MetaStore::L(_) => unreachable!(),
84-
MetaStore::R(grpc_client) => {
85-
let streaming = grpc_client.request(request).await?;
86-
Ok(Box::pin(WatchResponseStream::create(streaming)))
87-
}
88-
}
82+
let client = match self {
83+
MetaStore::L(l) => l.deref(),
84+
MetaStore::R(grpc_client) => grpc_client,
85+
};
86+
87+
let streaming = client.request(request).await?;
88+
Ok(Box::pin(WatchResponseStream::create(streaming)))
8989
}
9090

9191
pub async fn new_acquired(
@@ -95,33 +95,12 @@ impl MetaStore {
9595
id: impl ToString,
9696
lease: Duration,
9797
) -> Result<Permit, AcquireError> {
98-
match self {
99-
MetaStore::L(v) => {
100-
let mut local_lock_map = v.locks.lock().await;
101-
102-
let acquire_res = match local_lock_map.entry(prefix.to_string()) {
103-
Entry::Occupied(v) => v.get().clone(),
104-
Entry::Vacant(v) => v
105-
.insert(Arc::new(TokioSemaphore::new(capacity as usize)))
106-
.clone(),
107-
};
108-
109-
match acquire_res.acquire_owned().await {
110-
Ok(guard) => Ok(Permit {
111-
fu: Box::pin(async move {
112-
let _guard = guard;
113-
Ok(())
114-
}),
115-
}),
116-
Err(_e) => Err(AcquireError::ConnectionClosed(ConnectionClosed::new_str(
117-
"",
118-
))),
119-
}
120-
}
121-
MetaStore::R(grpc_client) => {
122-
Semaphore::new_acquired(grpc_client.clone(), prefix, capacity, id, lease).await
123-
}
124-
}
98+
let client = match self {
99+
MetaStore::L(l) => l.deref(),
100+
MetaStore::R(grpc_client) => grpc_client,
101+
};
102+
103+
Semaphore::new_acquired(client.clone(), prefix, capacity, id, lease).await
125104
}
126105
}
127106

@@ -171,8 +150,11 @@ impl MetaStoreProvider {
171150
);
172151

173152
// NOTE: This can only be used for test: data will be removed when program quit.
174-
let meta_store = MemMeta::default();
175-
Ok(MetaStore::L(Arc::new(meta_store)))
153+
Ok(MetaStore::L(Arc::new(
154+
LocalMetaService::new("MetaStoreProvider-created")
155+
.await
156+
.unwrap(),
157+
)))
176158
} else {
177159
info!(conf :? =(&self.rpc_conf); "use remote meta");
178160
let client = MetaGrpcClient::try_new(&self.rpc_conf)?;

0 commit comments

Comments
 (0)