From 8788e591cd63525e707fb624805d8ca91d71f344 Mon Sep 17 00:00:00 2001 From: Xiaofan <83447078+xiaofan-luan@users.noreply.github.com> Date: Wed, 26 Mar 2025 13:24:20 +0800 Subject: [PATCH] enhance: add detailed stack for error message (#40883) fix #40882 adding stacktrace will operator execute failed. Signed-off-by: xiaofanluan --- internal/core/src/common/EasyAssert.h | 4 ++++ internal/core/src/exec/Driver.cpp | 20 ++++++------------- .../querynodev2/delegator/exclude_info.go | 4 +--- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/internal/core/src/common/EasyAssert.h b/internal/core/src/common/EasyAssert.h index 93d3cc36d0..a1a550e43e 100644 --- a/internal/core/src/common/EasyAssert.h +++ b/internal/core/src/common/EasyAssert.h @@ -74,6 +74,7 @@ enum ErrorCode { KnowhereError = 2099 }; + namespace impl { void EasyAssertInfo(bool value, @@ -83,6 +84,9 @@ EasyAssertInfo(bool value, std::string_view extra_info, ErrorCode error_code = ErrorCode::UnexpectedError); +std::string +EasyStackTrace(); + } // namespace impl class SegcoreError : public std::runtime_error { diff --git a/internal/core/src/exec/Driver.cpp b/internal/core/src/exec/Driver.cpp index 7e97ff150f..58c07337a2 100644 --- a/internal/core/src/exec/Driver.cpp +++ b/internal/core/src/exec/Driver.cpp @@ -31,8 +31,6 @@ #include "exec/operator/GroupByNode.h" #include "exec/Task.h" -#include "common/EasyAssert.h" - namespace milvus { namespace exec { @@ -181,24 +179,18 @@ Driver::Next(std::shared_ptr& blocking_state) { #define CALL_OPERATOR(call_func, operator, method_name) \ try { \ call_func; \ - } catch (SegcoreError & e) { \ + } catch (std::exception & e) { \ + std::string stack_trace = milvus::impl::EasyStackTrace(); \ auto err_msg = fmt::format( \ "Operator::{} failed for [Operator:{}, plan node id: " \ - "{}] : {}", \ + "{}] : {}\nStack trace: {}", \ method_name, \ - operator->get_operator_type(), \ + operator->ToString() , \ operator->get_plannode_id(), \ - e.what()); \ + e.what(), \ + stack_trace); \ LOG_ERROR(err_msg); \ throw ExecOperatorException(err_msg); \ - } catch (std::exception & e) { \ - throw ExecOperatorException( \ - fmt::format("Operator::{} failed for [Operator:{}, plan node id: " \ - "{}] : {}", \ - method_name, \ - operator->get_operator_type(), \ - operator->get_plannode_id(), \ - e.what())); \ } StopReason diff --git a/internal/querynodev2/delegator/exclude_info.go b/internal/querynodev2/delegator/exclude_info.go index d2040ca394..9d86d81f33 100644 --- a/internal/querynodev2/delegator/exclude_info.go +++ b/internal/querynodev2/delegator/exclude_info.go @@ -77,13 +77,11 @@ func (s *ExcludedSegments) CleanInvalid(ts uint64) { for _, segmentID := range invalidExcludedInfos { delete(s.segments, segmentID) - log.Info("remove segment from exclude info", zap.Int64("segmentID", segmentID)) + log.Ctx(context.TODO()).Info("remove segment from exclude info", zap.Int64("segmentID", segmentID)) } s.lastClean.Store(time.Now()) } func (s *ExcludedSegments) ShouldClean() bool { - s.mu.RLock() - defer s.mu.RUnlock() return time.Since(s.lastClean.Load()) > s.cleanInterval }