Tarantool development patches archive
 help / color / mirror / Atom feed
From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: tarantool-patches@freelists.org
Cc: vdavydov.dev@gmail.com, Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
Subject: [PATCH v2 0/3] schema: expose space_mt and index_mt on box.schema table
Date: Tue,  3 Apr 2018 19:50:44 +0300	[thread overview]
Message-ID: <cover.1522774214.git.v.shpilevoy@tarantool.org> (raw)
In-Reply-To: <20180402112843.k5szaedwomi4gtl3@esperanza>

Branch: http://github.com/tarantool/tarantool/tree/pr-3204-expose-space-index-mt
Issue: https://github.com/tarantool/tarantool/issues/3204

Space_mt and index_mt are created individually for each space
inside a giant space.bless function. It consumes lua memory by
duplicating these metatables (which is very limited), and does not
allow to add new functions or redefine existing ones, which would
be visible in all spaces and indexes. Lets solve the problems one
by one.

At first, move space_mt and index_mt definitions out of
space.bless function. Now space.bless just copy space_mt and
inherit a needed index_mt depending on egine.

At second, instead of customization of index_mt copy on each
space.bless lets once create separate index metatables for memtx
and for vinyl, and just copy needed in space.bless. With no
selecting yielding/non-yielding methods inside the function.

At third, just stop copying in bless, start reference metatables
instead, and open them to users via box.schema:
box.schema.space_mt - metatable of all spaces;
box.schema.index_mt - base metatable of all indexes - replicated
                      into the vinyl and memtx. See below how.
box.schema.vinyl_index_mt - metatable of all vinyl indexes;
box.schema.memtx_index_mt - metatable of all memtx indexes. 

Once metatables become global and shared, they can be easy
extended. However there is a non-trival task how to make index
metatable extension be transparent for a user, if a user modifies
not vinyl or memtx metatable, but box.schema.index_mt. It would be
good to replicate all changes of a base metatable over engine
specific ones.

This is solved using "metatable for a metatable". When a user
modifies box.schema.index_mt, these changes via __newindex method
of box.schema.index_mt are replicated both into memtx and vinyl
index metatables.

Vladislav Shpilevoy (3):
  schema: move space_mt and index_mt definition out of space bless
  schema: inherit vinyl/memtx_index_mt from base index mt
  schema: expose space_mt and index_mt on box.schema table

 src/box/lua/schema.lua          | 663 +++++++++++++++++++++-------------------
 test/box-tap/schema_mt.test.lua |  80 +++++
 2 files changed, 424 insertions(+), 319 deletions(-)
 create mode 100755 test/box-tap/schema_mt.test.lua

-- 
2.14.3 (Apple Git-98)

  reply	other threads:[~2018-04-03 16:50 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-23 13:07 [PATCH 0/2] schema: expose space_mt and index_mt on table Vladislav Shpilevoy
2018-03-23 13:07 ` [PATCH 1/2] schema: expose space_mt and index_mt on `box.schema` table Vladislav Shpilevoy
2018-03-23 13:07 ` [PATCH 2/2] schema: review fixes for box.schema.space/index metatables Vladislav Shpilevoy
2018-03-29 10:54 ` [PATCH 0/2] schema: expose space_mt and index_mt on table Vladimir Davydov
2018-03-29 14:31   ` [PATCH v2 0/2] schema: expose space_mt and index_mt on box.schema table Vladislav Shpilevoy
2018-03-29 14:31     ` [PATCH v2 1/2] schema: move space_mt and index_mt definition out of space bless Vladislav Shpilevoy
2018-04-01  9:33       ` Vladimir Davydov
2018-04-01 11:02         ` [PATCH 0/2] schema: expose space_mt and index_mt on box.schema table Vladislav Shpilevoy
2018-04-01 11:02           ` [PATCH 1/2] schema: move space_mt and index_mt definition out of space bless Vladislav Shpilevoy
2018-04-01 11:02           ` [PATCH 2/2] schema: expose space_mt and index_mt on `box.schema` table Vladislav Shpilevoy
2018-04-02 11:28             ` Vladimir Davydov
2018-04-03 16:50               ` Vladislav Shpilevoy [this message]
2018-04-03 16:50                 ` [PATCH v2 1/3] schema: move space_mt and index_mt definition out of space bless Vladislav Shpilevoy
2018-04-03 16:50                 ` [PATCH v2 2/3] schema: inherit vinyl/memtx_index_mt from base index mt Vladislav Shpilevoy
2018-04-03 16:50                 ` [PATCH v2 3/3] schema: expose space_mt and index_mt on box.schema table Vladislav Shpilevoy
2018-05-05 12:47                   ` [tarantool-patches] " Vladislav Shpilevoy
2018-05-08 16:48                     ` Konstantin Osipov
2018-05-08 17:33                       ` Vladislav Shpilevoy
2018-03-29 14:31     ` [PATCH v2 2/2] schema: expose space_mt and index_mt on `box.schema` table Vladislav Shpilevoy
2018-04-01  9:37     ` [PATCH v2 0/2] schema: expose space_mt and index_mt on box.schema table 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=cover.1522774214.git.v.shpilevoy@tarantool.org \
    --to=v.shpilevoy@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --cc=vdavydov.dev@gmail.com \
    --subject='Re: [PATCH v2 0/3] schema: expose space_mt and index_mt on box.schema table' \
    /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