diff --git a/ydb/core/fq/libs/row_dispatcher/json_parser.cpp b/ydb/core/fq/libs/row_dispatcher/json_parser.cpp index 56946ef49a38..03c49820bbb7 100644 --- a/ydb/core/fq/libs/row_dispatcher/json_parser.cpp +++ b/ydb/core/fq/libs/row_dispatcher/json_parser.cpp @@ -264,7 +264,7 @@ class TJsonParser::TImpl { public: TImpl(const TVector& columns, const TVector& types, ui64 batchSize, TDuration batchCreationTimeout) : Alloc(__LOCATION__, NKikimr::TAlignedPagePoolCounters(), true, false) - , TypeEnv(Alloc) + , TypeEnv(std::make_unique(Alloc)) , BatchSize(batchSize) , BatchCreationTimeout(batchCreationTimeout) , ParsedValues(columns.size()) @@ -273,7 +273,7 @@ class TJsonParser::TImpl { with_lock (Alloc) { auto functonRegistry = NKikimr::NMiniKQL::CreateFunctionRegistry(&PrintBackTrace, NKikimr::NMiniKQL::CreateBuiltinRegistry(), false, {}); - NKikimr::NMiniKQL::TProgramBuilder programBuilder(TypeEnv, *functonRegistry); + NKikimr::NMiniKQL::TProgramBuilder programBuilder(*TypeEnv, *functonRegistry); Columns.reserve(columns.size()); for (size_t i = 0; i < columns.size(); i++) { @@ -370,8 +370,12 @@ class TJsonParser::TImpl { } ~TImpl() { - Alloc.Acquire(); - ClearColumns(0); + with_lock (Alloc) { + ClearColumns(0); + ParsedValues.clear(); + Columns.clear(); + TypeEnv.reset(); + } } private: @@ -392,7 +396,7 @@ class TJsonParser::TImpl { private: NKikimr::NMiniKQL::TScopedAlloc Alloc; - NKikimr::NMiniKQL::TTypeEnvironment TypeEnv; + std::unique_ptr TypeEnv; const ui64 BatchSize; const TDuration BatchCreationTimeout; @@ -402,7 +406,7 @@ class TJsonParser::TImpl { TJsonParserBuffer Buffer; simdjson::ondemand::parser Parser; - TVector>> ParsedValues; + TVector ParsedValues; }; TJsonParser::TJsonParser(const TVector& columns, const TVector& types, ui64 batchSize, TDuration batchCreationTimeout) diff --git a/ydb/core/fq/libs/row_dispatcher/ut/json_parser_ut.cpp b/ydb/core/fq/libs/row_dispatcher/ut/json_parser_ut.cpp index bdf74270094d..7ffbe7e27d91 100644 --- a/ydb/core/fq/libs/row_dispatcher/ut/json_parser_ut.cpp +++ b/ydb/core/fq/libs/row_dispatcher/ut/json_parser_ut.cpp @@ -1,3 +1,5 @@ +#include + #include #include @@ -22,7 +24,16 @@ class TFixture : public NUnitTest::TBaseFixture { TFixture() : Runtime(true) {} + static void SegmentationFaultHandler(int) { + Cerr << "segmentation fault call stack:" << Endl; + FormatBackTrace(&Cerr); + abort(); + } + void SetUp(NUnitTest::TTestContext&) override { + NKikimr::EnableYDBBacktraceFormat(); + signal(SIGSEGV, &SegmentationFaultHandler); + TAutoPtr app = new TAppPrepare(); Runtime.SetLogBackend(CreateStderrBackend()); Runtime.SetLogPriority(NKikimrServices::FQ_ROW_DISPATCHER, NLog::PRI_TRACE); diff --git a/ydb/core/fq/libs/row_dispatcher/ut/ya.make b/ydb/core/fq/libs/row_dispatcher/ut/ya.make index 25242d092f28..bb66ec57798f 100644 --- a/ydb/core/fq/libs/row_dispatcher/ut/ya.make +++ b/ydb/core/fq/libs/row_dispatcher/ut/ya.make @@ -20,7 +20,6 @@ PEERDIR( ydb/library/yql/udfs/common/yson2 ydb/tests/fq/pq_async_io ydb/library/yql/sql/pg_dummy - ydb/library/yql/udfs/common/clickhouse/client ) SIZE(MEDIUM)