Tarantool development patches archive
 help / color / mirror / Atom feed
From: "v.shpilevoy@tarantool.org" <v.shpilevoy@tarantool.org>
To: tarantool-patches@freelists.org
Cc: kostja@tarantool.org
Subject: [tarantool-patches] Re: [PATCH 1/2] vinyl: allocate upsert counter on lsregion
Date: Mon, 2 Apr 2018 13:27:14 +0300	[thread overview]
Message-ID: <B057847A-6E96-406A-8ACB-4B6B97B26DB0@tarantool.org> (raw)
In-Reply-To: <ca46913dc043b385a9e2e6eb0c1fd2ddba42029c.1522423771.git.vdavydov.dev@gmail.com>

Hello. Please, see 2 comments below.

> 30 марта 2018 г., в 18:47, Vladimir Davydov <vdavydov.dev@gmail.com> написал(а):
> 
> Currently, we store upsert counter in tuple metadata (that's what
> upsert_format is for), but since it's only relevant for tuples of
> the memory level, we can store it on lsregion, right before tuple
> data. Let's do it now so that we can get rid of upsert_format.
> ---
> src/box/vy_stmt.c | 24 ++++++++++++++++--------
> src/box/vy_stmt.h | 23 ++++++++++++++---------
> 2 files changed, 30 insertions(+), 17 deletions(-)
> 
> diff --git a/src/box/vy_stmt.c b/src/box/vy_stmt.c
> index 84182e76..ac60c89e 100644
> --- a/src/box/vy_stmt.c
> +++ b/src/box/vy_stmt.c
> @@ -134,13 +134,26 @@ struct tuple *
> vy_stmt_dup_lsregion(const struct tuple *stmt, struct lsregion *lsregion,
> 		     int64_t alloc_id)
> {
> +	enum iproto_type type = vy_stmt_type(stmt);
> 	size_t size = tuple_size(stmt);
> +	size_t alloc_size = size;
> 	struct tuple *mem_stmt;
> -	mem_stmt = lsregion_alloc(lsregion, size, alloc_id);
> +
> +	/* Reserve one byte for UPSERT counter. */
> +	if (type == IPROTO_UPSERT)
> +		alloc_size++;
> +
> +	mem_stmt = lsregion_alloc(lsregion, alloc_size, alloc_id);
> 	if (mem_stmt == NULL) {
> 		diag_set(OutOfMemory, size, "lsregion_alloc", "mem_stmt");
> 		return NULL;
> 	}
> +
> +	if (type == IPROTO_UPSERT) {
> +		*(uint8_t *)mem_stmt = 0;

1. How about to at first, set mem_stmt and at second, call vy_stmt_set_n_upserts? I think,
that this pointers magic must be hidden where possible.

> +		mem_stmt = (struct tuple *)((uint8_t *)mem_stmt + 1);
> +	}
> +
> 	memcpy(mem_stmt, stmt, size);
> 	/*
> 	 * Region allocated statements can't be referenced or unreferenced
> 
> struct tuple *
> diff --git a/src/box/vy_stmt.h b/src/box/vy_stmt.h
> index a33739d6..8958adb5 100644
> --- a/src/box/vy_stmt.h
> +++ b/src/box/vy_stmt.h
> @@ -146,23 +146,28 @@ vy_stmt_set_type(struct tuple *stmt, enum iproto_type type)
> 	((struct vy_stmt *) stmt)->type = type;
> }
> 
> -/** Get upserts count of the vinyl statement. */
> +/**
> + * Get upserts count of the vinyl statement.
> + * Only for UPSERT statements allocated on lsregion.

2. Can you, please, add an assertion for this? For example:
assert(! vy_stmt_is_refable(stmt)).

> + */
> static inline uint8_t
> vy_stmt_n_upserts(const struct tuple *stmt)
> {
> -	assert(tuple_format(stmt)->extra_size == sizeof(uint8_t));
> -	return *((const uint8_t *) tuple_extra(stmt));
> +	assert(stmt->refs == 0);
> +	assert(vy_stmt_type(stmt) == IPROTO_UPSERT);
> +	return *((uint8_t *)stmt - 1);
> }
> 
> -/** Set upserts count of the vinyl statement. */
> +/**
> + * Set upserts count of the vinyl statement.
> + * Only for UPSERT statements allocated on lsregion.
> + */
> static inline void
> vy_stmt_set_n_upserts(struct tuple *stmt, uint8_t n)
> {
> -	struct tuple_format *format = tuple_format(stmt);
> -	assert(format->extra_size == sizeof(uint8_t));
> -	char *extra = (char *) stmt + stmt->data_offset -
> -		      tuple_format_meta_size(format);
> -	*((uint8_t *) extra) = n;
> +	assert(stmt->refs == 0);
> +	assert(vy_stmt_type(stmt) == IPROTO_UPSERT);
> +	*((uint8_t *)stmt - 1) = n;
> }
> 
> /** Get the column mask of the specified tuple. */
> -- 
> 2.11.0
> 
> 

  reply	other threads:[~2018-04-02 10:27 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-30 15:47 [PATCH 0/2] vinyl: zap upsert_format Vladimir Davydov
2018-03-30 15:47 ` [PATCH 1/2] vinyl: allocate upsert counter on lsregion Vladimir Davydov
2018-04-02 10:27   ` v.shpilevoy [this message]
2018-04-02 10:50     ` [tarantool-patches] " Vladimir Davydov
2018-03-30 15:47 ` [PATCH 2/2] vinyl: zap upsert_format Vladimir Davydov
2018-04-02 10:58   ` v.shpilevoy
2018-04-02 11:06     ` Vladimir Davydov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=B057847A-6E96-406A-8ACB-4B6B97B26DB0@tarantool.org \
    --to=v.shpilevoy@tarantool.org \
    --cc=kostja@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --subject='[tarantool-patches] Re: [PATCH 1/2] vinyl: allocate upsert counter on lsregion' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox