From a23f402236039006872e30f0d813e2b7b46dad0e Mon Sep 17 00:00:00 2001
From: Georgiy Lebedev <g.lebedev@tarantool.org>
Date: Wed, 8 Feb 2023 16:57:52 +0300
Subject: [PATCH] box: refactor `check_select_safety` and add it to
 `box.internal`

Refactor logging of dangerous `select` call out of `check_select_safety`
and add it to `box.internal` so that it can be reused for read views.

Change all occurrences of 'dangerous' to 'long' to be consistent with the
log message.

Needed for tarantool/tarantool-ee#211

NO_CHANGELOG=<refactoring>
NO_DOC=<refactoring>
NO_TEST=<refactoring>

(cherry picked from commit 4221a983ffea263eb38339a0a796b5737c974fc5)
---
 src/box/lua/schema.lua | 38 +++++++++++++++++++++++++-------------
 1 file changed, 25 insertions(+), 13 deletions(-)

diff --git a/src/box/lua/schema.lua b/src/box/lua/schema.lua
index 59acea5c83..0f9bd6b5c4 100644
--- a/src/box/lua/schema.lua
+++ b/src/box/lua/schema.lua
@@ -2488,18 +2488,22 @@ end
 
 box.internal.check_select_opts = check_select_opts -- for net.box
 
-local check_select_safety_rl = log.internal.ratelimit.new()
-local function check_select_safety(index, key_is_nil, itype, limit, offset,
+local function is_select_long(sid, key_is_nil, itype, limit, offset,
                                    fullscan)
-    local rl = check_select_safety_rl
-    local sid = index.space_id
     local point_iter = itype == box.index.EQ or itype == box.index.REQ
     local window = offset + limit
-    if sid >= 512 and (key_is_nil or not point_iter) and
-       (not fullscan and window > 1000) then
-        rl:log_crit("Potentially long select from space '%s' (%d)\n %s",
-                    box.space[sid].name, sid, debug.traceback())
-    end
+    return sid >= 512 and
+           (key_is_nil or not point_iter) and
+           (not fullscan and window > 1000)
+end
+
+box.internal.is_select_long = is_select_long -- for read views
+
+local log_long_select_rl = log.internal.ratelimit.new()
+local function log_long_select(space)
+    log_long_select_rl:log_crit(
+        "Potentially long select from space '%s' (%d)\n %s",
+        space.name, space.id, debug.traceback())
 end
 
 base_index_mt.select_ffi = function(index, key, opts)
@@ -2514,10 +2518,14 @@ base_index_mt.select_ffi = function(index, key, opts)
     local new_position = nil
     local iterator, offset, limit, fullscan, after, fetch_pos =
         check_select_opts(opts, key_is_nil)
-    check_select_safety(index, key_is_nil, iterator, limit, offset, fullscan)
+    local sid = index.space_id
+    if is_select_long(sid, key_is_nil, iterator, limit, offset,
+                      fullscan) then
+        log_long_select(box.space[sid])
+    end
     local region_svp = builtin.box_region_used()
     normalize_position(index, after, iterator_pos, iterator_pos_end)
-    nok = builtin.box_select_ffi(index.space_id, index.id, key, key_end,
+    nok = builtin.box_select_ffi(sid, index.id, key, key_end,
                                  iterator_pos, iterator_pos_end, fetch_pos,
                                  port, iterator, offset, limit) ~= 0
     if not nok and fetch_pos and iterator_pos[0] ~= nil then
@@ -2549,8 +2557,12 @@ base_index_mt.select_luac = function(index, key, opts)
     local key_is_nil = #key == 0
     local iterator, offset, limit, fullscan, after, fetch_pos =
         check_select_opts(opts, key_is_nil)
-    check_select_safety(index, key_is_nil, iterator, limit, offset, fullscan)
-    return internal.select(index.space_id, index.id, iterator,
+    local sid = index.space_id
+    if is_select_long(sid, key_is_nil, iterator, limit, offset,
+                      fullscan) then
+        log_long_select(box.space[sid])
+    end
+    return internal.select(sid, index.id, iterator,
         offset, limit, key, after, fetch_pos)
 end
 
-- 
GitLab