diff --git a/src/box/box.cc b/src/box/box.cc index 7fa92e0af027a3486fd0dee2c2de8cc227283e44..2371de06a21e51ad775f5a83f266b73c555ff723 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -52,13 +52,11 @@ #include "cfg.h" #include "iobuf.h" -static void process_ro(struct port *port, struct request *request); -static void process_rw(struct port *port, struct request *request); +static void process_ro(struct request *request, struct port *port); box_process_func box_process = process_ro; struct recovery_state *recovery; -int stat_base; int snapshot_pid = 0; /* snapshot processes pid */ static void @@ -74,24 +72,11 @@ struct request_replace_body { } __attribute__((packed)); static void -process_rw(struct port *port, struct request *request) -{ - try { - stat_collect(stat_base, request->type, 1); - request_execute(request, port); - port_eof(port); - } catch (Exception *e) { - txn_rollback_stmt(); - throw; - } -} - -static void -process_ro(struct port *port, struct request *request) +process_ro(struct request *request, struct port *port) { if (!iproto_type_is_select(request->type)) tnt_raise(LoggedError, ER_READONLY); - return process_rw(port, request); + return process_rw(request, port); } void @@ -118,7 +103,7 @@ recover_row(struct recovery_state *r, void *param, struct xrow_header *row) request_decode(&request, (const char *) row->body[0].iov_base, row->body[0].iov_len); request.header = row; - process_rw(&null_port, &request); + process_rw(&request, &null_port); } /* {{{ configuration bindings */ @@ -299,7 +284,7 @@ boxk(enum iproto_type type, uint32_t space_id, const char *format, ...) assert(data <= buf + sizeof(buf)); req.tuple = buf; req.tuple_end = data; - process_rw(&null_port, &req); + process_rw(&req, &null_port); } /** diff --git a/src/box/box.h b/src/box/box.h index bba7df512f8ba9b84d6fdd22fdb1c336e49a9255..4729c99d10ed36f7f5d13affaf51c53b5431b102 100644 --- a/src/box/box.h +++ b/src/box/box.h @@ -63,7 +63,7 @@ box_atfork(); * change when entering/leaving read-only mode * (master->slave propagation). */ -typedef void (*box_process_func)(struct port *port, struct request *request); +typedef void (*box_process_func)(struct request *request, struct port *port); /** For read-write operations. */ extern box_process_func box_process; @@ -127,8 +127,6 @@ void box_set_too_long_threshold(double threshold); extern struct recovery_state *recovery; -extern int stat_base; - #if defined(__cplusplus) } #endif /* defined(__cplusplus) */ diff --git a/src/box/iproto.cc b/src/box/iproto.cc index 57084d6853b4af512f808a4bbc606d63be5bca54..814ad86818fe5fb7feafd740cf12a17739138947 100644 --- a/src/box/iproto.cc +++ b/src/box/iproto.cc @@ -663,7 +663,7 @@ iproto_process(struct iproto_request *ireq) case IPROTO_DELETE: struct iproto_port port; iproto_port_init(&port, out, ireq->header.sync); - box_process((struct port *) &port, &ireq->request); + box_process(&ireq->request, (struct port *) &port); break; case IPROTO_CALL: stat_collect(stat_base, ireq->request.type, 1); diff --git a/src/box/lua/call.cc b/src/box/lua/call.cc index 7b1da1085f7cc7e45f495808bffaeeae062e2af8..eb661774c1ad8e9c71f2948c7cf36df5dc6cac72 100644 --- a/src/box/lua/call.cc +++ b/src/box/lua/call.cc @@ -183,7 +183,7 @@ lbox_process(lua_State *L) struct request request; request_create(&request, op); request_decode(&request, req, sz); - box_process(port_lua, &request); + box_process(&request, port_lua); return 1; } @@ -266,7 +266,7 @@ boxffi_select(struct port *port, uint32_t space_id, uint32_t index_id, request.key_end = key_end; try { - box_process(port, &request); + box_process(&request, port); return 0; } catch (Exception *e) { /* will be hanled by box.error() in Lua */ @@ -284,7 +284,7 @@ lbox_insert(lua_State *L) struct port_lua port; lbox_request_create(&request, L, IPROTO_INSERT, -1, 2); port_lua_create(&port, L); - box_process((struct port *) &port, &request); + box_process(&request, (struct port *) &port); return lua_gettop(L) - 2; } @@ -298,7 +298,7 @@ lbox_replace(lua_State *L) struct port_lua port; lbox_request_create(&request, L, IPROTO_REPLACE, -1, 2); port_lua_create(&port, L); - box_process((struct port *) &port, &request); + box_process(&request, (struct port *) &port); return lua_gettop(L) - 2; } @@ -314,7 +314,7 @@ lbox_update(lua_State *L) request.field_base = 1; /* field ids are one-indexed */ port_lua_create(&port, L); /* Ignore index_id for now */ - box_process((struct port *) &port, &request); + box_process(&request, (struct port *) &port); return lua_gettop(L) - 4; } @@ -329,7 +329,7 @@ lbox_delete(lua_State *L) lbox_request_create(&request, L, IPROTO_DELETE, 3, -1); port_lua_create(&port, L); /* Ignore index_id for now */ - box_process((struct port *) &port, &request); + box_process(&request, (struct port *) &port); return lua_gettop(L) - 3; } diff --git a/src/box/request.cc b/src/box/request.cc index c8fc74aea53d2b9a15347875d0816bdcd12f1065..8e1cb396fdf597aa1d6271f3e29aa47253065a41 100644 --- a/src/box/request.cc +++ b/src/box/request.cc @@ -40,6 +40,9 @@ #include <scoped_guard.h> #include "user_def.h" #include "iproto_constants.h" +#include "stat.h" + +int stat_base; enum dup_replace_mode dup_replace_mode(uint32_t op) @@ -171,17 +174,23 @@ request_create(struct request *request, uint32_t type) typedef void (*request_execute_f)(struct request *, struct port *); void -request_execute(struct request *request, struct port *port) +process_rw(struct request *request, struct port *port) { assert(iproto_type_is_dml(request->type)); static const request_execute_f execute_map[] = { NULL, execute_select, execute_replace, execute_replace, execute_update, execute_delete }; - request_execute_f fun = execute_map[request->type]; assert(fun != NULL); - fun(request, port); + stat_collect(stat_base, request->type, 1); + try { + fun(request, port); + port_eof(port); + } catch (Exception *e) { + txn_rollback_stmt(); + throw; + } } void diff --git a/src/box/request.h b/src/box/request.h index eed53bcb205c2aeadf752689e3a56524be9d0fde..b63f3dd74da04c797e85f2153dd55d09c1fcaab3 100644 --- a/src/box/request.h +++ b/src/box/request.h @@ -33,7 +33,7 @@ struct txn; struct port; - +extern int stat_base; struct request { @@ -66,7 +66,7 @@ void request_create(struct request *request, uint32_t code); void -request_execute(struct request *request, struct port *port); +process_rw(struct request *request, struct port *port); void request_decode(struct request *request, const char *data, uint32_t len);