aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkungasc <kungasc@yandex-team.com>2023-08-04 15:33:39 +0300
committerkungasc <kungasc@yandex-team.com>2023-08-04 17:19:07 +0300
commit785ff1c83930efca1ebcf3d6bf84dae8a827519e (patch)
tree997e3ae63c12e8cb2faa94136374cac3b5c80aa0
parent92852774c420fb2e2ba405ac9dd31dee8b4018df (diff)
downloadydb-785ff1c83930efca1ebcf3d6bf84dae8a827519e.tar.gz
Shrink to fit compressed redo log
-rw-r--r--ydb/core/tablet_flat/flat_executor_txloglogic.cpp4
-rw-r--r--ydb/core/tablet_flat/ut_util/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/core/tablet_flat/ut_util/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/core/tablet_flat/ut_util/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/core/tablet_flat/ut_util/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/core/tablet_flat/ut_util/ya.make1
-rw-r--r--ydb/core/tablet_flat/util_string.h14
-rw-r--r--ydb/core/tablet_flat/util_string_ut.cpp32
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);
+ }
+ }
+}
+
+}