From 44d0b1903f6d2a6f409d8c83a2f2468d290618cf Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Tue, 7 May 2013 15:22:13 +0100 Subject: [PATCH] [btree] allow visitors to trap node access failures such as checksum error. --- persistent-data/data-structures/btree.h | 15 +++++++++++++++ persistent-data/data-structures/btree.tcc | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/persistent-data/data-structures/btree.h b/persistent-data/data-structures/btree.h index 0e54d3f..be64f24 100644 --- a/persistent-data/data-structures/btree.h +++ b/persistent-data/data-structures/btree.h @@ -331,6 +331,17 @@ namespace persistent_data { leaf_node const &n) = 0; virtual void visit_complete() {} + + + enum error_outcome { + EXCEPTION_HANDLED, + RETHROW_EXCEPTION + }; + + virtual error_outcome error_accessing_node(node_location const &l, block_address b, + std::string const &what) { + return RETHROW_EXCEPTION; + } }; // Walks the tree in depth first order @@ -366,6 +377,10 @@ namespace persistent_data { btree_detail::node_location const &loc, block_address b) const; + void walk_tree_internal(visitor &visitor, + btree_detail::node_location const &loc, + block_address b) const; + typename persistent_data::transaction_manager::ptr tm_; bool destroy_; block_address root_; diff --git a/persistent-data/data-structures/btree.tcc b/persistent-data/data-structures/btree.tcc index d491700..e91670f 100644 --- a/persistent-data/data-structures/btree.tcc +++ b/persistent-data/data-structures/btree.tcc @@ -760,6 +760,26 @@ void btree::walk_tree(visitor &v, node_location const &loc, block_address b) const +{ + try { + walk_tree_internal(v, loc, b); + + } catch (std::runtime_error const &e) { + switch (v.error_accessing_node(loc, b, e.what())) { + case visitor::EXCEPTION_HANDLED: + break; + + case visitor::RETHROW_EXCEPTION: + throw; + } + } +} + +template +void +btree::walk_tree_internal(visitor &v, + node_location const &loc, + block_address b) const { using namespace btree_detail;