diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index 3d668fa1..0a7b3ad4 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -1625,8 +1625,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 ceb9d4be..e515ef98 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -257,6 +258,7 @@ processed_transaction database::push_proposal(const proposal_object& proposal) eval_state.operation_results.reserve(proposal.proposed_transaction.operations.size()); processed_transaction ptrx(proposal.proposed_transaction); eval_state._trx = &ptrx; + size_t old_applied_ops_size = _applied_ops.size(); try { auto session = _undo_db.start_undo_session(true); @@ -265,6 +267,18 @@ processed_transaction database::push_proposal(const proposal_object& proposal) remove(proposal); session.merge(); } catch ( const fc::exception& e ) { + 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 9326004c..6571ccf6 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -164,7 +164,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; @@ -473,7 +473,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 ddbdc4c4..de84c743 100644 --- a/libraries/chain/include/graphene/chain/hardfork.hpp +++ b/libraries/chain/include/graphene/chain/hardfork.hpp @@ -37,3 +37,5 @@ // #453 Hardfork to retroactively correct referral percentages #define HARDFORK_453_TIME (fc::time_point_sec( 1450288800 )) #define HARDFORK_480_TIME (fc::time_point_sec( 1450378800 )) +// #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