diff --git a/changelogs/unreleased/gh-7895-export-session-id-to-c-api.md b/changelogs/unreleased/gh-7895-export-session-id-to-c-api.md new file mode 100644 index 0000000000000000000000000000000000000000..812bce32ac9c3eaebdafc4b38d1c0a26a4c9a155 --- /dev/null +++ b/changelogs/unreleased/gh-7895-export-session-id-to-c-api.md @@ -0,0 +1,3 @@ +## feature/box + +* Exported current session's identifier to C API via `box_session_id` (gh-7895). diff --git a/extra/exports b/extra/exports index 6aa5b3c87d9e9488ce59f606f0afd7eba1e8a5cc..ad930e0cde77bfd1a62c3b6b7a4924bb4c07a582 100644 --- a/extra/exports +++ b/extra/exports @@ -104,6 +104,7 @@ box_sequence_current box_sequence_next box_sequence_reset box_sequence_set +box_session_id box_session_push box_space_id_by_name box_truncate diff --git a/src/box/box.cc b/src/box/box.cc index 59c2c98b872faab83d1f44264810b63486206152..fbeb0f68db2eadbb7d2ae04fe312f48e6231a36b 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -3201,6 +3201,12 @@ box_session_push(const char *data, const char *data_end) return rc; } +API_EXPORT uint64_t +box_session_id(void) +{ + return current_session()->id; +} + static inline void box_register_replica(uint32_t id, const struct tt_uuid *uuid) { diff --git a/src/box/box.h b/src/box/box.h index 33851c8a89e3d24ecabcf46a718695bb3d06e33d..637b7adb072e09012740c747994ce041989df623 100644 --- a/src/box/box.h +++ b/src/box/box.h @@ -599,6 +599,12 @@ box_sequence_reset(uint32_t seq_id); API_EXPORT int box_session_push(const char *data, const char *data_end); +/** + * \return current session's unique monotonic identifier (\sa box.session.id) + */ +API_EXPORT uint64_t +box_session_id(void); + /** \endcond public */ /** diff --git a/src/box/lua/session.c b/src/box/lua/session.c index b6c77205f7f5c46eca35abd529b7e561f5de725b..23581ef3281d8947bb2bd4bd63dd17e19702f5f7 100644 --- a/src/box/lua/session.c +++ b/src/box/lua/session.c @@ -73,17 +73,12 @@ lbox_session_create(struct lua_State *L) } /** - * Return a unique monotonic session - * identifier. The identifier can be used - * to check whether or not a session is alive. - * 0 means there is no session (e.g. - * a procedure is running in a detached - * fiber). + * Lua wrapper for `box_session_id`. */ static int lbox_session_id(struct lua_State *L) { - lua_pushnumber(L, current_session()->id); + luaL_pushuint64(L, box_session_id()); return 1; } diff --git a/test/app-tap/module_api.c b/test/app-tap/module_api.c index d6933095ed5cdb9f71b50c439ad9ce918c419e84..1784efed9b4c2af2e6139a429d5c8b392c9f339d 100644 --- a/test/app-tap/module_api.c +++ b/test/app-tap/module_api.c @@ -2994,6 +2994,19 @@ test_box_schema_version(struct lua_State *L) /* }}} Helpers for schema version Lua/C API test cases */ +/* {{{ Helpers for current session identifier Lua/C API test cases */ + +static int +test_box_session_id(struct lua_State *L) +{ + fail_unless(lua_gettop(L) == 1); + fail_unless(lua_isnumber(L, 1)); + lua_pushboolean(L, luaL_touint64(L, 1) == box_session_id()); + return 1; +} + +/* }}} Helpers for current session identifier Lua/C API test cases */ + LUA_API int luaopen_module_api(lua_State *L) { @@ -3045,6 +3058,7 @@ luaopen_module_api(lua_State *L) {"isdecimal", test_isdecimal}, {"isdecimal_ptr", test_isdecimal_ptr}, {"box_schema_version_matches", test_box_schema_version}, + {"box_session_id_matches", test_box_session_id}, {NULL, NULL} }; luaL_register(L, "module_api", lib); diff --git a/test/app-tap/module_api.test.lua b/test/app-tap/module_api.test.lua index 6277d86b61c5686b8f3737c2d4335ca8979b75b0..2831a8b3d49859906b1ab7da90e07ba6c2837158 100755 --- a/test/app-tap/module_api.test.lua +++ b/test/app-tap/module_api.test.lua @@ -488,8 +488,16 @@ local function test_box_schema_version_matches(test, module) s:drop() end +local function test_box_session_id_matches(test, module) + test:plan(1) + + test:ok(module.box_session_id_matches(box.session.id()), + 'verify that Lua/C current session identifier APIs return the ' .. + 'same value') +end + require('tap').test("module_api", function(test) - test:plan(44) + test:plan(45) local status, module = pcall(require, 'module_api') test:is(status, true, "module") test:ok(status, "module is loaded") @@ -522,6 +530,7 @@ require('tap').test("module_api", function(test) test:test("pushdecimal", test_pushdecimal, module) test:test("isdecimal", test_isdecimal, module) test:test("box_schema_version_matches", test_box_schema_version_matches, module) + test:test("box_session_id_matches", test_box_session_id_matches, module) space:drop() end)