mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-04 19:16:23 +01:00
lightningd: don't always wrap each command in a db transaction.
This shows the benefits of batching when being slammed by autoclean: Before: ``` plugin-autoclean: last 1000 deletes took 6699022 nsec each plugin-autoclean: last 1000 deletes took 6734025 nsec each plugin-autoclean: last 1000 deletes took 6681189 nsec each plugin-autoclean: last 1000 deletes took 6597148 nsec each plugin-autoclean: last 1000 deletes took 6637085 nsec each plugin-autoclean: last 1000 deletes took 6801425 nsec each plugin-autoclean: last 1000 deletes took 6788572 nsec each plugin-autoclean: last 1000 deletes took 6603641 nsec each plugin-autoclean: last 1000 deletes took 6642947 nsec each plugin-autoclean: last 1000 deletes took 6590495 nsec each plugin-autoclean: last 1000 deletes took 6695076 nsec each plugin-autoclean: last 1000 deletes took 6477981 nsec each ``` After: ``` plugin-autoclean: last 1000 deletes took 342764 nsec each plugin-autoclean: last 1000 deletes took 375031 nsec each plugin-autoclean: last 1000 deletes took 357564 nsec each plugin-autoclean: last 1000 deletes took 381581 nsec each plugin-autoclean: last 1000 deletes took 337989 nsec each plugin-autoclean: last 1000 deletes took 329391 nsec each plugin-autoclean: last 1000 deletes took 328322 nsec each plugin-autoclean: last 1000 deletes took 372810 nsec each plugin-autoclean: last 1000 deletes took 351228 nsec each plugin-autoclean: last 1000 deletes took 413885 nsec each plugin-autoclean: last 1000 deletes took 348317 nsec each ``` Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
8b7a8265e7
commit
555b8a2f7a
1 changed files with 12 additions and 10 deletions
|
@ -948,9 +948,7 @@ parse_request(struct json_connection *jcon, const jsmntok_t tok[])
|
||||||
rpc_hook->custom_replace = NULL;
|
rpc_hook->custom_replace = NULL;
|
||||||
rpc_hook->custom_buffer = NULL;
|
rpc_hook->custom_buffer = NULL;
|
||||||
|
|
||||||
db_begin_transaction(jcon->ld->wallet->db);
|
|
||||||
completed = plugin_hook_call_rpc_command(jcon->ld, c->id, rpc_hook);
|
completed = plugin_hook_call_rpc_command(jcon->ld, c->id, rpc_hook);
|
||||||
db_commit_transaction(jcon->ld->wallet->db);
|
|
||||||
|
|
||||||
/* If it's deferred, mark it (otherwise, it's completed) */
|
/* If it's deferred, mark it (otherwise, it's completed) */
|
||||||
if (!completed)
|
if (!completed)
|
||||||
|
@ -1007,6 +1005,7 @@ static struct io_plan *read_json(struct io_conn *conn,
|
||||||
struct json_connection *jcon)
|
struct json_connection *jcon)
|
||||||
{
|
{
|
||||||
bool complete;
|
bool complete;
|
||||||
|
bool in_transaction = false;
|
||||||
|
|
||||||
if (jcon->len_read)
|
if (jcon->len_read)
|
||||||
log_io(jcon->log, LOG_IO_IN, NULL, "",
|
log_io(jcon->log, LOG_IO_IN, NULL, "",
|
||||||
|
@ -1023,6 +1022,7 @@ static struct io_plan *read_json(struct io_conn *conn,
|
||||||
return io_wait(conn, conn, read_json, jcon);
|
return io_wait(conn, conn, read_json, jcon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
again:
|
||||||
if (!json_parse_input(&jcon->input_parser, &jcon->input_toks,
|
if (!json_parse_input(&jcon->input_parser, &jcon->input_toks,
|
||||||
jcon->buffer, jcon->used,
|
jcon->buffer, jcon->used,
|
||||||
&complete)) {
|
&complete)) {
|
||||||
|
@ -1030,6 +1030,8 @@ static struct io_plan *read_json(struct io_conn *conn,
|
||||||
jcon, "null",
|
jcon, "null",
|
||||||
tal_fmt(tmpctx, "Invalid token in json input: '%s'",
|
tal_fmt(tmpctx, "Invalid token in json input: '%s'",
|
||||||
tal_strndup(tmpctx, jcon->buffer, jcon->used)));
|
tal_strndup(tmpctx, jcon->buffer, jcon->used)));
|
||||||
|
if (in_transaction)
|
||||||
|
db_commit_transaction(jcon->ld->wallet->db);
|
||||||
return io_halfclose(conn);
|
return io_halfclose(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1046,6 +1048,10 @@ static struct io_plan *read_json(struct io_conn *conn,
|
||||||
goto read_more;
|
goto read_more;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!in_transaction) {
|
||||||
|
db_begin_transaction(jcon->ld->wallet->db);
|
||||||
|
in_transaction = true;
|
||||||
|
}
|
||||||
parse_request(jcon, jcon->input_toks);
|
parse_request(jcon, jcon->input_toks);
|
||||||
|
|
||||||
/* Remove first {}. */
|
/* Remove first {}. */
|
||||||
|
@ -1057,16 +1063,12 @@ static struct io_plan *read_json(struct io_conn *conn,
|
||||||
jsmn_init(&jcon->input_parser);
|
jsmn_init(&jcon->input_parser);
|
||||||
toks_reset(jcon->input_toks);
|
toks_reset(jcon->input_toks);
|
||||||
|
|
||||||
/* If we have more to process, try again. FIXME: this still gets
|
if (jcon->used)
|
||||||
* first priority in io_loop, so can starve others. Hack would be
|
goto again;
|
||||||
* a (non-zero) timer, but better would be to have io_loop avoid
|
|
||||||
* such livelock */
|
|
||||||
if (jcon->used) {
|
|
||||||
jcon->len_read = 0;
|
|
||||||
return io_always(conn, read_json, jcon);
|
|
||||||
}
|
|
||||||
|
|
||||||
read_more:
|
read_more:
|
||||||
|
if (in_transaction)
|
||||||
|
db_commit_transaction(jcon->ld->wallet->db);
|
||||||
return io_read_partial(conn, jcon->buffer + jcon->used,
|
return io_read_partial(conn, jcon->buffer + jcon->used,
|
||||||
tal_count(jcon->buffer) - jcon->used,
|
tal_count(jcon->buffer) - jcon->used,
|
||||||
&jcon->len_read, read_json, jcon);
|
&jcon->len_read, read_json, jcon);
|
||||||
|
|
Loading…
Add table
Reference in a new issue