Skip to content

Commit f9f5e60

Browse files
author
Andreas Ringlstetter
committed
Cache context in thread_local rather than class member#48187
1 parent 859bf82 commit f9f5e60

File tree

1 file changed

+14
-19
lines changed

1 file changed

+14
-19
lines changed

cpp/src/arrow/util/compression_zstd.cc

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,12 @@ class ZSTDCodec : public Codec {
202202
DCHECK_EQ(output_buffer_len, 0);
203203
output_buffer = &empty_buffer;
204204
}
205-
if (!decompression_context_) {
206-
decompression_context_ =
207-
decltype(decompression_context_)(ZSTD_createDCtx(), ZSTDContextDeleter{});
208-
}
209-
size_t ret = ZSTD_decompressDCtx(decompression_context_.get(), output_buffer,
205+
// Decompression context for ZSTD contains several large heap allocations.
206+
// This method is additionally used in a free-threaded context so caching in a class
207+
// member is not possible.
208+
thread_local std::unique_ptr<ZSTD_DCtx, ZSTDContextDeleter> decompression_context{
209+
ZSTD_createDCtx(), ZSTDContextDeleter{}};
210+
size_t ret = ZSTD_decompressDCtx(decompression_context.get(), output_buffer,
210211
static_cast<size_t>(output_buffer_len), input,
211212
static_cast<size_t>(input_len));
212213
if (ZSTD_isError(ret)) {
@@ -226,18 +227,14 @@ class ZSTDCodec : public Codec {
226227

227228
Result<int64_t> Compress(int64_t input_len, const uint8_t* input,
228229
int64_t output_buffer_len, uint8_t* output_buffer) override {
229-
if (!compression_context_) {
230-
compression_context_ =
231-
decltype(compression_context_)(ZSTD_createCCtx(), ZSTDContextDeleter{});
232-
size_t ret = ZSTD_CCtx_setParameter(compression_context_.get(),
233-
ZSTD_c_compressionLevel, compression_level_);
234-
if (ZSTD_isError(ret)) {
235-
return ZSTDError(ret, "Setting ZSTD compression level failed: ");
236-
}
237-
}
238-
size_t ret = ZSTD_compress2(compression_context_.get(), output_buffer,
239-
static_cast<size_t>(output_buffer_len), input,
240-
static_cast<size_t>(input_len));
230+
// Compression context for ZSTD contains several large heap allocations.
231+
// This method is additionally used in a free-threaded context so caching in a class
232+
// member is not possible.
233+
thread_local std::unique_ptr<ZSTD_CCtx, ZSTDContextDeleter> compression_context{
234+
ZSTD_createCCtx(), ZSTDContextDeleter{}};
235+
size_t ret = ZSTD_compressCCtx(compression_context.get(), output_buffer,
236+
static_cast<size_t>(output_buffer_len), input,
237+
static_cast<size_t>(input_len), compression_level_);
241238
if (ZSTD_isError(ret)) {
242239
return ZSTDError(ret, "ZSTD compression failed: ");
243240
}
@@ -265,8 +262,6 @@ class ZSTDCodec : public Codec {
265262

266263
private:
267264
const int compression_level_;
268-
std::unique_ptr<ZSTD_DCtx, ZSTDContextDeleter> decompression_context_;
269-
std::unique_ptr<ZSTD_CCtx, ZSTDContextDeleter> compression_context_;
270265
};
271266

272267
} // namespace

0 commit comments

Comments
 (0)