From 09805b23966ff04aca6a3f40d0757652e5ccdf8a Mon Sep 17 00:00:00 2001 From: Nikita Mikhaylov Date: Tue, 24 Dec 2019 16:25:41 +0300 Subject: [PATCH] exception ptr added --- dbms/src/Dictionaries/CacheDictionary.cpp | 22 +++++++++++---------- dbms/src/Dictionaries/CacheDictionary.h | 1 + dbms/src/Dictionaries/CacheDictionary.inc.h | 15 +++++++++++--- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/dbms/src/Dictionaries/CacheDictionary.cpp b/dbms/src/Dictionaries/CacheDictionary.cpp index f56141f94d9..bbcd85f0e66 100644 --- a/dbms/src/Dictionaries/CacheDictionary.cpp +++ b/dbms/src/Dictionaries/CacheDictionary.cpp @@ -385,10 +385,13 @@ void CacheDictionary::has(const PaddedPODArray & ids, PaddedPODArray throw std::runtime_error("Too many updates"); // waitForCurrentUpdateFinish(); - while (!update_unit_ptr->is_done) { + while (!update_unit_ptr->is_done && !update_unit_ptr->current_exception) { std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::this_thread::yield(); } + + if (update_unit_ptr->current_exception) + std::rethrow_exception(update_unit_ptr->current_exception); } @@ -670,21 +673,20 @@ void registerDictionaryCache(DictionaryFactory & factory) void CacheDictionary::updateThreadFunction() { - try + while (!finished) { - while (!finished) + UpdateUnitPtr unit_ptr; + update_queue.pop(unit_ptr); + try { - UpdateUnitPtr unit_ptr; - update_queue.pop(unit_ptr); - update(unit_ptr->requested_ids, unit_ptr->on_cell_updated, unit_ptr->on_id_not_found); unit_ptr->is_done = true; last_update.fetch_add(1); } - } - catch (...) - { - tryLogCurrentException(__PRETTY_FUNCTION__); + catch (...) + { + unit_ptr->current_exception = std::current_exception(); + } } } diff --git a/dbms/src/Dictionaries/CacheDictionary.h b/dbms/src/Dictionaries/CacheDictionary.h index 0b9189a906a..b12c923c775 100644 --- a/dbms/src/Dictionaries/CacheDictionary.h +++ b/dbms/src/Dictionaries/CacheDictionary.h @@ -310,6 +310,7 @@ private: on_id_not_found(std::move(on_id_not_found_)) {} std::atomic is_done{false}; + std::exception_ptr current_exception{nullptr}; std::vector requested_ids; std::function on_cell_updated; std::function on_id_not_found; diff --git a/dbms/src/Dictionaries/CacheDictionary.inc.h b/dbms/src/Dictionaries/CacheDictionary.inc.h index 397ed5f0256..da52020e398 100644 --- a/dbms/src/Dictionaries/CacheDictionary.inc.h +++ b/dbms/src/Dictionaries/CacheDictionary.inc.h @@ -114,10 +114,13 @@ void CacheDictionary::getItemsNumberImpl( throw std::runtime_error("Too many updates"); // waitForCurrentUpdateFinish(); - while (!update_unit_ptr->is_done) { + while (!update_unit_ptr->is_done && !update_unit_ptr->current_exception) { std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::this_thread::yield(); } + + if (update_unit_ptr->current_exception) + std::rethrow_exception(update_unit_ptr->current_exception); } template @@ -271,10 +274,13 @@ void CacheDictionary::getItemsString( throw std::runtime_error("Too many updates"); // waitForCurrentUpdateFinish(); - while (!update_unit_ptr->is_done) { + while (!update_unit_ptr->is_done && !update_unit_ptr->current_exception) { std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::this_thread::yield(); } + + if (update_unit_ptr->current_exception) + std::rethrow_exception(update_unit_ptr->current_exception); } } @@ -304,10 +310,13 @@ void CacheDictionary::getItemsString( throw std::runtime_error("Too many updates"); // waitForCurrentUpdateFinish();begin - while (!update_unit_ptr->is_done) { + while (!update_unit_ptr->is_done && !update_unit_ptr->current_exception) { std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::this_thread::yield(); } + + if (update_unit_ptr->current_exception) + std::rethrow_exception(update_unit_ptr->current_exception); } out->getChars().reserve(total_length);