From 7cae3501f8120b23ef143d0baa3abfe413d4dbf4 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Wed, 16 Dec 2015 11:23:44 -0500 Subject: [PATCH] Fix operation history numbering #483 --- libraries/app/database_api.cpp | 6 +++++- libraries/chain/db_block.cpp | 20 ++++++++++++++---- .../chain/include/graphene/chain/database.hpp | 4 ++-- .../chain/include/graphene/chain/hardfork.hpp | 3 +++ .../account_history_plugin.cpp | 21 ++++++++++++++----- .../market_history/market_history_plugin.cpp | 6 +++--- 6 files changed, 45 insertions(+), 15 deletions(-) diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index bca3ac3c..ee44cf54 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -1555,8 +1555,12 @@ void database_api_impl::on_applied_block() const auto& ops = _db.get_applied_operations(); map< std::pair, vector> > subscribed_markets_ops; - for(const auto& op : ops) + for(const optional< operation_history_object >& o_op : ops) { + if( !o_op.valid() ) + continue; + const operation_history_object& op = *o_op; + std::pair market; switch(op.op.which()) { diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index c2685e8d..3cf91508 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -266,7 +267,18 @@ processed_transaction database::push_proposal(const proposal_object& proposal) remove(proposal); session.merge(); } catch ( const fc::exception& e ) { - _applied_ops.resize( old_applied_ops_size ); + if( head_block_time() <= HARDFORK_483_TIME ) + { + for( size_t i=old_applied_ops_size,n=_applied_ops.size(); iresult = result; } -const vector& database::get_applied_operations() const +const vector >& database::get_applied_operations() const { return _applied_ops; } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index c44e687d..7197d47c 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -163,7 +163,7 @@ namespace graphene { namespace chain { */ uint32_t push_applied_operation( const operation& op ); void set_applied_operation_result( uint32_t op_id, const operation_result& r ); - const vector& get_applied_operations()const; + const vector >& get_applied_operations()const; string to_pretty_string( const asset& a )const; @@ -472,7 +472,7 @@ namespace graphene { namespace chain { * order they occur and is cleared after the applied_block signal is * emited. */ - vector _applied_ops; + vector > _applied_ops; uint32_t _current_block_num = 0; uint16_t _current_trx_in_block = 0; diff --git a/libraries/chain/include/graphene/chain/hardfork.hpp b/libraries/chain/include/graphene/chain/hardfork.hpp index c5e50f03..c723ca67 100644 --- a/libraries/chain/include/graphene/chain/hardfork.hpp +++ b/libraries/chain/include/graphene/chain/hardfork.hpp @@ -27,3 +27,6 @@ #define HARDFORK_415_TIME (fc::time_point_sec( 1446652800 )) #define HARDFORK_416_TIME (fc::time_point_sec( 1446652800 )) #define HARDFORK_419_TIME (fc::time_point_sec( 1446652800 )) + +// #483 Operation history numbering change +#define HARDFORK_483_TIME (fc::time_point_sec( 1450378800 )) diff --git a/libraries/plugins/account_history/account_history_plugin.cpp b/libraries/plugins/account_history/account_history_plugin.cpp index f45610fb..21e50eed 100644 --- a/libraries/plugins/account_history/account_history_plugin.cpp +++ b/libraries/plugins/account_history/account_history_plugin.cpp @@ -71,13 +71,24 @@ account_history_plugin_impl::~account_history_plugin_impl() void account_history_plugin_impl::update_account_histories( const signed_block& b ) { graphene::chain::database& db = database(); - const vector& hist = db.get_applied_operations(); - for( auto op : hist ) + const vector >& hist = db.get_applied_operations(); + for( const optional< operation_history_object >& o_op : hist ) { // add to the operation history index - const auto& oho = db.create( [&]( operation_history_object& h ){ - h = op; - }); + const auto& oho = db.create( [&]( operation_history_object& h ) + { + if( o_op.valid() ) + h = *o_op; + } ); + + if( !o_op.valid() ) + { + ilog( "removing failed operation with ID: ${id}", ("id", oho.id) ); + db.remove( oho ); + continue; + } + + const operation_history_object& op = *o_op; // get the set of accounts this operation applies to flat_set impacted; diff --git a/libraries/plugins/market_history/market_history_plugin.cpp b/libraries/plugins/market_history/market_history_plugin.cpp index 5fe98b93..ce99a9a9 100644 --- a/libraries/plugins/market_history/market_history_plugin.cpp +++ b/libraries/plugins/market_history/market_history_plugin.cpp @@ -216,9 +216,9 @@ void market_history_plugin_impl::update_market_histories( const signed_block& b if( _tracked_buckets.size() == 0 ) return; graphene::chain::database& db = database(); - const vector& hist = db.get_applied_operations(); - for( auto op : hist ) - op.op.visit( operation_process_fill_order( _self, b.timestamp ) ); + const vector >& hist = db.get_applied_operations(); + for( const optional< operation_history_object >& o_op : hist ) + o_op->op.visit( operation_process_fill_order( _self, b.timestamp ) ); } } // end namespace detail