Skip to content
Snippets Groups Projects
Commit e066ee33 authored by Konstantin Osipov's avatar Konstantin Osipov
Browse files

Remove port_add_u32, port_dup_u32.

Remove ugly port_add_u32, port_dup_u32.
Now there are only port methods to add a tuple.
An additional method, port_eof(), is introduced
to mark the end of a result set.

Count tuples of SELECT automatically in port_iproto,
where it is needed.
parent 1fcbe167
No related branches found
No related tags found
No related merge requests found
......@@ -888,7 +888,8 @@ port_lua(struct port *port) { return (struct port_lua *) port; }
*/
static void
port_lua_add_tuple(struct port *port, struct tuple *tuple)
port_lua_add_tuple(struct port *port, struct tuple *tuple,
u32 flags __attribute__((unused)))
{
lua_State *L = port_lua(port)->L;
@try {
......@@ -899,9 +900,8 @@ port_lua_add_tuple(struct port *port, struct tuple *tuple)
}
struct port_vtab port_lua_vtab = {
port_null_add_u32,
port_null_dup_u32,
port_lua_add_tuple,
port_null_eof,
};
static struct port *
......@@ -1068,7 +1068,7 @@ port_add_lua_ret(struct port *port, struct lua_State *L, int index)
break;
}
@try {
port_add_tuple(port, tuple);
port_add_tuple(port, tuple, BOX_RETURN_TUPLE);
} @finally {
if (tuple->refs == 0)
tuple_free(tuple);
......@@ -1084,11 +1084,9 @@ port_add_lua_ret(struct port *port, struct lua_State *L, int index)
* then each return value as a tuple.
*/
static void
port_add_lua_multret(struct port *port __attribute__((unused)),
struct lua_State *L)
port_add_lua_multret(struct port *port, struct lua_State *L)
{
int nargs = lua_gettop(L);
port_dup_u32(port, nargs);
for (int i = 1; i <= nargs; ++i)
port_add_lua_ret(port, L, i);
}
......
......@@ -35,9 +35,9 @@ struct port;
struct port_vtab
{
u32* (*add_u32)(struct port *port);
void (*dup_u32)(struct port *port, u32 num);
void (*add_tuple)(struct port *port, struct tuple *tuple);
void (*add_tuple)(struct port *port, struct tuple *tuple, u32 flags);
/** Must be called in the end of execution of a single request. */
void (*eof)(struct port *port);
};
struct port
......@@ -52,33 +52,24 @@ struct port
*/
void iov_ref_tuple(struct tuple *tuple);
static inline u32*
port_add_u32(struct port *port)
{
return (port->vtab->add_u32)(port);
}
static inline void
port_dup_u32(struct port *port, u32 num)
port_eof(struct port *port)
{
(port->vtab->dup_u32)(port, num);
return (port->vtab->eof)(port);
}
static inline void
port_add_tuple(struct port *port, struct tuple *tuple)
port_add_tuple(struct port *port, struct tuple *tuple, u32 flags)
{
(port->vtab->add_tuple)(port, tuple);
(port->vtab->add_tuple)(port, tuple, flags);
}
/** Reused in port_lua */
u32*
port_null_add_u32(struct port *port __attribute__((unused)));
void
port_null_dup_u32(struct port *port __attribute__((unused)),
u32 num __attribute__((unused)));
port_null_eof(struct port *port __attribute__((unused)));
/** These do not have state currently, thus a single
/**
* This one does not have state currently, thus a single
* instance is sufficient.
*/
extern struct port port_null;
......
......@@ -66,74 +66,72 @@ iov_ref_tuple(struct tuple *tuple)
fiber_register_cleanup(tuple_unref, tuple);
}
u32*
port_null_add_u32(struct port *port __attribute__((unused)))
{
static u32 dummy;
return &dummy;
}
void
port_null_dup_u32(struct port *port __attribute__((unused)),
u32 num __attribute__((unused)))
port_null_eof(struct port *port __attribute__((unused)))
{
}
static void
port_null_add_tuple(struct port *port __attribute__((unused)),
struct tuple *tuple __attribute__((unused)))
struct tuple *tuple __attribute__((unused)),
u32 flags __attribute__((unused)))
{
}
static u32*
port_iproto_add_u32(struct port *port __attribute__((unused)))
static struct port_vtab port_null_vtab = {
port_null_add_tuple,
port_null_eof,
};
struct port port_null = {
.vtab = &port_null_vtab,
};
struct port_iproto
{
struct port_vtab *vtab;
/** Number of found tuples. */
u32 found;
};
static inline struct port_iproto *
port_iproto(struct port *port)
{
u32 *p_u32 = palloc(fiber->gc_pool, sizeof(u32));
iov_add(p_u32, sizeof(u32));
return p_u32;
return (struct port_iproto *) port;
}
static void
port_iproto_dup_u32(struct port *port __attribute__((unused)), u32 u32)
port_iproto_eof(struct port *ptr)
{
iov_dup(&u32, sizeof(u32));
struct port_iproto *port = port_iproto(ptr);
/* found == 0 means add_tuple wasn't called at all. */
if (port->found == 0)
iov_dup(&port->found, sizeof(port->found));
}
static void
port_iproto_add_tuple(struct port *port __attribute__((unused)),
struct tuple *tuple)
port_iproto_add_tuple(struct port *ptr, struct tuple *tuple, u32 flags)
{
size_t len = tuple_len(tuple);
if (len > BOX_REF_THRESHOLD) {
iov_ref_tuple(tuple);
iov_add(&tuple->bsize, len);
} else {
iov_dup(&tuple->bsize, len);
struct port_iproto *port = port_iproto(ptr);
if (++port->found == 1) {
/* Found the first tuple, add tuple count. */
iov_add(&port->found, sizeof(port->found));
}
if (flags & BOX_RETURN_TUPLE) {
size_t len = tuple_len(tuple);
if (len > BOX_REF_THRESHOLD) {
iov_ref_tuple(tuple);
iov_add(&tuple->bsize, len);
} else {
iov_dup(&tuple->bsize, len);
}
}
}
static struct port_vtab port_null_vtab = {
port_null_add_u32,
port_null_dup_u32,
port_null_add_tuple,
};
static struct port_vtab port_iproto_vtab = {
port_iproto_add_u32,
port_iproto_dup_u32,
port_iproto_add_tuple,
};
struct port port_null = {
.vtab = &port_null_vtab,
};
struct port_iproto
{
struct port_vtab *vtab;
/** Number of found tuples. */
u32 found;
port_iproto_eof,
};
struct port *
......
......@@ -65,18 +65,6 @@ read_space(struct tbuf *data)
return space_find(space_no);
}
static void
port_send_tuple(u32 flags, struct port *port, struct tuple *tuple)
{
if (tuple) {
port_dup_u32(port, 1); /* affected tuples */
if (flags & BOX_RETURN_TUPLE)
port_add_tuple(port, tuple);
} else {
port_dup_u32(port, 0); /* affected tuples. */
}
}
static void
execute_replace(struct request *request, struct txn *txn, struct port *port)
{
......@@ -111,7 +99,7 @@ execute_replace(struct request *request, struct txn *txn, struct port *port)
txn_add_undo(txn, sp, old_tuple, txn->new_tuple);
port_send_tuple(flags, port, txn->new_tuple);
port_add_tuple(port, txn->new_tuple, flags);
}
/** {{{ UPDATE request implementation.
......@@ -729,7 +717,8 @@ execute_update(struct request *request, struct txn *txn, struct port *port)
space_validate(sp, old_tuple, txn->new_tuple);
}
txn_add_undo(txn, sp, old_tuple, txn->new_tuple);
port_send_tuple(flags, port, txn->new_tuple);
if (txn->new_tuple)
port_add_tuple(port, txn->new_tuple, flags);
}
/** }}} */
......@@ -748,15 +737,14 @@ execute_select(struct request *request, struct txn *txn, struct port *port)
if (count == 0)
tnt_raise(IllegalParams, :"tuple count must be positive");
uint32_t *found = port_add_u32(port);
*found = 0;
ERROR_INJECT_EXCEPTION(ERRINJ_TESTING);
u32 found = 0;
for (u32 i = 0; i < count; i++) {
/* End the loop if reached the limit. */
if (limit == *found)
if (limit == found)
return;
/* read key */
......@@ -777,9 +765,9 @@ execute_select(struct request *request, struct txn *txn, struct port *port)
continue;
}
port_add_tuple(port, tuple);
port_add_tuple(port, tuple, BOX_RETURN_TUPLE);
if (limit == ++(*found))
if (limit == ++found)
break;
}
}
......@@ -807,7 +795,8 @@ execute_delete(struct request *request, struct txn *txn, struct port *port)
txn_add_undo(txn, sp, old_tuple, NULL);
port_send_tuple(flags, port, old_tuple);
if (old_tuple)
port_add_tuple(port, old_tuple, flags);
}
/** To collects stats, we need a valid request type.
......@@ -870,4 +859,5 @@ request_execute(struct request *request, struct txn *txn, struct port *port)
request_check_type(request->type);
break;
}
port_eof(port);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment