Skip to content

Commit 1560482

Browse files
committed
Added ref locking
1 parent c4bb730 commit 1560482

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

ydb/core/fq/libs/row_dispatcher/json_parser.cpp

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,7 @@ class TJsonParser::TImpl {
153153
LOG_ROW_DISPATCHER_TRACE("Parse values:\n" << values);
154154

155155
with_lock (Alloc) {
156-
for (auto& parsedColumn : ParsedValues) {
157-
parsedColumn.clear();
158-
parsedColumn.reserve(Buffer.NumberValues);
159-
}
156+
ClearColumns(Buffer.NumberValues);
160157

161158
size_t rowId = 0;
162159
simdjson::ondemand::document_stream documents = Parser.iterate_many(values, size, simdjson::ondemand::DEFAULT_BATCH_SIZE);
@@ -173,6 +170,7 @@ class TJsonParser::TImpl {
173170

174171
try {
175172
parsedColumn.emplace_back(ParseJsonValue(columnDesc.Type, item.value()));
173+
Alloc.Ref().LockObject(parsedColumn.back());
176174
} catch (...) {
177175
throw yexception() << "Failed to parse json string at offset " << Buffer.Offsets[rowId] << ", got parsing error for column '" << columnDesc.Name << "' with type " << columnDesc.TypeYson << ", description: " << CurrentExceptionMessage();
178176
}
@@ -202,9 +200,20 @@ class TJsonParser::TImpl {
202200

203201
~TImpl() {
204202
Alloc.Acquire();
203+
ClearColumns(0);
205204
}
206205

207206
private:
207+
void ClearColumns(size_t reserveSize) {
208+
for (auto& parsedColumn : ParsedValues) {
209+
for (const auto& value : parsedColumn) {
210+
Alloc.Ref().UnlockObject(value);
211+
}
212+
parsedColumn.clear();
213+
parsedColumn.reserve(reserveSize);
214+
}
215+
}
216+
208217
void ResizeColumn(const TColumnDescription& columnDesc, NKikimr::NMiniKQL::TUnboxedValueVector& parsedColumn, size_t size) const {
209218
if (columnDesc.Type->IsOptional()) {
210219
parsedColumn.resize(size);
@@ -213,7 +222,7 @@ class TJsonParser::TImpl {
213222
}
214223
}
215224

216-
NYql::NUdf::TUnboxedValue ParseJsonValue(const NKikimr::NMiniKQL::TType* type, simdjson::fallback::ondemand::value jsonValue) const {
225+
NYql::NUdf::TUnboxedValuePod ParseJsonValue(const NKikimr::NMiniKQL::TType* type, simdjson::fallback::ondemand::value jsonValue) const {
217226
switch (type->GetKind()) {
218227
case NKikimr::NMiniKQL::TTypeBase::EKind::Data: {
219228
const auto* dataType = AS_TYPE(NKikimr::NMiniKQL::TDataType, type);
@@ -236,7 +245,7 @@ class TJsonParser::TImpl {
236245
}
237246
}
238247

239-
NYql::NUdf::TUnboxedValue ParseJsonValue(NYql::NUdf::EDataSlot dataSlot, simdjson::fallback::ondemand::value jsonValue) const {
248+
NYql::NUdf::TUnboxedValuePod ParseJsonValue(NYql::NUdf::EDataSlot dataSlot, simdjson::fallback::ondemand::value jsonValue) const {
240249
const auto& typeInfo = NYql::NUdf::GetDataTypeInfo(dataSlot);
241250
switch (jsonValue.type()) {
242251
case simdjson::fallback::ondemand::json_type::number: {
@@ -307,7 +316,7 @@ class TJsonParser::TImpl {
307316
}
308317

309318
template <typename TResult, typename TJsonNumber>
310-
static NYql::NUdf::TUnboxedValue ParseJsonNumber(TJsonNumber number) {
319+
static NYql::NUdf::TUnboxedValuePod ParseJsonNumber(TJsonNumber number) {
311320
if (number < std::numeric_limits<TResult>::min() || std::numeric_limits<TResult>::max() < number) {
312321
throw yexception() << "number is out of range";
313322
}

ydb/core/fq/libs/row_dispatcher/ut/json_filter_ut.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ class TFixture : public NUnitTest::TBaseFixture {
3636

3737
void TearDown(NUnitTest::TTestContext& /* context */) override {
3838
with_lock (Alloc) {
39+
for (const auto& holder : Holders) {
40+
for (const auto& value : holder) {
41+
Alloc.Ref().UnlockObject(value);
42+
}
43+
}
3944
Holders.clear();
4045
}
4146
Filter.reset();
@@ -58,6 +63,7 @@ class TFixture : public NUnitTest::TBaseFixture {
5863
Holders.emplace_front();
5964
for (size_t i = 0; i < size; ++i) {
6065
Holders.front().emplace_back(valueCreator(i));
66+
Alloc.Ref().LockObject(Holders.front().back());
6167
}
6268
return &Holders.front();
6369
}

0 commit comments

Comments
 (0)