diff --git a/bucket/ddc_bucket/cluster/entity.rs b/bucket/ddc_bucket/cluster/entity.rs index 896dba5f..a7f0bba2 100644 --- a/bucket/ddc_bucket/cluster/entity.rs +++ b/bucket/ddc_bucket/cluster/entity.rs @@ -50,6 +50,7 @@ impl ink_storage::traits::PackedAllocate for Cluster { pub struct ClusterInfo { pub cluster_id: ClusterId, pub cluster: Cluster, + // pub cluster_nodes: Vec>, pub cluster_v_nodes: Vec, } diff --git a/bucket/ddc_bucket/tests/test_cluster.rs b/bucket/ddc_bucket/tests/test_cluster.rs index 5d5ef9da..8fc672ed 100644 --- a/bucket/ddc_bucket/tests/test_cluster.rs +++ b/bucket/ddc_bucket/tests/test_cluster.rs @@ -39,7 +39,10 @@ fn cluster_create_ok() { // Check cluster Storage nodes let node0 = ctx.contract.node_get(ctx.node_key0)?; - let v_nodes0 = ctx.contract.get_v_nodes_by_node(ctx.node_key0); + let v_nodes0 = ctx + .contract + .get_v_nodes_by_node(ctx.cluster_id, ctx.node_key0) + .unwrap(); let v_nodes0_len: u32 = v_nodes0.len().try_into().unwrap(); assert_eq!( @@ -59,7 +62,10 @@ fn cluster_create_ok() { ); let node1 = ctx.contract.node_get(ctx.node_key1)?; - let v_nodes1 = ctx.contract.get_v_nodes_by_node(ctx.node_key1); + let v_nodes1 = ctx + .contract + .get_v_nodes_by_node(ctx.cluster_id, ctx.node_key1) + .unwrap(); let v_nodes1_len: u32 = v_nodes1.len().try_into().unwrap(); assert_eq!( @@ -79,7 +85,10 @@ fn cluster_create_ok() { ); let node2 = ctx.contract.node_get(ctx.node_key2)?; - let v_nodes2 = ctx.contract.get_v_nodes_by_node(ctx.node_key2); + let v_nodes2 = ctx + .contract + .get_v_nodes_by_node(ctx.cluster_id, ctx.node_key2) + .unwrap(); let v_nodes2_len: u32 = v_nodes2.len().try_into().unwrap(); assert_eq!( @@ -1132,11 +1141,20 @@ fn cluster_replace_node_ok() { "a v_node must be replaced" ); - let mut v_nodes0 = ctx.contract.get_v_nodes_by_node(ctx.node_key0.clone()); + let mut v_nodes0 = ctx + .contract + .get_v_nodes_by_node(ctx.cluster_id, ctx.node_key0.clone()) + .unwrap(); v_nodes0.sort(); - let mut v_nodes1 = ctx.contract.get_v_nodes_by_node(ctx.node_key1.clone()); + let mut v_nodes1 = ctx + .contract + .get_v_nodes_by_node(ctx.cluster_id, ctx.node_key1.clone()) + .unwrap(); v_nodes1.sort(); - let mut v_nodes2 = ctx.contract.get_v_nodes_by_node(ctx.node_key2.clone()); + let mut v_nodes2 = ctx + .contract + .get_v_nodes_by_node(ctx.cluster_id, ctx.node_key2.clone()) + .unwrap(); v_nodes2.sort(); assert_eq!( @@ -1313,11 +1331,20 @@ fn cluster_reset_node_ok() { "a v_node must be replaced" ); - let mut v_nodes0 = ctx.contract.get_v_nodes_by_node(ctx.node_key0.clone()); + let mut v_nodes0 = ctx + .contract + .get_v_nodes_by_node(ctx.cluster_id, ctx.node_key0.clone()) + .unwrap(); v_nodes0.sort(); - let mut v_nodes1 = ctx.contract.get_v_nodes_by_node(ctx.node_key1.clone()); + let mut v_nodes1 = ctx + .contract + .get_v_nodes_by_node(ctx.cluster_id, ctx.node_key1.clone()) + .unwrap(); v_nodes1.sort(); - let mut v_nodes2 = ctx.contract.get_v_nodes_by_node(ctx.node_key2.clone()); + let mut v_nodes2 = ctx + .contract + .get_v_nodes_by_node(ctx.cluster_id, ctx.node_key2.clone()) + .unwrap(); v_nodes2.sort(); assert_eq!( diff --git a/bucket/ddc_bucket/topology/messages.rs b/bucket/ddc_bucket/topology/messages.rs index 40f6f902..c1628d9e 100644 --- a/bucket/ddc_bucket/topology/messages.rs +++ b/bucket/ddc_bucket/topology/messages.rs @@ -1,6 +1,6 @@ //! The public interface to manage Nodes. -use crate::ddc_bucket::{ClusterId, DdcBucket, NodeKey, Result, VNodeToken}; +use crate::ddc_bucket::{ClusterId, DdcBucket, Error::*, NodeKey, Result, VNodeToken}; use ink_prelude::vec::Vec; impl DdcBucket { @@ -8,8 +8,18 @@ impl DdcBucket { self.topology.get_v_nodes_by_cluster(cluster_id) } - pub fn message_get_v_nodes_by_node(&self, node_key: NodeKey) -> Vec { - self.topology.get_v_nodes_by_node(node_key) + pub fn message_get_v_nodes_by_node( + &self, + cluster_id: ClusterId, + node_key: NodeKey, + ) -> Result> { + let node = self.nodes.get(node_key)?; + + if node.cluster_id != Some(cluster_id) { + return Err(NodeIsNotAddedToCluster(cluster_id)); + } + + Ok(self.topology.get_v_nodes_by_node(node_key)) } pub fn message_get_node_by_v_node( diff --git a/bucket/lib.rs b/bucket/lib.rs index f6463639..a3c53a7a 100755 --- a/bucket/lib.rs +++ b/bucket/lib.rs @@ -1685,8 +1685,12 @@ pub mod ddc_bucket { } #[ink(message)] - pub fn get_v_nodes_by_node(&self, node_key: NodeKey) -> Vec { - self.message_get_v_nodes_by_node(node_key) + pub fn get_v_nodes_by_node( + &self, + cluster_id: ClusterId, + node_key: NodeKey, + ) -> Result> { + self.message_get_v_nodes_by_node(cluster_id, node_key) } #[ink(message)]