Skip to content

Commit 9dbab08

Browse files
fix segfault in deserializer stream usage (#7542)
1 parent ff0fd33 commit 9dbab08

File tree

2 files changed

+8
-21
lines changed

2 files changed

+8
-21
lines changed

ydb/core/formats/arrow/accessor/composite_serial/accessor.cpp

+8-11
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ class TSerializedChunkAccessor {
77
private:
88
const std::vector<TDeserializeChunkedArray::TChunk>& Chunks;
99
const std::shared_ptr<TColumnLoader>& Loader;
10-
TDeserializeChunkedArray::TChunkCacheInfo* CachedDataOwner;
10+
std::optional<IChunkedArray::TLocalChunkedArrayAddress>& Result;
1111

1212
public:
1313
TSerializedChunkAccessor(const std::vector<TDeserializeChunkedArray::TChunk>& chunks, const std::shared_ptr<TColumnLoader>& loader,
14-
TDeserializeChunkedArray::TChunkCacheInfo* cachedDataOwner)
14+
std::optional<IChunkedArray::TLocalChunkedArrayAddress>& result)
1515
: Chunks(chunks)
1616
, Loader(loader)
17-
, CachedDataOwner(cachedDataOwner) {
17+
, Result(result) {
1818
}
1919
ui64 GetChunksCount() const {
2020
return Chunks.size();
@@ -23,11 +23,7 @@ class TSerializedChunkAccessor {
2323
return Chunks[idx].GetRecordsCount();
2424
}
2525
void OnArray(const ui32 chunkIdx, const ui32 startPosition) const {
26-
if (!CachedDataOwner->GetChunk() || CachedDataOwner->GetIndex() != chunkIdx) {
27-
CachedDataOwner->SetChunk(Chunks[chunkIdx].GetArrayVerified(Loader));
28-
CachedDataOwner->SetIndex(chunkIdx);
29-
CachedDataOwner->SetStartPosition(startPosition);
30-
}
26+
Result = IChunkedArray::TLocalChunkedArrayAddress(Chunks[chunkIdx].GetArrayVerified(Loader), startPosition, chunkIdx);
3127
}
3228
};
3329
} // namespace
@@ -40,10 +36,11 @@ IChunkedArray::TLocalDataAddress TDeserializeChunkedArray::DoGetLocalData(
4036

4137
IChunkedArray::TLocalChunkedArrayAddress TDeserializeChunkedArray::DoGetLocalChunkedArray(
4238
const std::optional<TCommonChunkAddress>& chunkCurrent, const ui64 position) const {
43-
TSerializedChunkAccessor accessor(Chunks, Loader, CurrentChunkCache.get());
39+
std::optional<IChunkedArray::TLocalChunkedArrayAddress> result;
40+
TSerializedChunkAccessor accessor(Chunks, Loader, result);
4441
SelectChunk(chunkCurrent, position, accessor);
45-
return IChunkedArray::TLocalChunkedArrayAddress(
46-
CurrentChunkCache->GetChunk(), CurrentChunkCache->GetStartPosition(), CurrentChunkCache->GetIndex());
42+
AFL_VERIFY(result);
43+
return *result;
4744
}
4845

4946
} // namespace NKikimr::NArrow::NAccessor

ydb/core/formats/arrow/accessor/composite_serial/accessor.h

-10
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,6 @@ class TDeserializeChunkedArray: public NArrow::NAccessor::IChunkedArray {
99
using TBase = NArrow::NAccessor::IChunkedArray;
1010

1111
public:
12-
class TChunkCacheInfo {
13-
private:
14-
YDB_ACCESSOR_DEF(std::shared_ptr<NArrow::NAccessor::IChunkedArray>, Chunk);
15-
YDB_ACCESSOR(ui32, Index, 0);
16-
YDB_ACCESSOR(ui32, StartPosition, 0);
17-
18-
public:
19-
};
20-
2112
class TChunk {
2213
private:
2314
YDB_READONLY(ui32, RecordsCount, 0);
@@ -47,7 +38,6 @@ class TDeserializeChunkedArray: public NArrow::NAccessor::IChunkedArray {
4738
private:
4839
std::shared_ptr<TColumnLoader> Loader;
4940
std::vector<TChunk> Chunks;
50-
std::shared_ptr<TChunkCacheInfo> CurrentChunkCache = std::make_shared<TChunkCacheInfo>();
5141

5242
protected:
5343
virtual TLocalChunkedArrayAddress DoGetLocalChunkedArray(

0 commit comments

Comments
 (0)