diff --git a/src/box/call.c b/src/box/call.c index 48b19f81ac3e672b1fd3e592691e48f1ff415a47..30976e4ea37c82a93563e78fe5007fcdd30782bf 100644 --- a/src/box/call.c +++ b/src/box/call.c @@ -121,23 +121,13 @@ box_process_call(struct call_request *request, struct port *port) SC_FUNCTION, tt_cstr(name, name_len))) == 0) { rc = box_lua_call(name, name_len, &args, port); } - - struct txn *txn = in_txn(); - if (rc != 0) { - if (txn != NULL) - txn_rollback(txn); - fiber_gc(); + if (rc != 0) return -1; - } - - if (txn != NULL) { + if (in_txn() != NULL) { diag_set(ClientError, ER_FUNCTION_TX_ACTIVE); port_destroy(port); - txn_rollback(txn); - fiber_gc(); return -1; } - return 0; } @@ -153,21 +143,11 @@ box_process_eval(struct call_request *request, struct port *port) request->args_end - request->args); const char *expr = request->expr; uint32_t expr_len = mp_decode_strl(&expr); - struct txn *txn; - if (box_lua_eval(expr, expr_len, &args, port) != 0) { - txn = in_txn(); - if (txn != NULL) - txn_rollback(txn); - fiber_gc(); + if (box_lua_eval(expr, expr_len, &args, port) != 0) return -1; - } - - txn = in_txn(); - if (txn != NULL) { + if (in_txn() != 0) { diag_set(ClientError, ER_FUNCTION_TX_ACTIVE); port_destroy(port); - txn_rollback(txn); - fiber_gc(); return -1; } return 0; diff --git a/src/box/txn.c b/src/box/txn.c index c9b02a23f8c674afe4e906fa636203abeb9a19b2..05b1195e482c47f4e431b414ce3ca9c16bec7bd3 100644 --- a/src/box/txn.c +++ b/src/box/txn.c @@ -852,6 +852,7 @@ txn_on_stop(struct trigger *trigger, void *event) (void) trigger; (void) event; txn_rollback(in_txn()); /* doesn't yield or fail */ + fiber_gc(); } /**