yiguolei commented on code in PR #33622: URL: https://github.com/apache/doris/pull/33622#discussion_r1564583352
########## be/src/util/block_compression.cpp: ########## @@ -373,77 +375,75 @@ class Lz4fBlockCompression : public BlockCompressionCodec { private: // acquire a compression ctx from pool, release while finish compress, // delete if compression failed - Status _acquire_compression_ctx(CContext** out) { + Status _acquire_compression_ctx(std::shared_ptr<CContext>& out) { std::lock_guard<std::mutex> l(_ctx_c_mutex); if (_ctx_c_pool.empty()) { - CContext* context = new (std::nothrow) CContext(); - if (context == nullptr) { + std::shared_ptr<CContext> localCtx = CContext::create_shared(); + if (localCtx.get() == nullptr) { return Status::InvalidArgument("failed to new LZ4F CContext"); } - auto res = LZ4F_createCompressionContext(&context->ctx, LZ4F_VERSION); + auto res = LZ4F_createCompressionContext(&localCtx->ctx, LZ4F_VERSION); if (LZ4F_isError(res) != 0) { return Status::InvalidArgument(strings::Substitute( "LZ4F_createCompressionContext error, res=$0", LZ4F_getErrorName(res))); } - *out = context; + out = localCtx; return Status::OK(); } - *out = _ctx_c_pool.back(); + out = _ctx_c_pool.back(); _ctx_c_pool.pop_back(); return Status::OK(); } - void _release_compression_ctx(CContext* context) { + void _release_compression_ctx(std::shared_ptr<CContext> context) { DCHECK(context); std::lock_guard<std::mutex> l(_ctx_c_mutex); _ctx_c_pool.push_back(context); } - void _delete_compression_ctx(CContext* context) { + void _delete_compression_ctx(std::shared_ptr<CContext> context) { DCHECK(context); LZ4F_freeCompressionContext(context->ctx); - delete context; } - Status _acquire_decompression_ctx(DContext** out) { + Status _acquire_decompression_ctx(std::shared_ptr<DContext>& out) { std::lock_guard<std::mutex> l(_ctx_d_mutex); if (_ctx_d_pool.empty()) { - DContext* context = new (std::nothrow) DContext(); - if (context == nullptr) { + std::shared_ptr<DContext> localCtx = DContext::create_shared(); + if (localCtx.get() == nullptr) { return Status::InvalidArgument("failed to new LZ4F DContext"); } - auto res = LZ4F_createDecompressionContext(&context->ctx, LZ4F_VERSION); + auto res = LZ4F_createDecompressionContext(&localCtx->ctx, LZ4F_VERSION); if (LZ4F_isError(res) != 0) { return Status::InvalidArgument(strings::Substitute( "LZ4F_createDeompressionContext error, res=$0", LZ4F_getErrorName(res))); } - *out = context; + out = localCtx; return Status::OK(); } - *out = _ctx_d_pool.back(); + out = _ctx_d_pool.back(); _ctx_d_pool.pop_back(); return Status::OK(); } - void _release_decompression_ctx(DContext* context) { + void _release_decompression_ctx(std::shared_ptr<DContext> context) { DCHECK(context); // reset decompression context to avoid ERROR_maxBlockSize_invalid LZ4F_resetDecompressionContext(context->ctx); std::lock_guard<std::mutex> l(_ctx_d_mutex); _ctx_d_pool.push_back(context); } - void _delete_decompression_ctx(DContext* context) { + void _delete_decompression_ctx(std::shared_ptr<DContext> context) { DCHECK(context); LZ4F_freeDecompressionContext(context->ctx); Review Comment: this logic should be in the deconstructor of object Context or DContext. Because if the Context or DContext is invalid or deconstructed, context->ctx should always be freed. And then you will find _delete_decompression_ctx is useless, we could delete this method. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org