From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Thu, 28 Mar 2019 20:53:20 +0300 From: Vladimir Davydov Subject: Re: [PATCH v3 0/3] Fix DML vs DDL race Message-ID: <20190328175320.lna3n2tixqvrx2as@esperanza> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: To: kostja@tarantool.org Cc: tarantool-patches@freelists.org List-ID: On Thu, Mar 28, 2019 at 07:17:47PM +0300, Vladimir Davydov wrote: > In Vinyl a DML request may yield on disk read while still having a > pointer to the target space saved on stack. If the space is altered > during this time window, the DML request will most certainly crash > while trying to dereference the stale pointer when it resumes. The > solution is simple: abort all affected transactions whenever we delete > a space from the cache. > > https://github.com/tarantool/tarantool/issues/3420 > https://github.com/tarantool/tarantool/commits/dv/gh-3420-vy-abort-tx-in-ddl > > Changes in v3: > - Keep track of the *space* affected by the last prepared statement > rather than the LSM tree. > > v2: https://www.freelists.org/post/tarantool-patches/PATCH-v2-03-Fix-DML-vs-DDL-race > > Changes in v2: > - Instead of introducing a per transaction space hash, simply remember > the pointer to the last prepared index. Thanks to Kostja for the tip. > - Drop the patch allowing transactions affecting only replica local > spaces outlast a switch to read-only mode, as we can't easily > implement it without a per transaction space hash. Anyway, it was out > of the scope of this issue. > > v1: https://www.freelists.org/post/tarantool-patches/PATCH-04-Fix-DML-vs-DDL-race > > Vladimir Davydov (3): > vinyl: make tx_manager_abort_writers_for_ddl more thorough > vinyl: abort affected transactions when space is removed from cache > Revert "test: skip ddl test for vinyl on travis" > > rpm/tarantool.spec | 2 - > src/box/blackhole.c | 1 + > src/box/memtx_space.c | 1 + > src/box/schema.cc | 3 ++ > src/box/space.c | 6 +++ > src/box/space.h | 15 ++++++ > src/box/sysview.c | 1 + > src/box/vinyl.c | 33 ++++++++++--- > src/box/vy_point_lookup.c | 14 ++++++ > src/box/vy_read_iterator.c | 13 +++++ > src/box/vy_tx.c | 14 ++++-- > src/box/vy_tx.h | 15 ++++-- > test/vinyl/ddl.skipcond | 6 --- > test/vinyl/errinj_ddl.result | 110 +++++++++++++++++++++++++++++++++++++++++ > test/vinyl/errinj_ddl.test.lua | 51 +++++++++++++++++++ > 15 files changed, 265 insertions(+), 20 deletions(-) > delete mode 100644 test/vinyl/ddl.skipcond Pushed to master, 2.1, 1.10.