From 849f8b8564bab01931cfd2a19fea50a43ca1d6c0 Mon Sep 17 00:00:00 2001 From: Charles Dixon Date: Thu, 25 Jul 2024 10:36:09 +0100 Subject: [PATCH] Move to nightly rust to access async closures Motivation ---------- A primary design pattern that we want to use is currently challenging due to asybc closures not being supported in stable rust. In order to make this pattern possible we should switch to nightly and enable the feature. async_closures should be moved to stable before we need to release the SDK. Changes -------- Specify the nightly toolchain. Enable async_closures feature. Use async closures. --- .github/workflows/build.yml | 4 ++++ rust-toolchain.toml | 2 ++ sdk/couchbase-core/src/kvclientmanager.rs | 25 +++++-------------- sdk/couchbase-core/src/lib.rs | 2 ++ sdk/couchbase-core/src/vbucketrouter.rs | 29 +++++++++++------------ 5 files changed, 28 insertions(+), 34 deletions(-) create mode 100644 rust-toolchain.toml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fdb44c0d..b6378852 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,6 +29,10 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Update Rust Toolchain Target + run: | + echo "targets = ['${{matrix.target}}']" >> rust-toolchain.toml + - name: Setup Rust toolchain and cache uses: actions-rust-lang/setup-rust-toolchain@v1.4.3 with: diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 00000000..5d56faf9 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "nightly" diff --git a/sdk/couchbase-core/src/kvclientmanager.rs b/sdk/couchbase-core/src/kvclientmanager.rs index ab06acba..77e35c3a 100644 --- a/sdk/couchbase-core/src/kvclientmanager.rs +++ b/sdk/couchbase-core/src/kvclientmanager.rs @@ -239,10 +239,8 @@ where let client = manager.get_client(endpoint.clone()).await?; let res = operation(client.clone()).await; - match res { - Ok(r) => { - return Ok(r); - } + return match res { + Ok(r) => Ok(r), Err(e) => { if let Some(memdx_err) = e.is_memdx_error() { if memdx_err.is_dispatch_error() { @@ -257,20 +255,9 @@ where } } - return Err(e); + Err(e) } - } - } -} - -pub(crate) struct OrchestrateMemdClientAsyncFnMut {} - -impl OrchestrateMemdClientAsyncFnMut { - async fn call(&mut self, client: Arc) -> Result - where - K: KvClient + KvClientOps + PartialEq + Sync + Send + 'static, - { - todo!() + }; } } @@ -357,7 +344,7 @@ mod tests { let result = orchestrate_memd_client( &manager, "192.168.107.128:11210".to_string(), - |client: Arc>| async move { + async |client: Arc>| { client .set(SetRequest { collection_id: 0, @@ -379,7 +366,7 @@ mod tests { .await .unwrap(); - dbg!(result); + // dbg!(result); let client = manager .get_client("192.168.107.128:11210".to_string()) diff --git a/sdk/couchbase-core/src/lib.rs b/sdk/couchbase-core/src/lib.rs index b10867ed..6b67ab2e 100644 --- a/sdk/couchbase-core/src/lib.rs +++ b/sdk/couchbase-core/src/lib.rs @@ -1,3 +1,5 @@ +#![feature(async_closure)] + pub mod authenticator; pub mod cbconfig; mod configparser; diff --git a/sdk/couchbase-core/src/vbucketrouter.rs b/sdk/couchbase-core/src/vbucketrouter.rs index c129fe63..f122749d 100644 --- a/sdk/couchbase-core/src/vbucketrouter.rs +++ b/sdk/couchbase-core/src/vbucketrouter.rs @@ -79,10 +79,10 @@ pub(crate) trait NotMyVbucketConfigHandler { pub(crate) async fn orchestrate_memd_routing( vb: &V, - ch: Option>, + nmvb_handler: Arc, key: &[u8], vb_server_idx: u32, - mut operation: impl FnMut(String, u16) -> Fut, + mut operation: impl Fn(String, u16) -> Fut, ) -> Result where V: VbucketRouter, @@ -96,12 +96,6 @@ where Err(e) => e, }; - let ch = ch.clone(); - - if ch.is_none() { - return Err(err); - } - let config = if let Some(memdx_err) = err.is_memdx_error() { if memdx_err.is_notmyvbucket_error() { if let Some(config) = memdx_err.has_server_config() { @@ -134,7 +128,9 @@ where } }; - ch.unwrap().not_my_vbucket_config(config_json, &endpoint); + nmvb_handler + .clone() + .not_my_vbucket_config(config_json, &endpoint); let (new_endpoint, new_vb_id) = vb.dispatch_by_key(key, vb_server_idx)?; if new_endpoint == endpoint && new_vb_id == vb_id { @@ -280,16 +276,19 @@ mod tests { let dispatcher = StdVbucketRouter::new(routing_info, VbucketRouterOptions {}); + // let dispatcher = Arc::new(dispatcher); + // let manager = Arc::new(manager); + let set_result = orchestrate_memd_routing( &dispatcher, - Some(Arc::new(NVMBHandler {})), + Arc::new(NVMBHandler {}), b"test", 0, - |endpoint: String, vb_id: u16| async { + async |endpoint: String, vb_id: u16| { orchestrate_memd_client( &manager, endpoint, - |client: Arc>| async move { + async |client: Arc>| { client .set(SetRequest { collection_id: 0, @@ -318,14 +317,14 @@ mod tests { let get_result = orchestrate_memd_routing( &dispatcher, - Some(Arc::new(NVMBHandler {})), + Arc::new(NVMBHandler {}), b"test", 0, - |endpoint: String, vb_id: u16| async { + async |endpoint: String, vb_id: u16| { orchestrate_memd_client( &manager, endpoint, - |client: Arc>| async move { + async |client: Arc>| { client .get(GetRequest { collection_id: 0,