You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2020/07/13 12:52:36 UTC
[incubator-doris] branch master updated: [Bug] Fix core of double
delete, when RowBatch call transfer_resource_ownership (#4052)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new cd4fec8 [Bug] Fix core of double delete, when RowBatch call transfer_resource_ownership (#4052)
cd4fec8 is described below
commit cd4fec8ab1bc74bd0b2b6d28aee1ef23fd05b835
Author: HappenLee <ha...@hotmail.com>
AuthorDate: Mon Jul 13 20:52:22 2020 +0800
[Bug] Fix core of double delete, when RowBatch call transfer_resource_ownership (#4052)
Resource release should be done by dest RowBatch.
When we call method transfer_resource_ownership.
if we don't clear the corresponding resources,
which will cause the core problem of double delete.
---
be/src/runtime/row_batch.cpp | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/be/src/runtime/row_batch.cpp b/be/src/runtime/row_batch.cpp
index a35b8f1..4cfd953 100644
--- a/be/src/runtime/row_batch.cpp
+++ b/be/src/runtime/row_batch.cpp
@@ -524,21 +524,28 @@ void RowBatch::transfer_resource_ownership(RowBatch* dest) {
dest->_auxiliary_mem_usage += buffer->buffer_len();
buffer->set_mem_tracker(dest->_mem_tracker);
}
+ _io_buffers.clear();
for (BufferInfo& buffer_info : _buffers) {
dest->add_buffer(
buffer_info.client, std::move(buffer_info.buffer), FlushMode::NO_FLUSH_RESOURCES);
}
+ _buffers.clear();
for (int i = 0; i < _tuple_streams.size(); ++i) {
dest->_tuple_streams.push_back(_tuple_streams[i]);
dest->_auxiliary_mem_usage += _tuple_streams[i]->byte_size();
}
+ // Resource release should be done by dest RowBatch. if we don't clear the corresponding resources.
+ // This Rowbatch calls the reset() method, dest Rowbatch will also call the reset() method again,
+ // which will cause the core problem of double delete
+ _tuple_streams.clear();
for (int i = 0; i < _blocks.size(); ++i) {
dest->_blocks.push_back(_blocks[i]);
dest->_auxiliary_mem_usage += _blocks[i]->buffer_len();
}
+ _blocks.clear();
dest->_need_to_return |= _need_to_return;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org