diff options
author | Oleg Doronin <dorooleg@yandex.ru> | 2025-03-31 14:21:18 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-31 14:21:18 +0300 |
commit | a9761dc398f22a1e9ccccbe552795c5928baf7de (patch) | |
tree | 576125b0c857989ba173908f13dba4c335dc489b | |
parent | 38eb729cdac3ddaf06775f9bd400ec9ddcfaa31b (diff) | |
download | ydb-a9761dc398f22a1e9ccccbe552795c5928baf7de.tar.gz |
overlapping portions test has been added (#16381)
-rw-r--r-- | ydb/tests/library/harness/kikimr_config.py | 4 | ||||
-rw-r--r-- | ydb/tests/olap/oom/overlapping_portions.py | 104 | ||||
-rw-r--r-- | ydb/tests/olap/oom/ya.make | 26 | ||||
-rw-r--r-- | ydb/tests/olap/ya.make | 1 |
4 files changed, 135 insertions, 0 deletions
diff --git a/ydb/tests/library/harness/kikimr_config.py b/ydb/tests/library/harness/kikimr_config.py index 711e14856d6..9afdf4b74ad 100644 --- a/ydb/tests/library/harness/kikimr_config.py +++ b/ydb/tests/library/harness/kikimr_config.py @@ -163,6 +163,7 @@ class KikimrConfigGenerator(object): separate_node_configs=False, default_clusteradmin=None, enable_resource_pools=None, + grouped_memory_limiter_config=None, ): if extra_feature_flags is None: extra_feature_flags = [] @@ -354,6 +355,9 @@ class KikimrConfigGenerator(object): if column_shard_config: self.yaml_config["column_shard_config"] = column_shard_config + if grouped_memory_limiter_config: + self.yaml_config["grouped_memory_limiter_config"] = grouped_memory_limiter_config + self.__build() if self.grpc_ssl_enable: diff --git a/ydb/tests/olap/oom/overlapping_portions.py b/ydb/tests/olap/oom/overlapping_portions.py new file mode 100644 index 00000000000..ddbcfd72f55 --- /dev/null +++ b/ydb/tests/olap/oom/overlapping_portions.py @@ -0,0 +1,104 @@ +import datetime +import logging +import os +import pytest +import random +import yatest.common +import ydb + +from ydb.tests.library.harness.kikimr_config import KikimrConfigGenerator +from ydb.tests.library.harness.kikimr_runner import KiKiMR +from ydb.tests.library.test_meta import link_test_case +from ydb.tests.olap.common.ydb_client import YdbClient + +logger = logging.getLogger(__name__) + + +class TestOverlappingPortions(object): + test_name = "overlapping_portions" + + @classmethod + def setup_class(cls): + ydb_path = yatest.common.build_path(os.environ.get("YDB_DRIVER_BINARY")) + logger.info(yatest.common.execute([ydb_path, "-V"], wait=True).stdout.decode("utf-8")) + config = KikimrConfigGenerator( + column_shard_config={"compaction_enabled": False}, + grouped_memory_limiter_config={ + "enabled": True, + "memory_limit": 100 * 1024 * 1024, + "hard_memory_limit": 100 * 1024 * 1024, + }, + ) + cls.cluster = KiKiMR(config) + cls.cluster.start() + node = cls.cluster.nodes[1] + cls.ydb_client = YdbClient(database=f"/{config.domain_name}", endpoint=f"grpc://{node.host}:{node.port}") + cls.ydb_client.wait_connection() + + def write_data( + self, + table: str, + timestamp_from_ms: int, + rows: int, + value: int = 1, + ): + column_types = ydb.BulkUpsertColumns() + column_types.add_column("ts", ydb.PrimitiveType.Timestamp) + column_types.add_column("s", ydb.PrimitiveType.String) + column_types.add_column("val", ydb.PrimitiveType.Uint64) + + chunk_size = 100 + while rows: + current_chunk_size = min(chunk_size, rows) + data = [ + { + "ts": timestamp_from_ms + i, + "s": random.randbytes(1024 * 10), + "val": value, + } + for i in range(current_chunk_size) + ] + self.ydb_client.bulk_upsert( + table, + column_types, + data, + ) + timestamp_from_ms += current_chunk_size + rows -= current_chunk_size + assert rows >= 0 + + def write_and_check(self, table_path, count): + ts_start = int(datetime.datetime.now().timestamp() * 1000000) + for value in range(count): + self.write_data(table_path, ts_start, 100, value) + + self.ydb_client.query( + f""" + select * from `{table_path}` + """ + ) + + @link_test_case("#15512") + def test(self): + test_dir = f"{self.ydb_client.database}/{self.test_name}" + table_path = f"{test_dir}/table" + + self.ydb_client.query( + f""" + CREATE TABLE `{table_path}` ( + ts Timestamp NOT NULL, + s String, + val Uint64, + PRIMARY KEY(ts), + ) + WITH ( + STORE = COLUMN, + AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 1 + ) + """ + ) + + self.write_and_check(table_path, 1) + + with pytest.raises(ydb.issues.GenericError, match=r'.*cannot allocate memory.*'): + self.write_and_check(table_path, 100) diff --git a/ydb/tests/olap/oom/ya.make b/ydb/tests/olap/oom/ya.make new file mode 100644 index 00000000000..6b340046c17 --- /dev/null +++ b/ydb/tests/olap/oom/ya.make @@ -0,0 +1,26 @@ +PY3TEST() +ENV(YDB_DRIVER_BINARY="ydb/apps/ydbd/ydbd") + +FORK_TEST_FILES() + +TEST_SRCS( + overlapping_portions.py +) + +SIZE(MEDIUM) + +PEERDIR( + ydb/tests/library + ydb/tests/library/test_meta + ydb/public/sdk/python + ydb/public/sdk/python/enable_v3_new_behavior + library/recipes/common + ydb/tests/olap/common +) + +DEPENDS( + ydb/apps/ydbd +) + +END() + diff --git a/ydb/tests/olap/ya.make b/ydb/tests/olap/ya.make index 2cf6448affe..9046a2d337b 100644 --- a/ydb/tests/olap/ya.make +++ b/ydb/tests/olap/ya.make @@ -32,6 +32,7 @@ RECURSE( high_load lib load + oom s3_import scenario ttl_tiering |