diff options
author | kungasc <kungasc@yandex-team.com> | 2023-08-04 15:33:39 +0300 |
---|---|---|
committer | kungasc <kungasc@yandex-team.com> | 2023-08-04 17:19:07 +0300 |
commit | 785ff1c83930efca1ebcf3d6bf84dae8a827519e (patch) | |
tree | 997e3ae63c12e8cb2faa94136374cac3b5c80aa0 | |
parent | 92852774c420fb2e2ba405ac9dd31dee8b4018df (diff) | |
download | ydb-785ff1c83930efca1ebcf3d6bf84dae8a827519e.tar.gz |
Shrink to fit compressed redo log
-rw-r--r-- | ydb/core/tablet_flat/flat_executor_txloglogic.cpp | 4 | ||||
-rw-r--r-- | ydb/core/tablet_flat/ut_util/CMakeLists.darwin-x86_64.txt | 1 | ||||
-rw-r--r-- | ydb/core/tablet_flat/ut_util/CMakeLists.linux-aarch64.txt | 1 | ||||
-rw-r--r-- | ydb/core/tablet_flat/ut_util/CMakeLists.linux-x86_64.txt | 1 | ||||
-rw-r--r-- | ydb/core/tablet_flat/ut_util/CMakeLists.windows-x86_64.txt | 1 | ||||
-rw-r--r-- | ydb/core/tablet_flat/ut_util/ya.make | 1 | ||||
-rw-r--r-- | ydb/core/tablet_flat/util_string.h | 14 | ||||
-rw-r--r-- | ydb/core/tablet_flat/util_string_ut.cpp | 32 |
8 files changed, 55 insertions, 0 deletions
diff --git a/ydb/core/tablet_flat/flat_executor_txloglogic.cpp b/ydb/core/tablet_flat/flat_executor_txloglogic.cpp index d5197d8466d..2e1973b229f 100644 --- a/ydb/core/tablet_flat/flat_executor_txloglogic.cpp +++ b/ydb/core/tablet_flat/flat_executor_txloglogic.cpp @@ -7,6 +7,7 @@ #include "logic_redo_entry.h" #include "logic_redo_queue.h" #include "probes.h" +#include "util_string.h" #include <ydb/core/tablet_flat/flat_executor.pb.h> #include <util/system/sanitizers.h> @@ -207,6 +208,9 @@ void TLogicRedo::MakeLogEntry(TLogCommit &commit, TString redo, TArrayRef<const Counters->Cumulative()[TMonCo::LOG_REDO_WRITTEN].Increment(coded.size()); if (embed && coded.size() <= MaxSizeToEmbedInLog) { + // Note: Encode reserves MaxCompressedLength bytes + NUtil::ShrinkToFit(coded); + commit.Embedded = std::move(coded); Queue->Push({ Cookies->Gen, commit.Step }, affects, commit.Embedded); } else { diff --git a/ydb/core/tablet_flat/ut_util/CMakeLists.darwin-x86_64.txt b/ydb/core/tablet_flat/ut_util/CMakeLists.darwin-x86_64.txt index 56f770b9f18..ef00170d4bf 100644 --- a/ydb/core/tablet_flat/ut_util/CMakeLists.darwin-x86_64.txt +++ b/ydb/core/tablet_flat/ut_util/CMakeLists.darwin-x86_64.txt @@ -27,6 +27,7 @@ target_link_options(ydb-core-tablet_flat-ut_util PRIVATE ) target_sources(ydb-core-tablet_flat-ut_util PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/tablet_flat/util_pool_ut.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/tablet_flat/util_string_ut.cpp ) set_property( TARGET diff --git a/ydb/core/tablet_flat/ut_util/CMakeLists.linux-aarch64.txt b/ydb/core/tablet_flat/ut_util/CMakeLists.linux-aarch64.txt index 0a4c093f79e..1db598c5ea4 100644 --- a/ydb/core/tablet_flat/ut_util/CMakeLists.linux-aarch64.txt +++ b/ydb/core/tablet_flat/ut_util/CMakeLists.linux-aarch64.txt @@ -30,6 +30,7 @@ target_link_options(ydb-core-tablet_flat-ut_util PRIVATE ) target_sources(ydb-core-tablet_flat-ut_util PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/tablet_flat/util_pool_ut.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/tablet_flat/util_string_ut.cpp ) set_property( TARGET diff --git a/ydb/core/tablet_flat/ut_util/CMakeLists.linux-x86_64.txt b/ydb/core/tablet_flat/ut_util/CMakeLists.linux-x86_64.txt index 07e40c35d5d..71b81b4ee60 100644 --- a/ydb/core/tablet_flat/ut_util/CMakeLists.linux-x86_64.txt +++ b/ydb/core/tablet_flat/ut_util/CMakeLists.linux-x86_64.txt @@ -31,6 +31,7 @@ target_link_options(ydb-core-tablet_flat-ut_util PRIVATE ) target_sources(ydb-core-tablet_flat-ut_util PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/tablet_flat/util_pool_ut.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/tablet_flat/util_string_ut.cpp ) set_property( TARGET diff --git a/ydb/core/tablet_flat/ut_util/CMakeLists.windows-x86_64.txt b/ydb/core/tablet_flat/ut_util/CMakeLists.windows-x86_64.txt index 71591f2c8d5..3865b70295f 100644 --- a/ydb/core/tablet_flat/ut_util/CMakeLists.windows-x86_64.txt +++ b/ydb/core/tablet_flat/ut_util/CMakeLists.windows-x86_64.txt @@ -20,6 +20,7 @@ target_link_libraries(ydb-core-tablet_flat-ut_util PUBLIC ) target_sources(ydb-core-tablet_flat-ut_util PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/tablet_flat/util_pool_ut.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/tablet_flat/util_string_ut.cpp ) set_property( TARGET diff --git a/ydb/core/tablet_flat/ut_util/ya.make b/ydb/core/tablet_flat/ut_util/ya.make index c06ae56fd2b..36aa1a0273d 100644 --- a/ydb/core/tablet_flat/ut_util/ya.make +++ b/ydb/core/tablet_flat/ut_util/ya.make @@ -5,6 +5,7 @@ SIZE(MEDIUM) SRCS( util_pool_ut.cpp + util_string_ut.cpp ) END() diff --git a/ydb/core/tablet_flat/util_string.h b/ydb/core/tablet_flat/util_string.h new file mode 100644 index 00000000000..ceb618abf5f --- /dev/null +++ b/ydb/core/tablet_flat/util_string.h @@ -0,0 +1,14 @@ +#pragma once + +#include "defs.h" + +namespace NKikimr::NUtil { + +inline void ShrinkToFit(TString& input) { + // capacity / size > 1.5 + if (input.capacity() * 2 > input.size() * 3) { + input = input.copy(); + } +} + +} diff --git a/ydb/core/tablet_flat/util_string_ut.cpp b/ydb/core/tablet_flat/util_string_ut.cpp new file mode 100644 index 00000000000..c26c60e34a4 --- /dev/null +++ b/ydb/core/tablet_flat/util_string_ut.cpp @@ -0,0 +1,32 @@ +#include <library/cpp/testing/unittest/registar.h> +#include "util_string.h" + +namespace NKikimr::NUtil { + +Y_UNIT_TEST_SUITE(UtilString) { + Y_UNIT_TEST(ShrinkToFit) { + { // don't shrink if not much changes + TString s; + s.reserve(150); + s += std::string(120, 'x'); + auto before = s.data(); + ShrinkToFit(s); + UNIT_ASSERT_GE(s.capacity(), 150); + UNIT_ASSERT_VALUES_EQUAL((size_t)s.data(), (size_t)before); + } + + { // shrink if much changes + TString s, copy; + s.reserve(150); + s += std::string(80, 'x'); + copy = s.copy(); + auto before = s.data(); + ShrinkToFit(s); + UNIT_ASSERT_LE(s.capacity(), 100); + UNIT_ASSERT_VALUES_UNEQUAL((size_t)s.data(), (size_t)before); + UNIT_ASSERT_VALUES_EQUAL(copy, s); + } + } +} + +} |