From 79267b4e5cec3eed14d903d0236384441cda384d Mon Sep 17 00:00:00 2001
From: Georgy Moshkin <gmoshkin@picodata.io>
Date: Mon, 5 Jun 2023 10:17:25 +0300
Subject: [PATCH] refactor: extract function ddl_meta_space_update_operable

---
 src/storage.rs    | 23 ++++++++++++++++++++
 src/traft/node.rs | 53 +++++++----------------------------------------
 2 files changed, 30 insertions(+), 46 deletions(-)

diff --git a/src/storage.rs b/src/storage.rs
index 7b65f2aa05..f9bd521c9e 100644
--- a/src/storage.rs
+++ b/src/storage.rs
@@ -1670,6 +1670,29 @@ impl ToEntryIter for Indexes {
     }
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// ddl meta
+////////////////////////////////////////////////////////////////////////////////
+
+/// Updates the field `"operable"` for a space with id `space_id` and any
+/// necessary entities (currently all existing indexes).
+///
+/// This function is called when applying the different ddl operations.
+pub fn ddl_meta_space_update_operable(
+    storage: &Clusterwide,
+    space_id: SpaceId,
+    operable: bool,
+) -> traft::Result<()> {
+    storage.spaces.update_operable(space_id, operable)?;
+    let iter = storage.indexes.by_space_id(space_id)?;
+    for index in iter {
+        storage
+            .indexes
+            .update_operable(index.space_id, index.id, operable)?;
+    }
+    Ok(())
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // ddl
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/src/traft/node.rs b/src/traft/node.rs
index 54b666511f..dba0110e3c 100644
--- a/src/traft/node.rs
+++ b/src/traft/node.rs
@@ -13,10 +13,10 @@ use crate::loop_start;
 use crate::r#loop::FlowControl;
 use crate::rpc;
 use crate::schema::{Distribution, IndexDef, SpaceDef};
-use crate::storage::ddl_abort_on_master;
 use crate::storage::local_schema_version;
 use crate::storage::SnapshotData;
 use crate::storage::ToEntryIter as _;
+use crate::storage::{ddl_abort_on_master, ddl_meta_space_update_operable};
 use crate::storage::{Clusterwide, ClusterwideSpaceId, PropertyName};
 use crate::stringify_cfunc;
 use crate::sync;
@@ -881,21 +881,8 @@ impl NodeImpl {
                 // Update pico metadata.
                 match ddl {
                     Ddl::CreateSpace { id, .. } => {
-                        self.storage
-                            .spaces
-                            .update_operable(id, true)
-                            .expect("storage error");
-                        self.storage
-                            .indexes
-                            .update_operable(id, 0, true)
-                            .expect("storage error");
-                        // For now we just assume that during space creation index with id 1
-                        // exists if and only if it is a bucket_id index.
-                        let res = self.storage.indexes.update_operable(id, 1, true);
-                        // TODO: maybe we should first check if this index
-                        // exists or check the space definition if this should
-                        // be done, but for now we just ignore the error "no such index"
-                        let _ = res;
+                        ddl_meta_space_update_operable(&self.storage, id, true)
+                            .expect("storage shouldn't fail");
                     }
 
                     Ddl::DropSpace { id } => {
@@ -962,21 +949,8 @@ impl NodeImpl {
                     }
 
                     Ddl::DropSpace { id } => {
-                        self.storage
-                            .spaces
-                            .update_operable(id, true)
-                            .expect("storage should never fail");
-                        let iter = self
-                            .storage
-                            .indexes
-                            .by_space_id(id)
-                            .expect("storage should never fail");
-                        for index in iter {
-                            self.storage
-                                .indexes
-                                .update_operable(index.space_id, index.id, true)
-                                .expect("storage should never fail");
-                        }
+                        ddl_meta_space_update_operable(&self.storage, id, true)
+                            .expect("storage shouldn't fail");
                     }
 
                     _ => {
@@ -1159,21 +1133,8 @@ impl NodeImpl {
             }
 
             Ddl::DropSpace { id } => {
-                self.storage
-                    .spaces
-                    .update_operable(id, false)
-                    .expect("storage should never fail");
-                let iter = self
-                    .storage
-                    .indexes
-                    .by_space_id(id)
-                    .expect("storage should never fail");
-                for index in iter {
-                    self.storage
-                        .indexes
-                        .update_operable(index.space_id, index.id, false)
-                        .expect("storage should never fail");
-                }
+                ddl_meta_space_update_operable(&self.storage, id, false)
+                    .expect("storage shouldn't fail");
             }
 
             Ddl::DropIndex { index_id, space_id } => {
-- 
GitLab