From 39d0946b50d76db0237b68ff73a2cc2f096453ed Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Tue, 9 Feb 2016 04:44:11 -0500 Subject: [PATCH 1/3] Remove evaluation_observer #550 --- .../chain/include/graphene/chain/database.hpp | 8 -- .../include/graphene/chain/evaluator.hpp | 94 +------------------ 2 files changed, 1 insertion(+), 101 deletions(-) diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 7197d47c..66d85451 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -269,14 +269,6 @@ namespace graphene { namespace chain { operation::tag::value].reset( new op_evaluator_impl() ); } - template - void register_evaluation_observer( evaluation_observer& observer ) - { - unique_ptr& op_eval = _operation_evaluators[operation::tag::value]; - op_eval->eval_observers.push_back( &observer ); - return; - } - //////////////////// db_balance.cpp //////////////////// /** diff --git a/libraries/chain/include/graphene/chain/evaluator.hpp b/libraries/chain/include/graphene/chain/evaluator.hpp index 015f10a5..33d6338c 100644 --- a/libraries/chain/include/graphene/chain/evaluator.hpp +++ b/libraries/chain/include/graphene/chain/evaluator.hpp @@ -29,47 +29,6 @@ namespace graphene { namespace chain { class generic_evaluator; class transaction_evaluation_state; - /** - * Observes evaluation events, providing - * pre- and post-evaluation hooks. - * - * Every call to pre_evaluate() is followed by - * a call to either post_evaluate() or evaluation_failed(). - * - * A subclass which needs to do a "diff" can gather some - * "before" state into its members in pre_evaluate(), - * then post_evaluate() will have both "before" - * and "after" state, and will be able to do the diff. - * - * evaluation_failed() is a cleanup method which notifies - * the subclass to "throw away" the diff. - */ - class evaluation_observer - { - public: - virtual ~evaluation_observer(){} - - virtual void pre_evaluate(const transaction_evaluation_state& eval_state, - const operation& op, - bool apply, - generic_evaluator* ge) - {} - - virtual void post_evaluate(const transaction_evaluation_state& eval_state, - const operation& op, - bool apply, - generic_evaluator* ge, - const operation_result& result) - {} - - virtual void evaluation_failed(const transaction_evaluation_state& eval_state, - const operation& op, - bool apply, - generic_evaluator* ge, - const operation_result& result) - {} - }; - class generic_evaluator { public: @@ -118,8 +77,6 @@ namespace graphene { namespace chain { public: virtual ~op_evaluator(){} virtual operation_result evaluate(transaction_evaluation_state& eval_state, const operation& op, bool apply) = 0; - - vector eval_observers; }; template @@ -128,57 +85,8 @@ namespace graphene { namespace chain { public: virtual operation_result evaluate(transaction_evaluation_state& eval_state, const operation& op, bool apply = true) override { - // fc::exception from observers are suppressed. - // fc::exception from evaluation is deferred (re-thrown - // after all observers receive evaluation_failed) - T eval; - shared_ptr evaluation_exception; - size_t observer_count = 0; - operation_result result; - - for( const auto& obs : eval_observers ) - { - try - { - obs->pre_evaluate(eval_state, op, apply, &eval); - } - catch( const fc::exception& e ) - { - elog( "suppressed exception in observer pre method:\n${e}", ( "e", e.to_detail_string() ) ); - } - observer_count++; - } - - try - { - result = eval.start_evaluate(eval_state, op, apply); - } - catch( const fc::exception& e ) - { - evaluation_exception = e.dynamic_copy_exception(); - } - - while( observer_count > 0 ) - { - --observer_count; - const auto& obs = eval_observers[observer_count]; - try - { - if( evaluation_exception ) - obs->post_evaluate(eval_state, op, apply, &eval, result); - else - obs->evaluation_failed(eval_state, op, apply, &eval, result); - } - catch( const fc::exception& e ) - { - elog( "suppressed exception in observer post method:\n${e}", ( "e", e.to_detail_string() ) ); - } - } - - if( evaluation_exception ) - evaluation_exception->dynamic_rethrow_exception(); - return result; + return eval.start_evaluate(eval_state, op, apply); } }; From 89fbb11bb6490f20772218531932b6a8162603ce Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Mon, 15 Feb 2016 12:33:21 -0500 Subject: [PATCH 2/3] Fix #492 - database corruption when closing The database was attempting to pop blocks for which there was no undo history. These changes make it impossible to pop blocks if there isn't a fork db history. --- libraries/chain/db_block.cpp | 5 +++-- libraries/chain/fork_database.cpp | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index 0bb841ee..d7c1e214 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -417,9 +417,10 @@ void database::pop_block() auto head_id = head_block_id(); optional head_block = fetch_block_by_id( head_id ); GRAPHENE_ASSERT( head_block.valid(), pop_empty_chain, "there are no blocks to pop" ); - pop_undo(); - _block_id_to_block.remove( head_id ); + _fork_db.pop_block(); + _block_id_to_block.remove( head_id ); + pop_undo(); _popped_tx.insert( _popped_tx.begin(), head_block->transactions.begin(), head_block->transactions.end() ); diff --git a/libraries/chain/fork_database.cpp b/libraries/chain/fork_database.cpp index c97b9395..83d4880c 100644 --- a/libraries/chain/fork_database.cpp +++ b/libraries/chain/fork_database.cpp @@ -38,7 +38,10 @@ void fork_database::reset() void fork_database::pop_block() { - if( _head ) _head = _head->prev.lock(); + FC_ASSERT( _head, "no blocks to pop" ); + auto prev = _head->prev.lock(); + FC_ASSERT( prev, "poping block would leave head block null" ); + _head = prev; } void fork_database::start_block(signed_block b) From c63b624caf96e91d5a655954f034c607b2aeb88a Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Mon, 15 Feb 2016 16:01:13 -0500 Subject: [PATCH 3/3] fix build errors and warnings This commit was rebased by theoreticalbts and assigned issue #581 Conflict with 146c0c4d8e24ce20f375b4c978995901464a8dae was resolved, minor improvements. --- .../graphene/chain/confidential_evaluator.hpp | 6 +- .../graphene/chain/market_evaluator.hpp | 6 +- .../db/include/graphene/db/object_id.hpp | 67 ++++--------------- 3 files changed, 20 insertions(+), 59 deletions(-) diff --git a/libraries/chain/include/graphene/chain/confidential_evaluator.hpp b/libraries/chain/include/graphene/chain/confidential_evaluator.hpp index 1f047c09..44d49e81 100644 --- a/libraries/chain/include/graphene/chain/confidential_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/confidential_evaluator.hpp @@ -26,9 +26,9 @@ namespace graphene { namespace chain { -class transfer_to_blind_operation; -class transfer_from_blind_operation; -class blind_transfer_operation; +struct transfer_to_blind_operation; +struct transfer_from_blind_operation; +struct blind_transfer_operation; class transfer_to_blind_evaluator : public evaluator { diff --git a/libraries/chain/include/graphene/chain/market_evaluator.hpp b/libraries/chain/include/graphene/chain/market_evaluator.hpp index 9a9c9ae4..9d653c07 100644 --- a/libraries/chain/include/graphene/chain/market_evaluator.hpp +++ b/libraries/chain/include/graphene/chain/market_evaluator.hpp @@ -31,9 +31,9 @@ namespace graphene { namespace chain { class asset_object; class asset_bitasset_data_object; class call_order_object; - class call_order_update_operation; - class limit_order_cancel_operation; - class limit_order_create_operation; + struct call_order_update_operation; + struct limit_order_cancel_operation; + struct limit_order_create_operation; class limit_order_create_evaluator : public evaluator { diff --git a/libraries/db/include/graphene/db/object_id.hpp b/libraries/db/include/graphene/db/object_id.hpp index 02304fc7..598ff3de 100644 --- a/libraries/db/include/graphene/db/object_id.hpp +++ b/libraries/db/include/graphene/db/object_id.hpp @@ -53,37 +53,22 @@ namespace graphene { namespace db { bool is_null()const { return number == 0; } explicit operator uint64_t()const { return number; } - friend bool operator == ( const object_id_type& a, const object_id_type& b ) - { - return a.number == b.number; - } - - friend bool operator != ( const object_id_type& a, const object_id_type& b ) - { - return a.number != b.number; - } + friend bool operator == ( const object_id_type& a, const object_id_type& b ) { return a.number == b.number; } + friend bool operator != ( const object_id_type& a, const object_id_type& b ) { return a.number != b.number; } + friend bool operator < ( const object_id_type& a, const object_id_type& b ) { return a.number < b.number; } + friend bool operator > ( const object_id_type& a, const object_id_type& b ) { return a.number > b.number; } object_id_type& operator++(int) { ++number; return *this; } object_id_type& operator++() { ++number; return *this; } - friend object_id_type operator+(const object_id_type& a, int delta ) { + friend object_id_type operator+(const object_id_type& a, int delta ) { return object_id_type( a.space(), a.type(), a.instance() + delta ); } - friend object_id_type operator+(const object_id_type& a, int64_t delta ) { + friend object_id_type operator+(const object_id_type& a, int64_t delta ) { return object_id_type( a.space(), a.type(), a.instance() + delta ); } friend size_t hash_value( object_id_type v ) { return std::hash()(v.number); } - friend bool operator< ( const object_id_type& a, const object_id_type& b ) - { - return a.number < b.number; - } - - friend bool operator> ( const object_id_type& a, const object_id_type& b ) - { - return a.number > b.number; - } - template< typename T > bool is() const { @@ -134,40 +119,16 @@ namespace graphene { namespace db { template const T& operator()(const DB& db)const { return db.get(*this); } - friend bool operator != ( const object_id& a, const object_id& b ) - { - return a.instance != b.instance; - } - friend bool operator != ( const object_id_type& a, const object_id& b ) - { - return a != object_id_type(b); - } - friend bool operator != ( const object_id& a, const object_id_type& b ) - { - return object_id_type(a) != b; - } + friend bool operator == ( const object_id& a, const object_id& b ) { return a.instance == b.instance; } + friend bool operator != ( const object_id& a, const object_id& b ) { return a.instance != b.instance; } + friend bool operator == ( const object_id_type& a, const object_id& b ) { return a == object_id_type(b); } + friend bool operator != ( const object_id_type& a, const object_id& b ) { return a != object_id_type(b); } + friend bool operator == ( const object_id& b, const object_id_type& a ) { return a == object_id_type(b); } + friend bool operator != ( const object_id& b, const object_id_type& a ) { return a != object_id_type(b); } + friend bool operator < ( const object_id& a, const object_id& b ) { return a.instance.value < b.instance.value; } + friend bool operator > ( const object_id& a, const object_id& b ) { return a.instance.value > b.instance.value; } - friend bool operator == ( const object_id& a, const object_id& b ) - { - return a.instance == b.instance; - } - friend bool operator == ( const object_id_type& a, const object_id& b ) - { - return a == object_id_type(b); - } - friend bool operator == ( const object_id& b, const object_id_type& a ) - { - return a == object_id_type(b); - } - friend bool operator < ( const object_id& a, const object_id& b ) - { - return a.instance.value < b.instance.value; - } - friend bool operator > ( const object_id& a, const object_id& b ) - { - return a.instance.value > b.instance.value; - } friend size_t hash_value( object_id v ) { return std::hash()(v.instance.value); } unsigned_int instance;