- Jan 30, 2023
-
-
Alexander Turenko authored
There are modules that are implemented as two parts: a Lua/C module for internal use and a public module written on Lua. There is a practice to name both parts the same: just capture the internal part within the public part and rewrite `package.loaded` then. This name overlap is confusing at reading the sources and complicates debugging. And it conflicts with a built-in module loading logic that will be implemented for #7774. Let's use `foo.lib` for the internal part and `foo` for the public one. This approach is already used in some built-in modules. src/box/lua/upgrade.lua requires src/box/lua/xlog.lua, so changed the loading order. Eliminated extra `internal` field in `uri.lib`, because the whole module is internal. Part of #7774 NO_DOC=user visible behavior is unchanged, pure refactoring change NO_TEST=see NO_DOC NO_CHANGELOG=see NO_DOC
-
Alexander Turenko authored
The idea of the refactoring is described in a previous commit. The change is straightforward: * Use `luaL_findtable()` to find/create a nested table in `_G`. * Use `luaL_setfuncs()` to assign functions to a table. * Use `luaT_newmodule()` to register a module for `require()`. `require('box.internal.<...>')` calls are replaced with `box.internal.<...>`, because `box` submodules are not registered as modules anymore (IOW, are not placed into `package.loaded`). However `_G.box == require('box')`, it remains unchanged. One may wonder why fourth argument of `luaL_findtable()` (size hint for the hash part of the table) is always zero in the added calls. It is an effect of the following points: * Those calls are not on hot paths and, moreover, there is no sense to use `luaL_findtable()` with a string literal as the second argument on a hot path (no sense to parse the string literal in runtime if a performance is the goal). * Using `lengthof()` macro would add more code to read for a human (the argument itself, a line carry to fit 80 symbols, an inclusion of trivia/util.h) at no gain. * A hardcoded array length is a developer's stress factor: it looks like it requires an update at a change of the array. So zero is better. Part of #7774 NO_DOC=user visible behavior is unchanged, pure refactoring change NO_TEST=see NO_DOC NO_CHANGELOG=see NO_DOC
-
Alexander Turenko authored
See the previous commit regarding the idea behind this refactoring. The src/box/lua part is updated in a next commit, only `src/lua` is updated here. It is split to ease reading. The patch is mostly straightforward, I'll highlight several interesting places. * `compat` `_G.internal.compat` was created by `luaL_register()`. Removing of this call drops `_G.internal`: it is not created anymore. * `fiber.channel` and `fiber.cond` The initialization code add fields into fiber module. So we call `require('fiber')` here. The alternative is to access `package.loaded.fiber` directly, however I plan to eliminate such accesses in further patches. (Built-in modules registration process will use its own table instead of `package.loaded`.) * `http.client` Here we also eliminate a direct access to `package.loaded`, which is important for implementing #7774. Dropping of the `package.loaded['http.client']` field in unnecessary, because it is anyway replaced by the resulting module table in `tarantool_lua_init()`. * `utf8` This module is also set to `_G.utf8` for compatibility with Lua 5.3. It remains unchanged. Part of #7774 NO_DOC=user visible behavior is unchanged, pure refactoring change NO_TEST=see NO_DOC NO_CHANGELOG=see NO_DOC
-
Alexander Turenko authored
This commit starts a series, which refactors built-in module registration mechanisms. The series aims several goals: * Offer a standard tarantool specific way to register a built-in module. It allows to change the registration process for all built-in modules at once. * Make the API of such functions simple and clean. * Eliminate known problems of the existing approach to register built-in modules. This particular commit offers the new `luaT_newmodule()` function. It replaces `luaL_register()` and `luaL_register_module()` to some extent. Here I also start a practice to use `luaL_setfuncs()` instead of `luaL_register(L, NULL, funcs)` for readability purposes. The function is part of Lua 5.2 ([documentation][1]), but it is implemented in LuaJIT. Let's look on examples below. ## How it works now First of all, consider the [documentation][2] about the `luaL_register()` function. Then look on the examples. ```c luaL_register(L, "foo.bar", funcs); ``` Creates a table `package.loaded['foo.bar']` and `_G.foo.bar` (if neither of them exists), fill it with the functions and pushes it to the stack. What is not ok: * Pollutes `_G`. * `package.loaded` is written flat, but `_G` is written deeply. * No control over (un)intended module rewritting. It also worth to note that we can't change this function, because it is part of the Lua API. So we need another function for our registration process in order to implement #7774. Another usage of the function makes it even more confusing: ```c luaL_register(L, NULL, funcs); ``` Does it create a table, fill it with the functions and push it to the stack? No. Unlike other usages, it fills a table on the top of the stack with the functions and leaves it on the stack. And it actually has no relation to module registration. There is tarantool specific function `luaL_register_module()`, which looks as an attempt to solve some of the problems. ```c luaL_register_module(L, "foo.bar", funcs); ``` It doesn't touch `_G` and, surprisingly, changes how a module is written to `package.loaded`. The call creates a table (or finds it) in `package.loaded.foo.bar`, fills it with the functions and pushes to the stack. *This* function writes `package.loaded` deeply. It leaves us with `luaL_register()` for assigning `_G.foo.bar` (with pollution of `package.loaded`). It leaves us with `luaL_register()` for setting functions into a table on the stack (with confusing name in this context and confusing contract). And we has no a function to just assign `package.loaded[modname]` without the deep tables creation and with appropriate checks. ## How it will work ```c luaT_newmodule(L, "foo.bar", funcs); ``` Create a table, set it to `package.loaded['foo.bar']` and push into the stack. Assert that the table doesn't exist. ```c luaL_setfuncs(L, funcs, 0); ``` Add functions into a table on top of the stack. ```c luaL_findtable(L, LUA_GLOBALSINDEX, "foo.bar", 0); luaL_setfuncs(L, funcs, 0); ``` Find/create a table `_G.foo.bar` and add functions to it. Next commits will adopt built-in modules to follow this practice. [1]: https://www.lua.org/manual/5.2/manual.html#luaL_setfuncs [2]: https://www.lua.org/manual/5.1/manual.html#luaL_register Part of #7774 NO_DOC=user visible behavior is unchanged, pure refactoring change NO_TEST=see NO_DOC NO_CHANGELOG=see NO_DOC
-
Yaroslav Lobankov authored
Generate a test build key when the ALPINE_BUILD_KEY secret is empty. It is needed for fork PRs where secrets are unavailable. NO_DOC=ci NO_TEST=ci NO_CHANGELOG=ci
-
Georgiy Lebedev authored
Since applied transactions are committed asynchronously, they are inherently 'read committed', hence their isolation level should be adjusted accordingly. Closes #8121 NO_DOC=bugfix
-
Ilya Verbin authored
XLOG_READ_AHEAD defines the number of bytes added to the `count' argument of the `pread' syscall, currently it equals to 16 KB. However xlog and snap files are written by 128 KB chunks of data, which turn into ~80 KB chunks after compression (in average, depending on the data), so the 16 KB read- ahead doesn't make any sense. According to performance experiments, 8 MB readahead gives the best results for large files. However, 8 MB read buffers would increase memory consumption of the replication relays, which usually read small portions of data and does not need such a big buffers. For this reason, dynamically- sized read buffer is implemented by this patch. The minimal readahead is now 128 KB, and the maximal is 8 MB. As a result, the recovery time of a 900 MB snapshot decreased from 25 sec to 13 sec (when reading from HDD). Performance of a recovery from SSD is not affected. Closes #8108 NO_DOC=performance improvement NO_TEST=performance improvement
-
Andrey Saranchin authored
Recently, ffi select was broken on M1 in commit ec1a71ff ("box: introduce pagination to memtx_tree and tuple position methods"). It turned out that ffi on M1 poorly supports a big quantity of arguments. Fortunately, there is a workaround - we can pass only 64-bit integer arguments beyond the 8th argument. Let's do it. Closes #7946 NO_TEST=reflected in existing tests NO_CHANGELOG=bugfix for unreleased feature NO_DOC=bugfix
-
- Jan 27, 2023
-
-
Vladimir Davydov authored
The transaction isolation level used by Tarantool by default is 'best-effort' so adding support of transaction isolation levels to Vinyl effectively switched the isolation level used by Vinyl transactions from 'read-committed' to 'best-effort', which potentially may cause more conflicts. Let's mention it in the changelog and mark this change as breaking. Follow-up commit 588170a7 ("vinyl: implement transaction isolation levels") Follow-up #5522 NO_DOC=changelog NO_TEST=changelog
-
- Jan 26, 2023
-
-
Oleg Chaplashkin authored
Changed the work with hooks in the part of tests. Legacy approach: ``` g.before_all = function() ... end g.after_all = function() ... end ``` The logic of executing hooks will be expected and more controlled if use following approach: ``` g.before_all(function() ... end) g.after_all(function() ... end) ``` Resolve #8066 NO_DOC=test fix NO_TEST=test fix NO_CHANGELOG=test fix
-
Ilya Verbin authored
This reverts commit 38f88795. That checking is too tight and may break the code, that is successfully working on the non-upgraded schema. Let's postpone the fix to 3.0. Follow-up #7149 NO_DOC=revert of the unreleased bugfix
-
Nikolay Shirokovskiy authored
The change can only breaks users that were not follow the documented usage pattern. The documented pattern is to allocate and then truncate you allocations. Follow-up #5665 NO_DOC=changelog fix NO_TEST=changelog fix
-
Sergey Vorontsov authored
Add building Alpine 3.16 packages for amd64 and aarch64. Part of tarantool/tarantool-qa#266 NO_DOC=ci NO_TEST=ci
-
Sergey Vorontsov authored
* Update build-time and run-time dependencies. * Support build with gc64 enabled. * Disable sysprof due to the following error while building: NO_WRAP ``` <...>/third_party/luajit/src/lj_sysprof.c:29:10: fatal error: execinfo.h: No such file or directory 29 | #include <execinfo.h> | ``` NO_WRAP * Update .pack.mk to set package version in the case of a git tag to the following format: 2.11.0[_<release type>] Where `<release type>` is `alpha1`, `beta1`, `rc1`, etc. Note, we have an extra logic when the git tag is `x.x.x-entrypoint`. Alpine build system doesn't support package name with such kind of version and that's why we use `alpha0` instead of `entrypoint`. See for details [1]. * Update .pack.mk to set package version in the other cases to the following format: 2.11.0_<release type>_p<N> Where `<release type>` is `alpha1`, `beta1`, `rc1`, etc and `<N>` is the patch number after the latest release. Unfortunately, we cannot use the similar version pattern that we use for dev DEB/RPM packages (`2.11.0_<release type>.<N>.dev`) because Alpine build system doesn't support it. Plus, we have the same logic for `entrypoint` here. See for details [1]. [1] https://wiki.alpinelinux.org/wiki/APKBUILD_Reference#pkgver Part of tarantool/tarantool-qa#266 NO_DOC=ci NO_TEST=ci NO_CHANGELOG=ci
-
Serge Petrenko authored
test_promote_no_quorum testcase in election_pre_vote test started flaky hanging after commit 5765fdc4 ("raft: fix 'manual' nodes bumping the term excessively"). Disable it until the issue (#8217) is resolved. In-scope-of #8217 NO_DOC=tests NO_CHANGELOG=tests
-
Pavel Semyonov authored
Remove issues released in 2.10.* from the master's unreleased list. This change leaves only issues that form the diff between the latest released version 2.10.4 and the upcoming 2.11-RC (which is the correct 2.11-RC changelog by definition). NO_CHANGELOG=changelog NO_DOC=changelog NO_TEST=changelog
-
Sergey Ostanevich authored
Promotion of a leader in the test requires previous leader state arrived to all replicas. Inconsistency may lead to promotion failure, which is correct from the raft point of view, but not expected by the test. Closes #7785 NO_DOC=test NO_CHANGELOG=test
-
- Jan 25, 2023
-
-
Alexander Turenko authored
See #4691 for the problem description. In brief: before the fix net.box expected _vcollation presence if tarantool's runtime on the server is new enough disregarding a server's schema version. The old schema version has no this view, so net.box was unable to connect. After #4691 net.box tolerates lack of the view. The fix was pushed without a test (see [1]) and now I want to pay this debt. [1]: https://lists.tarantool.org/pipermail/tarantool-patches/2020-April/016207.html Follows up #4307 Follows up #4691 Fixes #5482 NO_DOC=just a new test NO_CHANGELOG=see NO_DOC
-
Ilya Verbin authored
It was removed in the commit 390311bb ("fiber: get rid of cpu_misses in fiber.top()"). Return it back in order to avoid potential breaking changes. Follow-up #5869 NO_DOC=tarantool/doc#2989
-
Ilya Verbin authored
Remove the "breaking change" mark, as it's highly unlikely that it will break any log parser. Follow-up #3211 NO_DOC=changelog NO_TEST=changelog
-
Ilya Verbin authored
Remove the "breaking change" mark, as it's highly unlikely that it will break anything. Follow-up #7166 NO_DOC=tarantool/doc#3132 NO_TEST=changelog
-
Nikolay Shirokovskiy authored
Flight recorder uses mmapped file for performance reasons. Unfortunately if for some reason mapping is not possible we got SIGBUS on accessing mmapped memory. We already handle this issue on flight recorder start in [1]. But if we got SIGBUS in the meanwhile we currently got a crash. Let's just panic. [1] https://github.com/tarantool/tarantool-ee/commit/e68b84768f3ae76aa9f03d36dd6f0587b884e1bb CE Part of https://github.com/tarantool/tarantool-ee/issues/198 NO_DOC=stub for EE part NO_CHANGELOG=stub for EE part NO_TEST=tested in EE part
-
Nikolay Shirokovskiy authored
Currently crash has code to report crashes to feedback URL. It does not belong to core. Also it brings dependencies from box to core with INSTANCE_UUID and REPLICASET_UUID variables. So let's move this part back to box. NO_DOC=refactoring NO_TEST=refactoring NO_CHANGELOG=refactoring
-
Nikolay Shirokovskiy authored
Currently we keep nanoseconds but do not use them and as a result we have unneeded scaling. Let's use second precision which is on par with our need. Also drop ns_to_localtime. It can be written much shorter and it feels like we don't need distinct function here. Like when we formatting time in say.c. NO_TEST=refactoring NO_DOC=refactoring NO_CHANGELOG=refactoring
-
Mikhail Elhimov authored
1. Add pretty-printer for 'rlist' type Script holds table of possible rlists in tarantool. It recognizes automatically actual type of entries and either expression refers to a single items or to entire list. Then either single entry is displayed (along with its index in the list) or the entire list (entry-by-entry). 2. Add command 'tt-list' that use the mentioned pretty-printer and provide additional functionality, namely: - walking over the list (both directions) - filter entries with predicate - allow to explicitly specify list head and actual entry type if automatic recognition doesn't work See 'help tt-list' for details. Close #7731 NO_DOC=gdb extension NO_CHANGELOG=gdb extension NO_TEST=gdb extension
-
Serge Petrenko authored
Currently all ballot_watcher fibers for different appliers have identical names: "applier_ballot_watcher". It's hard to distinguish them in logs and to know which ballot_watcher belongs to which applier, and that complicates debugging quite a bit. Let's fix this and name the fibers properly. With master's uri at the end. NO_DOC=no behaviour changed NO_CHANGELOG=no behaviour changed NO_TEST=doesn't need one
-
Serge Petrenko authored
Add is_joinable parameter to applier_fiber_new. For now all usages of the function pass true, but the next commit will create a non-joinable applier fiber. NO_DOC=refactoring NO_TEST=refactoring NO_CHANGELOG=refactoring
-
Mergen Imeev authored
Some of the SQL modules have not been used for a long time. This patch drops these modules. NO_DOC=refactoring NO_TEST=refactoring NO_CHANGELOG=refactoring
-
- Jan 24, 2023
-
-
Serge Petrenko authored
A node configured in 'manual' mode and promoted by `box.ctl.promote()` stays in is_candidate state for the whole term, even though it is not is_cfg_candidate. If such a node is the first one to notice leader death or to hit the election timeout, it bumps the term excessively, then immediately becomes a mere follower, because its is_candidate is reset with is_cfg_candidate. This extra term bump (one term after the node was actually promoted) is unnecessary and might lead to strange errors: tarantool> box.ctl.promote() --- - error: 'The term is outdated: old - 3, new - 4' ... Fix this by checking if a node is configured as a candidate before trying to start new elections. Closes #8168 NO_DOC=bugfix
-
Serge Petrenko authored
There is a false assertion in raft_stop_candidate(): it assumes that the node must always have a running timer whenever it sees the leader. This is not true when the node is busy writing the new term on disk. Cover the mentioned case in the assertion. Closes #8169 NO_DOC=bugfix Co-authored-by:
Sergey Ostanevich <sergos@tarantool.org>
-
Sergey Bronnikov authored
Commit 2be74a65 ("test/cmake: add a function for generating unit test targets") added a function for generating unit test targets in CMake. This function makes code simpler and less error-prone. Proposed patch adds a similar function for generating performance test targets in CMake. NO_CHANGELOG=build infrastructure updated NO_DOC=build infrastructure updated NO_TEST=build infrastructure updated
-
Sergey Bronnikov authored
Commit 2be74a65 ("test/cmake: add a function for generating unit test targets") added a function for generating unit test targets in CMake. This function makes code simpler and less error-prone. Proposed patch adds a similar function for generating fuzzing test targets in CMake. NO_CHANGELOG=build infrastructure updated NO_DOC=build infrastructure updated NO_TEST=build infrastructure updated
-
Sergey Bronnikov authored
Commit 2be74a65 ("test/cmake: add a function for generating unit test targets") added a function for generating unit test targets in CMake. However, due to a wrong scope UNIT_TEST_TARGETS remains empty after generating unit tests. Patch fixes that. NO_CHANGELOG=build infrastructure NO_DOC=build infrastructure NO_TEST=build infrastructure
-
Vladimir Davydov authored
We define flight_recorder_cfg struct, box_get_flightrec_cfg function, and box.internal.cfg_configure_flightrec Lua function in the CE repository although they are actually needed only in the EE repository. Let's drop them all from the CE repository and instead define stub functions box_check_flightrec and box_set_flightrec that would check/apply box.cfg flight recorder parameters. While we are at it, add missing comments to flightrec function stubs. NO_DOC=refactoring NO_TEST=refactoring NO_CHANGELOG=refactoring
-
Yaroslav Lobankov authored
The approach - name: Set output run: echo "::set-output name={name}::{value}" is deprecated [1]. Switching to the new approach: - name: Set output run: echo "{name}={value}" >> $GITHUB_OUTPUT [1] https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ NO_DOC=ci NO_TEST=ci NO_CHANGELOG=ci
-
Serge Petrenko authored
The title is pretty self-explanatory. That's all this commit does. Now a couple of words on why this is needed. Commit 2a0c4f2b ("replication: make replica subscribe to master's ballot") changed replica connect behaviour: instead of holding a single connection to the master, replica may have two: master's ballot retrieval is now performed in a separate connection owned by a separate fiber called ballot_watcher. First connection to master is initialized as always and then applier fiber creates the ballot_watcher, which connects to the same address on its own. This lead to some unexpected consequences: random cartridge integration tests started failing with the following error: tarantool/tarantool/cartridge/test-helpers/cluster.lua:209: "localhost:13303": Replication setup failed, instance orphaned Here's what happened. Cartridge has a module named remote control. The module mimics a tarantool server and "listens" on the same socket the tarantool is intended to listen before box.cfg{listen=...} is called. For example one can see such output in tarantool logs with cartridge: NO_WRAP 13:07:43.210 [10265] main/132/applier/admin@localhost:13301 I> remote master 46a71a25-4328-4a41-985d-d93d6ed7fb7f at 127.0.0.1:13301 running Tarantool 2.11.0 13:07:43.210 [10265] main/133/applier/admin@localhost:13302 I> remote master 00000000-0000-0000-0000-000000000000 at 127.0.0.1:13302 running Tarantool 1.10.0 13:07:43.210 [10265] main/134/applier/admin@localhost:13303 I> remote master bcce45ad-38b7-4d8a-936a-133614a7775f at 127.0.0.1:13303 running Tarantool 2.11.0 NO_WRAP The second "Tarantool" in the output (with zero instance uuid and running Tarantool 1.10.0) is the remote control on an unconfigured tarantool instance. Before splitting applier connection in two, this was no problem: applier would try to get the instance's ballot from a remote control listener and fail (remote control doesn't answer to replication requests). Applier would retry connecting to the same address until it got a reply, meaning that remote control is stopped and real tarantool became listening on the socket. Now applier has two connections, and the following situation became possible: when applier connection is initialized, remote control is still working, and applier is connected to the remote control instance. Applier performs ballot receipt in a separate fiber, which's not yet initialized, so no errors are raised. As soon as applier creates the ballot watcher, remote control is stopped and the real tarantool starts listening on the socket. This means that no error happens in the ballot watcher as well (normal tarantool answers to replication requests, of course). And we get to an unhandled situation when applier itself is connected to (already dead) remote control instance, while its ballot watcher is connected to the real tarantool. As soon as applier sees the ballot is fetched, it continues connection process to the already dead remote control instance and gets an error: NO_WRAP 13:07:44.214 [10265] main/133/applier/admin@localhost:13302 I> failed to authenticate 13:07:44.214 [10265] main/133/applier/admin@localhost:13302 coio.c:326 E> SocketError: unexpected EOF when reading from socket, called on fd 1620, aka 127.0.0.1:54150: Broken pipe 13:07:44.214 [10265] main/133/applier/admin@localhost:13302 I> will retry every 1.00 second 13:07:44.214 [10265] main/115/remote_control/127.0.0.1:50242 C> failed to synchronize with 1 out of 3 replicas 13:07:44.214 [10265] main/115/remote_control/127.0.0.1:50242 I> entering orphan mode NO_WRAP Follow-up #5272 Closes #8185 NO_CHANGELOG=not user-visible NO_DOC=not user-visible (can't create Tarantool with zero uuid)
-
- Jan 23, 2023
-
-
Georgiy Lebedev authored
When we rollback a prepared statement that deletes an MVCC story, we need to reset the deleted story's PSN. Closes #7930 NO_DOC=bugfix
-
Georgiy Lebedev authored
During transaction rollback, we unconditionally assign a PSN to it: we should do this only when necessary, i.e., a transaction is RW and is not already prepared. Needed for #7930 NO_CHANGELOG=refactoring NO_DOC=refactoring NO_TEST=refactoring
-
Georgiy Lebedev authored
Currently, if transaction preparation fails, the transaction is left in an inconsistent state: it has a PSN assigned to it, but its status is not 'prepared' — fix this by resetting its PSN. Needed for #7930 NO_CHANGELOG=refactoring NO_DOC=refactoring NO_TEST=refactoring
-
Georgiy Lebedev authored
During preparation of insert statements in MVCC, we define an old story and abort all transactions that delete this story. If there exists an older story in the history chain, but the story is deleted by a prepared (not necessarily committed) transaction, we consider that it de-facto does not exist anymore — this logic is consistent, since during preparation of the transaction deleting this story, the conflict resolution described above was already done. In this manner, there can be no more than one prepared statement deleting a story at any point in time. Closes #8104 NO_DOC=bugfix
-