From 67e893abded4877b3d1d9024def4aaf5e4764a4f Mon Sep 17 00:00:00 2001
From: Konstantin Osipov <kostja@tarantool.org>
Date: Tue, 2 Sep 2014 19:13:04 +0400
Subject: [PATCH] A fix fog gh-452 crash hot_standby test

Recovery now needs to be run in a non-sched fiber.
Create a fiber for it in on_bind callback.

On another token:

- rename snap_daemon to snapshot_daemon
- don't output redundant snap_daemon prefix in the log, it's already
in the fiber name.
- miscallenous cleanups (roles).
---
 src/box/CMakeLists.txt                        |  2 +-
 src/box/alter.cc                              |  2 +-
 src/box/box.cc                                |  2 +-
 src/box/lua/call.cc                           |  4 +-
 .../{snap_daemon.lua => snapshot_daemon.lua}  | 48 +++++++++----------
 src/errcode.h                                 |  3 +-
 src/iproto.cc                                 |  9 +++-
 test/box/misc.result                          |  1 +
 test/box/session.storage.result               |  2 +-
 9 files changed, 39 insertions(+), 34 deletions(-)
 rename src/box/lua/{snap_daemon.lua => snapshot_daemon.lua} (79%)

diff --git a/src/box/CMakeLists.txt b/src/box/CMakeLists.txt
index 867cfb0404..896003798e 100644
--- a/src/box/CMakeLists.txt
+++ b/src/box/CMakeLists.txt
@@ -7,7 +7,7 @@ lua_source(lua_sources lua/load_cfg.lua)
 lua_source(lua_sources lua/schema.lua)
 lua_source(lua_sources lua/tuple.lua)
 lua_source(lua_sources lua/session.lua)
-lua_source(lua_sources lua/snap_daemon.lua)
+lua_source(lua_sources lua/snapshot_daemon.lua)
 set(bin_sources)
 bin_source(bin_sources bootstrap.snap bootstrap.h)
 
diff --git a/src/box/alter.cc b/src/box/alter.cc
index 6e2c55d1df..b759b6dd36 100644
--- a/src/box/alter.cc
+++ b/src/box/alter.cc
@@ -1214,7 +1214,7 @@ user_create_from_tuple(struct user *user, struct tuple *tuple)
 	if (tuple_field_count(tuple) > AUTH_MECH_LIST) {
 		const char *auth_data = tuple_field(tuple, AUTH_MECH_LIST);
 		if (user->type == SC_ROLE && strlen(auth_data)) {
-			tnt_raise(ClientError, ER_CREATE_USER,
+			tnt_raise(ClientError, ER_CREATE_ROLE, user->name,
 				  "authentication data can not be set for "
 				  "a role");
 		}
diff --git a/src/box/box.cc b/src/box/box.cc
index 1a61f5cb6e..0228087e5b 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -287,7 +287,7 @@ boxk(enum iproto_type type, uint32_t space_id, const char *format, ...)
 /**
  * @brief Called when recovery/replication wants to add a new server
  * to cluster.
- * cluster_add_server() is called as a commit trigger on _cluster
+ * cluster_add_server() is called as a commit trigger on jcluster
  * space and actually adds the server to the cluster.
  * @param server_uuid
  */
diff --git a/src/box/lua/call.cc b/src/box/lua/call.cc
index 69c26af4d3..4a394417a3 100644
--- a/src/box/lua/call.cc
+++ b/src/box/lua/call.cc
@@ -54,12 +54,12 @@
 extern char session_lua[],
 	schema_lua[],
 	load_cfg_lua[],
-	snap_daemon_lua[];
+	snapshot_daemon_lua[];
 
 static const char *lua_sources[] = {
 	session_lua,
 	schema_lua,
-	snap_daemon_lua,
+	snapshot_daemon_lua,
 	load_cfg_lua,
 	NULL
 };
diff --git a/src/box/lua/snap_daemon.lua b/src/box/lua/snapshot_daemon.lua
similarity index 79%
rename from src/box/lua/snap_daemon.lua
rename to src/box/lua/snapshot_daemon.lua
index aec2d047bf..b482cc53c4 100644
--- a/src/box/lua/snap_daemon.lua
+++ b/src/box/lua/snapshot_daemon.lua
@@ -15,7 +15,7 @@ do
 
     -- create snapshot, return true if no errors
     local function snapshot()
-        log.info("%s: making snapshot...", PREFIX)
+        log.info("making snapshot...")
         local s, e = pcall(function() box.snapshot() end)
         if s then
             return true
@@ -24,7 +24,7 @@ do
         if errno() == errno.EEXIST then
             return false
         end
-        log.error("%s: error while creating snapshot: %s", PREFIX, e)
+        log.error("error while creating snapshot: %s", e)
         return false
     end
 
@@ -52,14 +52,13 @@ do
 
         local snap_name = sprintf('%020d.snap', tonumber(lsn))
         if fio.basename(last_snap) == snap_name then
-            log.debug('%s: snapshot %s is already exists', PREFIX, last_snap)
+            log.debug('snapshot file %s already exists', last_snap)
             return false
         end
 
         local snstat = fio.stat(last_snap)
         if snstat == nil then
-            log.error("%s: Can't stat %s: %s",
-                PREFIX, snaps[#snaps], errno.strerror())
+            log.error("can't stat %s: %s", snaps[#snaps], errno.strerror())
             return false
         end
         if snstat.mtime <= fiber.time() + box.cfg.snapshot_period then
@@ -72,7 +71,8 @@ do
         local snaps = fio.glob(fio.pathjoin(box.cfg.snap_dir, '*.snap'))
 
         if snaps == nil then
-            log.error("%s: Can't read snap_dir: %s", PREFIX, errno.strerror())
+            log.error("can't read snap_dir %s: %s", box.cfg.snap_dir,
+                      errno.strerror())
             return
         end
 
@@ -94,7 +94,8 @@ do
         snaps = fio.glob(fio.pathjoin(box.cfg.snap_dir, '*.snap'))
         local xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog'))
         if xlogs == nil then
-            log.error("%s: Can't read wal_dir: %s", PREFIX, errno.strerror())
+            log.error("can't read wal_dir %s: %s", box.cfg.wal_dir,
+                      errno.strerror())
             return
         end
 
@@ -102,10 +103,10 @@ do
             local rm = snaps[1]
             table.remove(snaps, 1)
 
-            log.info("%s: Removing old snapshot %s", PREFIX, rm)
+            log.info("removing old snapshot %s", rm)
             if not fio.unlink(rm) then
-                log.error("%s: Error while removing %s: %s",
-                    PREFIX, rm, errno.strerror())
+                log.error("error while removing %s: %s",
+                          rm, errno.strerror())
                 return
             end
         end
@@ -129,11 +130,11 @@ do
 
             local rm = xlogs[1]
             table.remove(xlogs, 1)
-            log.info("%s: Removing old xlog %s", PREFIX, rm)
+            log.info("removing old xlog %s", rm)
 
             if not fio.unlink(rm) then
-                log.error("%s: Error while removing %s: %s",
-                    PREFIX, rm, errno.strerror())
+                log.error("error while removing %s: %s",
+                          rm, errno.strerror())
                 return
             end
         end
@@ -179,7 +180,7 @@ do
 
     local function daemon_fiber(self)
         fiber.name(PREFIX)
-        log.info("%s: status: %s", PREFIX, self.status)
+        log.info("%s", self.status)
         while true do
             local interval = next_snap_interval()
             fiber.sleep(interval)
@@ -190,11 +191,11 @@ do
             local s, e = pcall(process)
 
             if not s then
-                log.error("%s: %s", PREFIX, e)
+                log.error(e)
             end
         end
-        log.info("%s: status: %s", PREFIX, self.status)
-        log.info("%s: finished daemon fiber", PREFIX)
+        log.info("%s", self.status)
+        log.info("finished daemon fiber")
     end
 
     setmetatable(daemon, {
@@ -202,8 +203,7 @@ do
             start = function()
                 local daemon = box.internal[PREFIX] or daemon
                 if daemon.status == 'started' then
-                    error(
-                        sprintf("%s: %s", PREFIX, "Daemon is already started"))
+                    error("snapshot daemon has already been started")
                 end
                 daemon.status = 'started'
                 daemon.fiber = fiber.create(daemon_fiber, daemon)
@@ -212,8 +212,7 @@ do
             stop = function()
                 local daemon = box.internal[PREFIX] or daemon
                 if daemon.status == 'stopped' then
-                    error(
-                        sprintf('%s: %s', PREFIX, "Daemon is already stopped"))
+                    error("snapshot daemon has already been stopped")
                 end
                 daemon.status = 'stopped'
                 if daemon.fiber ~= nil then
@@ -224,8 +223,8 @@ do
 
             set_snapshot_period = function(snapshot_period)
                 local daemon = box.internal[PREFIX] or daemon
-                log.info("%s: new snapshot_period: %s", PREFIX,
-                    tostring(snapshot_period))
+                log.info("new snapshot period is %s",
+                         tostring(snapshot_period))
                 if daemon.fiber ~= nil then
                     daemon.fiber:wakeup()
                 end
@@ -234,8 +233,7 @@ do
 
             set_snapshot_count = function(snapshot_count)
                 local daemon = box.internal[PREFIX] or daemon
-                log.info("%s: new snapshot_count: %s",
-                    PREFIX, tostring(snapshot_count))
+                log.info("new snapshot count is %s", tostring(snapshot_count))
 
                 if daemon.fiber ~= nil then
                     daemon.fiber:wakeup()
diff --git a/src/errcode.h b/src/errcode.h
index 86c1def569..26cbd75352 100644
--- a/src/errcode.h
+++ b/src/errcode.h
@@ -132,7 +132,8 @@ enum { TNT_ERRMSG_MAX = 512 };
 	/* 80 */_(ER_NO_ACTIVE_TRANSACTION,	2, "Operation is not permitted when there is no active transaction ") \
 	/* 81 */_(ER_CROSS_ENGINE_TRANSACTION,	2, "A multi-statement transaction can not use multiple storage engines") \
 	/* 82 */_(ER_NO_SUCH_ROLE,		2, "Role '%s' is not found") \
-	/* 46 */_(ER_ROLE_EXISTS,		2, "Role '%s' already exists") \
+	/* 83 */_(ER_ROLE_EXISTS,		2, "Role '%s' already exists") \
+	/* 84 */_(ER_CREATE_ROLE,		2, "Failed to create role '%s': %s") \
 
 /*
  * !IMPORTANT! Please follow instructions at start of the file
diff --git a/src/iproto.cc b/src/iproto.cc
index c4497b74b2..eefc3b7130 100644
--- a/src/iproto.cc
+++ b/src/iproto.cc
@@ -831,6 +831,12 @@ iproto_on_accept(struct evio_service * /* service */, int fd,
 	iproto_queue_push(&request_queue, ireq);
 }
 
+static void on_bind(void *arg __attribute__((unused)))
+{
+	fiber_call(fiber_new("leave_local_hot_standby",
+			     (fiber_func) box_leave_local_standby_mode));
+}
+
 /** Initialize a read-write port. */
 void
 iproto_init(const char *uri)
@@ -843,8 +849,7 @@ iproto_init(const char *uri)
 	evio_service_init(loop(), &primary, "primary",
 			  uri,
 			  iproto_on_accept, NULL);
-	evio_service_on_bind(&primary,
-			     box_leave_local_standby_mode, NULL);
+	evio_service_on_bind(&primary, on_bind, NULL);
 	evio_service_start(&primary);
 
 	mempool_create(&iproto_request_pool, &cord()->slabc,
diff --git a/test/box/misc.result b/test/box/misc.result
index 833adfe903..3b77040316 100644
--- a/test/box/misc.result
+++ b/test/box/misc.result
@@ -193,6 +193,7 @@ t;
   - 'box.error.CREATE_USER : 43'
   - 'box.error.CREATE_SPACE : 9'
   - 'box.error.UNKNOWN_SCHEMA_OBJECT : 49'
+  - 'box.error.CREATE_ROLE : 84'
   - 'box.error.ROLE_EXISTS : 83'
   - 'box.error.NO_SUCH_ROLE : 82'
   - 'box.error.NO_ACTIVE_TRANSACTION : 80'
diff --git a/test/box/session.storage.result b/test/box/session.storage.result
index a292e1b2f2..b10f215b10 100644
--- a/test/box/session.storage.result
+++ b/test/box/session.storage.result
@@ -31,7 +31,7 @@ all = getmetatable(session).aggregate_storage
 ...
 dump(all)
 ---
-- '''[null,null,{"abc":"cde"}]'''
+- '''[null,null,null,{"abc":"cde"}]'''
 ...
 --# create connection second to default
 --# set connection second
-- 
GitLab