From 0c672453941757567fc5dfd0cca1c104bd85f4d6 Mon Sep 17 00:00:00 2001
From: Yaroslav Dynnikov <yaroslav.dynnikov@gmail.com>
Date: Wed, 26 Oct 2022 01:58:24 +0300
Subject: [PATCH] refactor: postpone requiring vshard

Do it only when the governor tells to. When `_G.vshard == nil`, it's
more alike `traft::node::global()` which reurns either `Ok` or
`Err(Uninitialized)`.
---
 src/main.rs               |  6 ++----
 src/traft/rpc/sharding.rs | 16 ++++++++++++----
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index e99f55fb9e..0cb3d23b7f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -349,7 +349,7 @@ fn picolib_setup(args: &args::Run) {
     );
 }
 
-fn init_vshard() {
+fn preload_vshard() {
     let lua = ::tarantool::lua_state();
 
     macro_rules! preload {
@@ -382,8 +382,6 @@ fn init_vshard() {
     preload!("vshard.storage.sched", "vshard/storage/sched.lua");
     preload!("vshard.util", "vshard/util.lua");
     preload!("vshard.version", "vshard/version.lua");
-
-    lua.exec("vshard = require 'vshard'").unwrap();
 }
 
 fn init_handlers() {
@@ -616,7 +614,7 @@ fn init_common(args: &args::Run, cfg: &tarantool::Cfg) -> Storage {
     std::fs::create_dir_all(&args.data_dir).unwrap();
     tarantool::set_cfg(cfg);
 
-    init_vshard();
+    preload_vshard();
     init_handlers();
     traft::event::init();
     Storage::new().expect("Storage initialization failed")
diff --git a/src/traft/rpc/sharding.rs b/src/traft/rpc/sharding.rs
index 18659f245e..ea14944296 100644
--- a/src/traft/rpc/sharding.rs
+++ b/src/traft/rpc/sharding.rs
@@ -18,11 +18,19 @@ fn proc_sharding(req: Request) -> Result<Response, Error> {
     // TODO: fix user's permissions
     lua.exec("box.session.su('admin')")?;
     // TODO: only done on instances with corresponding roles
-    lua.exec_with("vshard.storage.cfg(..., box.info.uuid)", &cfg)
-        .map_err(tlua::LuaError::from)?;
+    lua.exec_with(
+        "vshard = require('vshard')
+        vshard.storage.cfg(..., box.info.uuid)",
+        &cfg,
+    )
+    .map_err(tlua::LuaError::from)?;
     // TODO: only done on instances with corresponding roles
-    lua.exec_with("vshard.router.cfg(...)", &cfg)
-        .map_err(tlua::LuaError::from)?;
+    lua.exec_with(
+        "vshard = require('vshard')
+        vshard.router.cfg(...)",
+        &cfg,
+    )
+    .map_err(tlua::LuaError::from)?;
 
     if req.bootstrap {
         lua.exec("vshard.router.bootstrap()")?;
-- 
GitLab