提交 3a48574c 编写于 作者: B Bart Wyatt

fixed stale reference if the transaction meta was moved (and it was), fixed...

fixed stale reference if the transaction meta was moved (and it was), fixed the lack of cleanup for the pending transaction metas
上级 4df1b433
......@@ -237,10 +237,10 @@ vector<account_name> apply_context::get_active_producers() const {
const bytes& apply_context::get_packed_transaction() {
if( !trx_meta.packed_trx.size() ) {
if (_cached_trx.empty()) {
auto size = fc::raw::pack_size(trx_meta.trx);
auto size = fc::raw::pack_size(trx_meta.trx());
_cached_trx.resize(size);
fc::datastream<char *> ds(_cached_trx.data(), size);
fc::raw::pack(ds, trx_meta.trx);
fc::raw::pack(ds, trx_meta.trx());
}
return _cached_trx;
......
......@@ -251,7 +251,7 @@ transaction_trace chain_controller::push_transaction(const packed_transaction& t
transaction_trace chain_controller::_push_transaction(const packed_transaction& trx) {
transaction_metadata mtrx( trx, get_chain_id(), head_block_time());
check_transaction_authorization(mtrx.trx, trx.signatures);
check_transaction_authorization(mtrx.trx(), trx.signatures);
auto result = _push_transaction(std::move(mtrx));
......@@ -278,7 +278,7 @@ static void record_locks_for_data_access(const vector<action_trace>& action_trac
transaction_trace chain_controller::_push_transaction( transaction_metadata&& data )
{
const transaction& trx = data.trx;
const transaction& trx = data.trx();
// If this is the first transaction pushed after applying a block, start a new undo session.
// This allows us to quickly rewind to the clean state of the head block, in case a new block arrives.
if( !_pending_block ) {
......@@ -494,9 +494,7 @@ signed_block chain_controller::_generate_block( block_timestamp_type when,
auto result = move( *_pending_block );
_pending_block_trace.reset();
_pending_block.reset();
_pending_block_session.reset();
clear_pending();
if (!(skip&skip_fork_db)) {
_fork_db.push_block(result);
......@@ -524,6 +522,7 @@ void chain_controller::clear_pending()
_pending_block_trace.reset();
_pending_block.reset();
_pending_block_session.reset();
_pending_transaction_metas.clear();
} FC_CAPTURE_AND_RETHROW() }
//////////////////// private methods ////////////////////
......@@ -1397,7 +1396,7 @@ static void log_handled_exceptions(const transaction& trx) {
transaction_trace chain_controller::__apply_transaction( transaction_metadata& meta ) {
transaction_trace result(meta.id);
for (const auto &act : meta.trx.actions) {
for (const auto &act : meta.trx().actions) {
apply_context context(*this, _db, act, meta);
context.exec();
fc::move_append(result.action_traces, std::move(context.results.applied_actions));
......@@ -1418,7 +1417,7 @@ transaction_trace chain_controller::__apply_transaction( transaction_metadata& m
}
update_usage(meta, act_usage);
record_transaction(meta.trx);
record_transaction(meta.trx());
return result;
}
......@@ -1434,7 +1433,7 @@ transaction_trace chain_controller::_apply_transaction( transaction_metadata& me
throw;
}
// log exceptions we can handle with the error handle, throws otherwise
log_handled_exceptions(meta.trx);
log_handled_exceptions(meta.trx());
return _apply_error( meta );
}
......@@ -1464,7 +1463,7 @@ transaction_trace chain_controller::_apply_error( transaction_metadata& meta ) {
}
update_usage(meta, act_usage);
record_transaction(meta.trx);
record_transaction(meta.trx());
temp_session.squash();
return result;
......@@ -1535,7 +1534,7 @@ void chain_controller::update_usage( transaction_metadata& meta, uint32_t act_us
{
set<std::pair<account_name, permission_name>> authorizing_accounts;
for( const auto& act : meta.trx.actions )
for( const auto& act : meta.trx().actions )
for( const auto& auth : act.authorization )
authorizing_accounts.emplace( auth.actor, auth.permission );
......
......@@ -8,16 +8,15 @@
namespace eosio { namespace chain {
struct transaction_metadata {
class transaction_metadata {
// transaction_metadata( const transaction& t )
// :trx(t)
// ,id(trx.id()) {}
public:
transaction_metadata( const transaction& t, const time_point& published, const account_name& sender, uint32_t sender_id, const char* raw_data, size_t raw_size )
:trx(t)
,id(trx.id())
:id(t.id())
,published(published)
,sender(sender),sender_id(sender_id),raw_data(raw_data),raw_size(raw_size)
,sender(sender),sender_id(sender_id),raw_data(raw_data),raw_size(raw_size),_trx(&t)
{}
transaction_metadata( const packed_transaction& t, chain_id_type chainid, const time_point& published );
......@@ -32,7 +31,6 @@ struct transaction_metadata {
// things for signed/packed transactions
optional<flat_set<public_key_type>> signing_keys;
const transaction& trx;
transaction_id_type id;
uint32_t region_id = 0;
......@@ -55,7 +53,17 @@ struct transaction_metadata {
optional<const vector<shard_lock>*> allowed_read_locks;
optional<const vector<shard_lock>*> allowed_write_locks;
const transaction& trx() const{
if (decompressed_trx) {
return *decompressed_trx;
} else {
return *_trx;
}
}
static digest_type calculate_transaction_merkle_root( const vector<transaction_metadata>& metas );
private:
const transaction* _trx;
};
} } // eosio::chain
......
......@@ -7,7 +7,6 @@ namespace eosio { namespace chain {
transaction_metadata::transaction_metadata( const packed_transaction& t, chain_id_type chainid, const time_point& published )
:raw_trx(t.get_raw_transaction())
,decompressed_trx(fc::raw::unpack<transaction>(*raw_trx))
,trx(*decompressed_trx)
,id(decompressed_trx->id())
,bandwidth_usage( (uint32_t)fc::raw::pack_size(t) )
,published(published)
......@@ -19,8 +18,9 @@ digest_type transaction_metadata::calculate_transaction_merkle_root( const vecto
vector<digest_type> ids;
ids.reserve(metas.size());
for( const auto& t : metas )
ids.emplace_back( t.id );
for( const auto& t : metas ) {
ids.emplace_back(t.id);
}
return merkle( std::move(ids) );
}
......
......@@ -703,14 +703,14 @@ class transaction_api : public context_aware_api {
}
int expiration() {
return context.trx_meta.trx.expiration.sec_since_epoch();
return context.trx_meta.trx().expiration.sec_since_epoch();
}
int tapos_block_num() {
return context.trx_meta.trx.ref_block_num;
return context.trx_meta.trx().ref_block_num;
}
int tapos_block_prefix() {
return context.trx_meta.trx.ref_block_prefix;
return context.trx_meta.trx().ref_block_prefix;
}
void send_inline( array_ptr<char> data, size_t data_len ) {
......
......@@ -35,6 +35,21 @@ BOOST_AUTO_TEST_CASE( schedule_test ) { try {
ilog("exiting");
} FC_LOG_AND_RETHROW() }/// schedule_test
BOOST_AUTO_TEST_CASE( push_block ) { try {
tester test1, test2;
for (uint32 i = 0; i < 1000; ++i) {
test2.control->push_block(test1.produce_block());
}
test1.create_account(N(alice), asset::from_string("100.0000 EOS"));
test2.control->push_block(test1.produce_block());
test1.transfer(N(inita), N(alice), asset(1000), "memo");
test2.control->push_block(test1.produce_block());
} FC_LOG_AND_RETHROW() }/// schedule_test
BOOST_AUTO_TEST_SUITE_END()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册