This is an automated email from the ASF dual-hosted git repository.

kangkaisen 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 594e53e  [Spill To Disk][1/6] The adjustment of the basic 
BufferedBlockMgr includes the following change (#4151)
594e53e is described below

commit 594e53ec927402dde60a60063d73f4a8b2b90d09
Author: HappenLee <[email protected]>
AuthorDate: Thu Jul 30 10:29:12 2020 +0800

    [Spill To Disk][1/6] The adjustment of the basic BufferedBlockMgr includes 
the following change (#4151)
    
    1. Add Exec msg for BufferedBlockMgr for debug tuning
        2. Change the API of Consume Memory? We will use it in HashTable in the 
future
        3. Fix mistake of count _unfullfilled_reserved_buffers  in 
BufferedBlockMgr
---
 be/src/runtime/buffered_block_mgr2.cc | 34 ++++++++++++++++++++++++----------
 be/src/runtime/buffered_block_mgr2.h  |  6 ++++++
 2 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/be/src/runtime/buffered_block_mgr2.cc 
b/be/src/runtime/buffered_block_mgr2.cc
index 18f5b63..d86a39b 100644
--- a/be/src/runtime/buffered_block_mgr2.cc
+++ b/be/src/runtime/buffered_block_mgr2.cc
@@ -15,8 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
+#include "exec/exec_node.h"
 #include "runtime/buffered_block_mgr2.h"
-
 #include "runtime/exec_env.h"
 #include "runtime/runtime_state.h"
 #include "runtime/mem_tracker.h"
@@ -219,7 +219,8 @@ BufferedBlockMgr2::BufferedBlockMgr2(RuntimeState* state, 
TmpFileMgr* tmp_file_m
     _non_local_outstanding_writes(0),
     _io_mgr(state->exec_env()->disk_io_mgr()),
     _is_cancelled(false),
-    _writes_issued(0) {
+    _writes_issued(0),
+    _state(state){
 }
 
 Status BufferedBlockMgr2::create(
@@ -313,6 +314,11 @@ bool 
BufferedBlockMgr2::try_acquire_tmp_reservation(Client* client, int num_buff
 }
 
 bool BufferedBlockMgr2::consume_memory(Client* client, int64_t size) {
+    // Later, we use this interface to manage the consumption of memory of 
hashtable instead of ReservationTracker.
+    // So it is possible to allocate 0, which has no additional impact on the 
behavior of BufferedBlockMgr.
+    // The process of memory allocation still by BufferPool, Because 
bufferpool has done a lot of optimization in memory allocation
+    // which is better than using the new operator directly.
+    if (size == 0) return true;
     // Workaround IMPALA-1619. Return immediately if the allocation size will 
cause
     // an arithmetic overflow.
     if (UNLIKELY(size >= (1LL << 31))) {
@@ -321,7 +327,6 @@ bool BufferedBlockMgr2::consume_memory(Client* client, 
int64_t size) {
         return false;
     }
     int buffers_needed = BitUtil::ceil(size, max_block_size());
-    DCHECK_GT(buffers_needed, 0) << "Trying to consume 0 memory";
     unique_lock<mutex> lock(_lock);
 
     if (size < max_block_size() && _mem_tracker->try_consume(size)) {
@@ -331,7 +336,7 @@ bool BufferedBlockMgr2::consume_memory(Client* client, 
int64_t size) {
         return true;
     }
 
-    if (std::max<int64_t>(0, remaining_unreserved_buffers()) +
+    if (available_buffers(client) +
             client->_num_tmp_reserved_buffers < buffers_needed) {
         return false;
     }
@@ -436,7 +441,15 @@ Status BufferedBlockMgr2::mem_limit_too_low_error(Client* 
client, int node_id) {
         << PrettyPrinter::print(
                 client->_num_reserved_buffers * max_block_size(), TUnit::BYTES)
         << ".";
-    return Status::MemoryLimitExceeded(error_msg.str());
+    return add_exec_msg(error_msg.str());
+}
+
+Status BufferedBlockMgr2::add_exec_msg(const std::string& msg) const {
+    stringstream str;
+    str << msg << " ";
+    str << "Backend: " << BackendOptions::get_localhost() << ", ";
+    str << "fragment: " << print_id(_state->fragment_instance_id()) << " ";
+    return Status::MemoryLimitExceeded(str.str());
 }
 
 Status BufferedBlockMgr2::get_new_block(
@@ -914,11 +927,12 @@ void BufferedBlockMgr2::delete_block(Block* block) {
         if (block->is_max_size()) {
             --_total_pinned_buffers;
         }
-        block->_is_pinned = false;
         block->_client->unpin_buffer(block->_buffer_desc);
-        if (block->_client->_num_pinned_buffers < 
block->_client->_num_reserved_buffers) {
+        // Only block is io size we need change _unfullfilled_reserved_buffers
+        if (block->is_max_size() && block->_client->_num_pinned_buffers < 
block->_client->_num_reserved_buffers) {
             ++_unfullfilled_reserved_buffers;
         }
+        block->_is_pinned = false;
     } else if (_unpinned_blocks.contains(block)) {
         // Remove block from unpinned list.
         _unpinned_blocks.remove(block);
@@ -1034,7 +1048,7 @@ Status BufferedBlockMgr2::find_buffer_for_block(Block* 
block, bool* in_mem) {
                     << endl << debug_internal() << endl << 
client->debug_string();
                 VLOG_QUERY << ss.str();
             }
-            return Status::MemoryLimitExceeded("Query did not have enough 
memory to get the minimum required "
+            return add_exec_msg("Query did not have enough memory to get the 
minimum required "
                                                "buffers in the block 
manager.");
         }
 
@@ -1089,8 +1103,8 @@ Status BufferedBlockMgr2::find_buffer(
         // There are no free buffers. If spills are disabled or there no 
unpinned blocks we
         // can write, return. We can't get a buffer.
         if (!_enable_spill) {
-            return Status::InternalError("Spilling has been disabled for 
plans,"
-                    "current memory usage has reached the bottleneck."
+            return add_exec_msg("Spilling has been disabled for plans,"
+                    "current memory usage has reached the bottleneck. "
                     "You can avoid the behavior via increasing the mem limit "
                     "by session variable exec_mem_limior or enable spilling.");
         }
diff --git a/be/src/runtime/buffered_block_mgr2.h 
b/be/src/runtime/buffered_block_mgr2.h
index 982fa07..b2d355b 100644
--- a/be/src/runtime/buffered_block_mgr2.h
+++ b/be/src/runtime/buffered_block_mgr2.h
@@ -508,6 +508,9 @@ private:
     bool validate() const;
     std::string debug_internal() const;
 
+    // Add BE hostname and fragmentid for debug tuning
+    Status add_exec_msg(const std::string& msg) const;
+
     // Size of the largest/default block in bytes.
     const int64_t _max_block_size;
 
@@ -638,6 +641,9 @@ private:
     typedef boost::unordered_map<TUniqueId, boost::weak_ptr<BufferedBlockMgr2> 
> BlockMgrsMap;
     static BlockMgrsMap _s_query_to_block_mgrs;
 
+    // Unowned.
+    RuntimeState* _state;
+
 }; // class BufferedBlockMgr2
 
 } // end namespace doris


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to