Skip to content

Commit 2284d35

Browse files
committed
Use command line --abi-serializer-max-time-ms of chain_plugin for abi serializer deadline.
1 parent aa07f3b commit 2284d35

File tree

5 files changed

+47
-31
lines changed

5 files changed

+47
-31
lines changed

libraries/chain/include/eosio/chain/config.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ const static uint32_t setcode_ram_bytes_multiplier = 10; ///< multip
9292
const static uint32_t hashing_checktime_block_size = 10*1024; /// call checktime from hashing intrinsic once per this number of bytes
9393

9494
const static eosio::chain::wasm_interface::vm_type default_wasm_runtime = eosio::chain::wasm_interface::vm_type::binaryen;
95-
const static fc::microseconds default_abi_serializer_max_time_ms = fc::microseconds(15*1000);
95+
const static uint32_t default_abi_serializer_max_time_ms = 15*1000; ///< default deadline for abi serialization methods
9696

9797
/**
9898
* The number of sequential blocks produced by a single producer

plugins/chain_plugin/chain_plugin.cpp

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ class chain_plugin_impl {
128128
fc::optional<chain_id_type> chain_id;
129129
//txn_msg_rate_limits rate_limits;
130130
fc::optional<vm_type> wasm_runtime;
131+
fc::microseconds abi_serializer_max_time_ms;
132+
131133

132134
// retained references to channels for easy publication
133135
channels::pre_accepted_block::channel_type& pre_accepted_block_channel;
@@ -174,7 +176,8 @@ void chain_plugin::set_program_options(options_description& cli, options_descrip
174176
"the location of the blocks directory (absolute path or relative to application data dir)")
175177
("checkpoint", bpo::value<vector<string>>()->composing(), "Pairs of [BLOCK_NUM,BLOCK_ID] that should be enforced as checkpoints.")
176178
("wasm-runtime", bpo::value<eosio::chain::wasm_interface::vm_type>()->value_name("wavm/binaryen"), "Override default WASM runtime")
177-
("abi-serializer-max-time-ms", bpo::value<uint32_t>(), "Override default maximum ABI serialization time allowed in ms")
179+
("abi-serializer-max-time-ms", bpo::value<uint32_t>()->default_value(config::default_abi_serializer_max_time_ms),
180+
"Override default maximum ABI serialization time allowed in ms")
178181
("chain-state-db-size-mb", bpo::value<uint64_t>()->default_value(config::default_state_size / (1024 * 1024)), "Maximum size (in MB) of the chain state database")
179182
("reversible-blocks-db-size-mb", bpo::value<uint64_t>()->default_value(config::default_reversible_cache_size / (1024 * 1024)), "Maximum size (in MB) of the reversible blocks database")
180183
("contracts-console", bpo::bool_switch()->default_value(false),
@@ -327,7 +330,7 @@ void chain_plugin::plugin_initialize(const variables_map& options) {
327330
my->wasm_runtime = options.at( "wasm-runtime" ).as<vm_type>();
328331

329332
if(options.count("abi-serializer-max-time-ms"))
330-
my->chain_config->abi_serializer_max_time_ms = fc::microseconds(options.at("abi-serializer-max-time-ms").as<uint32_t>() * 1000);
333+
my->abi_serializer_max_time_ms = fc::microseconds(options.at("abi-serializer-max-time-ms").as<uint32_t>() * 1000);
331334

332335
my->chain_config->blocks_dir = my->blocks_dir;
333336
my->chain_config->state_dir = app().data_dir() / config::default_state_dir_name;
@@ -573,7 +576,7 @@ void chain_plugin::plugin_shutdown() {
573576
}
574577

575578
chain_apis::read_write chain_plugin::get_read_write_api() {
576-
return chain_apis::read_write(chain());
579+
return chain_apis::read_write(chain(), get_abi_serializer_max_time());
577580
}
578581

579582
void chain_plugin::accept_block(const signed_block_ptr& block ) {
@@ -744,6 +747,11 @@ chain::chain_id_type chain_plugin::get_chain_id()const {
744747
return *my->chain_id;
745748
}
746749

750+
fc::microseconds chain_plugin::get_abi_serializer_max_time() const {
751+
return my->abi_serializer_max_time_ms;
752+
}
753+
754+
747755
namespace chain_apis {
748756

749757
const string read_only::KEYi64 = "i64";
@@ -939,12 +947,12 @@ read_only::get_producers_result read_only::get_producers( const read_only::get_p
939947
}
940948
copy_inline_row(*kv_index.find(boost::make_tuple(table_id->id, it->primary_key)), data);
941949
if (p.json)
942-
result.rows.emplace_back(abis.binary_to_variant(abis.get_table_type(N(producers)), data, db.get_abi_serializer_max_time_ms()));
950+
result.rows.emplace_back(abis.binary_to_variant(abis.get_table_type(N(producers)), data, abi_serializer_max_time));
943951
else
944952
result.rows.emplace_back(fc::variant(data));
945953
}
946954

947-
result.total_producer_vote_weight = get_global_row(d, abi, abis, db.get_abi_serializer_max_time_ms())["total_producer_vote_weight"].as_double();
955+
result.total_producer_vote_weight = get_global_row(d, abi, abis, abi_serializer_max_time)["total_producer_vote_weight"].as_double();
948956
return result;
949957
}
950958

@@ -995,7 +1003,7 @@ fc::variant read_only::get_block(const read_only::get_block_params& params) cons
9951003
EOS_ASSERT( block, unknown_block_exception, "Could not find block: ${block}", ("block", params.block_num_or_id));
9961004

9971005
fc::variant pretty_output;
998-
abi_serializer::to_variant(*block, pretty_output, make_resolver(this), db.get_abi_serializer_max_time_ms());
1006+
abi_serializer::to_variant(*block, pretty_output, make_resolver(this), abi_serializer_max_time);
9991007

10001008
uint32_t ref_block_prefix = block->id()._hash[1];
10011009

@@ -1043,7 +1051,7 @@ void read_write::push_transaction(const read_write::push_transaction_params& par
10431051
auto pretty_input = std::make_shared<packed_transaction>();
10441052
auto resolver = make_resolver(this);
10451053
try {
1046-
abi_serializer::from_variant(params, *pretty_input, resolver, db.get_abi_serializer_max_time_ms());
1054+
abi_serializer::from_variant(params, *pretty_input, resolver, abi_serializer_max_time);
10471055
} EOS_RETHROW_EXCEPTIONS(chain::packed_transaction_type_exception, "Invalid packed transaction")
10481056

10491057
app().get_method<incoming::methods::transaction_async>()(pretty_input, true, [this, next](const fc::static_variant<fc::exception_ptr, transaction_trace_ptr>& result) -> void{
@@ -1054,7 +1062,7 @@ void read_write::push_transaction(const read_write::push_transaction_params& par
10541062

10551063
try {
10561064
fc::variant pretty_output;
1057-
pretty_output = db.to_variant_with_abi(*trx_trace_ptr);
1065+
pretty_output = db.to_variant_with_abi(*trx_trace_ptr, abi_serializer_max_time);
10581066
//abi_serializer::to_variant(*trx_trace_ptr, pretty_output, resolver);
10591067

10601068
chain::transaction_id_type id = trx_trace_ptr->id;
@@ -1212,7 +1220,7 @@ read_only::get_account_results read_only::get_account( const get_account_params&
12121220
if ( it != idx.end() ) {
12131221
vector<char> data;
12141222
copy_inline_row(*it, data);
1215-
result.total_resources = abis.binary_to_variant( "user_resources", data, db.get_abi_serializer_max_time_ms() );
1223+
result.total_resources = abis.binary_to_variant( "user_resources", data, abi_serializer_max_time );
12161224
}
12171225
}
12181226

@@ -1223,7 +1231,7 @@ read_only::get_account_results read_only::get_account( const get_account_params&
12231231
if ( it != idx.end() ) {
12241232
vector<char> data;
12251233
copy_inline_row(*it, data);
1226-
result.self_delegated_bandwidth = abis.binary_to_variant( "delegated_bandwidth", data, db.get_abi_serializer_max_time_ms() );
1234+
result.self_delegated_bandwidth = abis.binary_to_variant( "delegated_bandwidth", data, abi_serializer_max_time );
12271235
}
12281236
}
12291237

@@ -1234,7 +1242,7 @@ read_only::get_account_results read_only::get_account( const get_account_params&
12341242
if ( it != idx.end() ) {
12351243
vector<char> data;
12361244
copy_inline_row(*it, data);
1237-
result.refund_request = abis.binary_to_variant( "refund_request", data, db.get_abi_serializer_max_time_ms() );
1245+
result.refund_request = abis.binary_to_variant( "refund_request", data, abi_serializer_max_time );
12381246
}
12391247
}
12401248

@@ -1245,7 +1253,7 @@ read_only::get_account_results read_only::get_account( const get_account_params&
12451253
if ( it != idx.end() ) {
12461254
vector<char> data;
12471255
copy_inline_row(*it, data);
1248-
result.voter_info = abis.binary_to_variant( "voter_info", data, db.get_abi_serializer_max_time_ms() );
1256+
result.voter_info = abis.binary_to_variant( "voter_info", data, abi_serializer_max_time );
12491257
}
12501258
}
12511259
}
@@ -1271,7 +1279,7 @@ read_only::abi_json_to_bin_result read_only::abi_json_to_bin( const read_only::a
12711279
auto action_type = abis.get_action_type(params.action);
12721280
EOS_ASSERT(!action_type.empty(), action_validate_exception, "Unknown action ${action} in contract ${contract}", ("action", params.action)("contract", params.code));
12731281
try {
1274-
result.binargs = abis.variant_to_binary(action_type, params.args, db.get_abi_serializer_max_time_ms());
1282+
result.binargs = abis.variant_to_binary(action_type, params.args, abi_serializer_max_time);
12751283
} EOS_RETHROW_EXCEPTIONS(chain::invalid_action_args_exception,
12761284
"'${args}' is invalid args for action '${action}' code '${code}'. expected '${proto}'",
12771285
("args", params.args)("action", params.action)("code", params.code)("proto", action_abi_to_variant(abi, action_type)))
@@ -1288,7 +1296,7 @@ read_only::abi_bin_to_json_result read_only::abi_bin_to_json( const read_only::a
12881296
abi_def abi;
12891297
if( abi_serializer::to_abi(code_account.abi, abi) ) {
12901298
abi_serializer abis( abi );
1291-
result.args = abis.binary_to_variant( abis.get_action_type( params.action ), params.binargs, db.get_abi_serializer_max_time_ms() );
1299+
result.args = abis.binary_to_variant( abis.get_action_type( params.action ), params.binargs, abi_serializer_max_time );
12921300
} else {
12931301
EOS_ASSERT(false, abi_not_found_exception, "No ABI found for ${contract}", ("contract", params.code));
12941302
}
@@ -1299,7 +1307,7 @@ read_only::get_required_keys_result read_only::get_required_keys( const get_requ
12991307
transaction pretty_input;
13001308
auto resolver = make_resolver(this);
13011309
try {
1302-
abi_serializer::from_variant(params.transaction, pretty_input, resolver, db.get_abi_serializer_max_time_ms());
1310+
abi_serializer::from_variant(params.transaction, pretty_input, resolver, abi_serializer_max_time);
13031311
} EOS_RETHROW_EXCEPTIONS(chain::transaction_type_exception, "Invalid transaction")
13041312

13051313
auto required_keys_set = db.get_authorization_manager().get_required_keys(pretty_input, params.available_keys);

plugins/chain_plugin/include/eosio/chain_plugin/chain_plugin.hpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,13 @@ uint64_t convert_to_type(const string& str, const string& desc);
6060

6161
class read_only {
6262
const controller& db;
63+
const fc::microseconds abi_serializer_max_time;
6364

6465
public:
6566
static const string KEYi64;
6667

67-
read_only(const controller& db)
68-
: db(db) {}
68+
read_only(const controller& db, const fc::microseconds& abi_serializer_max_time)
69+
: db(db), abi_serializer_max_time(abi_serializer_max_time) {}
6970

7071
using get_info_params = empty;
7172

@@ -328,7 +329,7 @@ class read_only {
328329
copy_inline_row(*itr, data);
329330

330331
if (p.json) {
331-
result.rows.emplace_back(abis.binary_to_variant(abis.get_table_type(p.table), data, db.get_abi_serializer_max_time_ms()));
332+
result.rows.emplace_back(abis.binary_to_variant(abis.get_table_type(p.table), data, abi_serializer_max_time));
332333
} else {
333334
result.rows.emplace_back(fc::variant(data));
334335
}
@@ -349,8 +350,10 @@ class read_only {
349350

350351
class read_write {
351352
controller& db;
353+
const fc::microseconds abi_serializer_max_time;
352354
public:
353-
read_write(controller& db) : db(db) {}
355+
read_write(controller& db, const fc::microseconds& abi_serializer_max_time)
356+
: db(db), abi_serializer_max_time(abi_serializer_max_time) {}
354357

355358
using push_block_params = chain::signed_block;
356359
using push_block_results = empty;
@@ -385,7 +388,7 @@ class chain_plugin : public plugin<chain_plugin> {
385388
void plugin_startup();
386389
void plugin_shutdown();
387390

388-
chain_apis::read_only get_read_only_api() const { return chain_apis::read_only(chain()); }
391+
chain_apis::read_only get_read_only_api() const { return chain_apis::read_only(chain(), get_abi_serializer_max_time()); }
389392
chain_apis::read_write get_read_write_api();
390393

391394
void accept_block( const chain::signed_block_ptr& block );
@@ -412,6 +415,7 @@ class chain_plugin : public plugin<chain_plugin> {
412415
const controller& chain() const;
413416

414417
chain::chain_id_type get_chain_id() const;
418+
fc::microseconds get_abi_serializer_max_time() const;
415419

416420
private:
417421
unique_ptr<class chain_plugin_impl> my;

plugins/history_plugin/history_plugin.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ namespace eosio {
315315
edump((params));
316316
auto& chain = history->chain_plug->chain();
317317
const auto& db = chain.db();
318+
const auto abi_serializer_max_time = history->chain_plug->get_abi_serializer_max_time();
318319

319320
const auto& idx = db.get_index<account_history_index, by_account_action_seq>();
320321

@@ -366,7 +367,7 @@ namespace eosio {
366367
start_itr->action_sequence_num,
367368
start_itr->account_sequence_num,
368369
a.block_num, a.block_time,
369-
chain.to_variant_with_abi(t)
370+
chain.to_variant_with_abi(t, abi_serializer_max_time)
370371
});
371372

372373
end_time = fc::time_point::now();
@@ -382,6 +383,7 @@ namespace eosio {
382383

383384
read_only::get_transaction_result read_only::get_transaction( const read_only::get_transaction_params& p )const {
384385
auto& chain = history->chain_plug->chain();
386+
const auto abi_serializer_max_time = history->chain_plug->get_abi_serializer_max_time();
385387
auto short_id = fc::variant(p.id).as_string().substr(0,8);
386388

387389
const auto& db = chain.db();
@@ -410,7 +412,7 @@ namespace eosio {
410412
fc::datastream<const char*> ds( itr->packed_action_trace.data(), itr->packed_action_trace.size() );
411413
action_trace t;
412414
fc::raw::unpack( ds, t );
413-
result.traces.emplace_back( chain.to_variant_with_abi(t) );
415+
result.traces.emplace_back( chain.to_variant_with_abi(t, abi_serializer_max_time) );
414416

415417
++itr;
416418
}
@@ -429,7 +431,7 @@ namespace eosio {
429431
auto mtrx = transaction_metadata(pt);
430432
if (mtrx.id == result.id) {
431433
fc::mutable_variant_object r("receipt", receipt);
432-
r("trx", chain.to_variant_with_abi(mtrx.trx));
434+
r("trx", chain.to_variant_with_abi(mtrx.trx, abi_serializer_max_time));
433435
result.trx = move(r);
434436
break;
435437
}
@@ -457,7 +459,7 @@ namespace eosio {
457459
result.block_num = *p.block_num_hint;
458460
result.block_time = blk->timestamp;
459461
fc::mutable_variant_object r("receipt", receipt);
460-
r("trx", chain.to_variant_with_abi(mtrx.trx));
462+
r("trx", chain.to_variant_with_abi(mtrx.trx, abi_serializer_max_time));
461463
result.trx = move(r);
462464
found = true;
463465
break;

plugins/txn_test_gen_plugin/txn_test_gen_plugin.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ struct txn_test_gen_plugin_impl {
122122

123123
controller& cc = app().get_plugin<chain_plugin>().chain();
124124
auto chainid = app().get_plugin<chain_plugin>().get_chain_id();
125+
auto abi_serializer_max_time = app().get_plugin<chain_plugin>().get_abi_serializer_max_time();
125126

126127
fc::crypto::private_key txn_test_receiver_A_priv_key = fc::crypto::private_key::regenerate(fc::sha256(std::string(64, 'a')));
127128
fc::crypto::private_key txn_test_receiver_B_priv_key = fc::crypto::private_key::regenerate(fc::sha256(std::string(64, 'b')));
@@ -187,31 +188,31 @@ struct txn_test_gen_plugin_impl {
187188
act.account = N(txn.test.t);
188189
act.name = N(create);
189190
act.authorization = vector<permission_level>{{newaccountC,config::active_name}};
190-
act.data = eosio_token_serializer.variant_to_binary("create", fc::json::from_string("{\"issuer\":\"txn.test.t\",\"maximum_supply\":\"1000000000.0000 CUR\"}}"), cc.get_abi_serializer_max_time_ms());
191+
act.data = eosio_token_serializer.variant_to_binary("create", fc::json::from_string("{\"issuer\":\"txn.test.t\",\"maximum_supply\":\"1000000000.0000 CUR\"}}"), abi_serializer_max_time);
191192
trx.actions.push_back(act);
192193
}
193194
{
194195
action act;
195196
act.account = N(txn.test.t);
196197
act.name = N(issue);
197198
act.authorization = vector<permission_level>{{newaccountC,config::active_name}};
198-
act.data = eosio_token_serializer.variant_to_binary("issue", fc::json::from_string("{\"to\":\"txn.test.t\",\"quantity\":\"600.0000 CUR\",\"memo\":\"\"}"), cc.get_abi_serializer_max_time_ms());
199+
act.data = eosio_token_serializer.variant_to_binary("issue", fc::json::from_string("{\"to\":\"txn.test.t\",\"quantity\":\"600.0000 CUR\",\"memo\":\"\"}"), abi_serializer_max_time);
199200
trx.actions.push_back(act);
200201
}
201202
{
202203
action act;
203204
act.account = N(txn.test.t);
204205
act.name = N(transfer);
205206
act.authorization = vector<permission_level>{{newaccountC,config::active_name}};
206-
act.data = eosio_token_serializer.variant_to_binary("transfer", fc::json::from_string("{\"from\":\"txn.test.t\",\"to\":\"txn.test.a\",\"quantity\":\"200.0000 CUR\",\"memo\":\"\"}"), cc.get_abi_serializer_max_time_ms());
207+
act.data = eosio_token_serializer.variant_to_binary("transfer", fc::json::from_string("{\"from\":\"txn.test.t\",\"to\":\"txn.test.a\",\"quantity\":\"200.0000 CUR\",\"memo\":\"\"}"), abi_serializer_max_time);
207208
trx.actions.push_back(act);
208209
}
209210
{
210211
action act;
211212
act.account = N(txn.test.t);
212213
act.name = N(transfer);
213214
act.authorization = vector<permission_level>{{newaccountC,config::active_name}};
214-
act.data = eosio_token_serializer.variant_to_binary("transfer", fc::json::from_string("{\"from\":\"txn.test.t\",\"to\":\"txn.test.b\",\"quantity\":\"200.0000 CUR\",\"memo\":\"\"}"), cc.get_abi_serializer_max_time_ms());
215+
act.data = eosio_token_serializer.variant_to_binary("transfer", fc::json::from_string("{\"from\":\"txn.test.t\",\"to\":\"txn.test.b\",\"quantity\":\"200.0000 CUR\",\"memo\":\"\"}"), abi_serializer_max_time);
215216
trx.actions.push_back(act);
216217
}
217218

@@ -242,22 +243,23 @@ struct txn_test_gen_plugin_impl {
242243
running = true;
243244

244245
controller& cc = app().get_plugin<chain_plugin>().chain();
246+
auto abi_serializer_max_time = app().get_plugin<chain_plugin>().get_abi_serializer_max_time();
245247
//create the actions here
246248
act_a_to_b.account = N(txn.test.t);
247249
act_a_to_b.name = N(transfer);
248250
act_a_to_b.authorization = vector<permission_level>{{name("txn.test.a"),config::active_name}};
249251
act_a_to_b.data = eosio_token_serializer.variant_to_binary("transfer",
250252
fc::json::from_string(fc::format_string("{\"from\":\"txn.test.a\",\"to\":\"txn.test.b\",\"quantity\":\"1.0000 CUR\",\"memo\":\"${l}\"}",
251253
fc::mutable_variant_object()("l", salt))),
252-
cc.get_abi_serializer_max_time_ms());
254+
abi_serializer_max_time);
253255

254256
act_b_to_a.account = N(txn.test.t);
255257
act_b_to_a.name = N(transfer);
256258
act_b_to_a.authorization = vector<permission_level>{{name("txn.test.b"),config::active_name}};
257259
act_b_to_a.data = eosio_token_serializer.variant_to_binary("transfer",
258260
fc::json::from_string(fc::format_string("{\"from\":\"txn.test.b\",\"to\":\"txn.test.a\",\"quantity\":\"1.0000 CUR\",\"memo\":\"${l}\"}",
259261
fc::mutable_variant_object()("l", salt))),
260-
cc.get_abi_serializer_max_time_ms());
262+
abi_serializer_max_time);
261263

262264
timer_timeout = period;
263265
batch = batch_size/2;

0 commit comments

Comments
 (0)