From: Konstantin Osipov <kostja@tarantool.org> To: tarantool-patches@freelists.org Cc: Georgy Kirichenko <georgy@tarantool.org> Subject: [tarantool-patches] Re: [PATCH 3/3] Transaction support for applier Date: Tue, 5 Mar 2019 12:25:38 +0300 [thread overview] Message-ID: <20190305092538.GA21955@chai> (raw) In-Reply-To: <f7da57ec765aae5b550842f435d69a56e9585761.1551644303.git.georgy@tarantool.org> * Georgy Kirichenko <georgy@tarantool.org> [19/03/03 23:30]: > Applier fetch incoming rows to form a transaction and then apply it. > In case of replication all local changes moved to an journal entry > tail to form a separate transaction (like autonomous transaction) > to be able to replicate changes back so applier assumes that transactions > could not be mixed in a replication stream. > > Closes: #2798 > Needed for: #980 > --- > src/box/applier.cc | 243 ++++++++++++++++++++------ > src/box/txn.c | 21 ++- > src/box/txn.h | 4 + > test/replication/transaction.result | 240 +++++++++++++++++++++++++ > test/replication/transaction.test.lua | 86 +++++++++ > 5 files changed, 534 insertions(+), 60 deletions(-) > create mode 100644 test/replication/transaction.result > create mode 100644 test/replication/transaction.test.lua > > diff --git a/src/box/applier.cc b/src/box/applier.cc > index 3222b041d..dfabbe5ab 100644 > --- a/src/box/applier.cc > +++ b/src/box/applier.cc > @@ -48,6 +48,12 @@ > #include "session.h" > #include "cfg.h" > #include "box.h" > +#include "txn.h" > + > +enum { > + /* Initial capacity of rows array. */ > + APPLIER_TX_INITIAL_ROW_COUNT = 16, > +}; > > STRS(applier_state, applier_STATE); > > @@ -380,6 +386,176 @@ applier_join(struct applier *applier) > applier_set_state(applier, APPLIER_READY); > } > > +/** > + * Read one transaction from network using applier's input buffer. > + * Transaction rows are placed onto fiber gc region. > + * We could not use applier input buffer for that because rpos is adjusted > + * after each xrow decoding and corresponding network input space is going > + * to be reused. > + * > + * Return count of transaction rows and put row's header pointers into rows > + * array. > + */ > +static int > +applier_read_tx(struct applier *applier, struct xrow_header **rows) > +{ > + struct ev_io *coio = &applier->io; > + struct ibuf *ibuf = &applier->ibuf; > + int64_t tsn = 0; > + int row_capacity = APPLIER_TX_INITIAL_ROW_COUNT; > + struct xrow_header *first_row, *row; > + first_row = (struct xrow_header *)region_alloc(&fiber()->gc, > + row_capacity * > + sizeof(struct xrow_header)); > + if (first_row == NULL) { > + diag_set(OutOfMemory, sizeof(struct xrow_header) * row_capacity, > + "region", "struct xrow_header"); > + goto error; > + } > + row = first_row; > + > + do { > + if (row == first_row + row_capacity) { > + /* Realloc rows array. */ > + row = (struct xrow_header *)region_alloc(&fiber()->gc, > + row_capacity * > + sizeof(struct xrow_header) << 1); > + if (row == NULL) { > + diag_set(OutOfMemory, > + sizeof(struct xrow_header) * > + row_capacity << 1, > + "region", "struct xrow_header"); > + goto error; > + } > + memcpy(row, first_row, row_capacity * > + sizeof(struct xrow_header) << 1); > + first_row = row; > + row = first_row + row_capacity; > + row_capacity <<= 1; > + } This looks like inventing a wheel, let's move the resize part to region_realloc(). > + if (row == first_row) { > + /* > + * First row in a transaction. In order to enforce > + * consistency check that first row lsn and replica id > + * match with transaction. > + */ > + tsn = row->tsn; > + if (row->lsn != tsn) { > + /* There is not a first row in the transactions. */ /* Transaction id must be derived from the log sequence number of * the first row in the transaction. */ > + diag_set(ClientError, ER_PROTOCOL, > + "Not a first row in a transaction"); This message would be confusing when it pops up, please use a message from the suggested comment. > + goto error; > + } > + } > + if (tsn != row->tsn) { > + /* We are not able to handle interleaving transactions. */ > + diag_set(ClientError, ER_UNSUPPORTED, > + "replications", > + "interleaving transactions"); "replication" > + if (row->body->iov_base != NULL) { > + /* Save row bodies to gc region. */ As a courtesy to performance you could only do this for multi-row transactions. You can see it's a multi-row transaction from xrow header. > + *rows = first_row; > + return row - first_row + 1; As an alternative to region_realloc(), you could add stailq in_txn to struct xrow_header. Being able to add xrow to a linked list won't hurt in other places either. > + > +static int > +applier_apply_tx(struct xrow_header *first_row, struct xrow_header *last_row) Please add a comment. > diff --git a/src/box/txn.c b/src/box/txn.c > index 7900fb3ab..f6bf72d0c 100644 > --- a/src/box/txn.c > +++ b/src/box/txn.c > @@ -34,6 +34,7 @@ > #include "journal.h" > #include <fiber.h> > #include "xrow.h" > +#include "replication.h" Could this entire thing with remote rows be moved to a separate patch? -- Konstantin Osipov, Moscow, Russia, +7 903 626 22 32 http://tarantool.io - www.twitter.com/kostja_osipov
next prev parent reply other threads:[~2019-03-05 9:25 UTC|newest] Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-03-03 20:26 [tarantool-patches] [PATCH 0/3] Transaction boundaries " Georgy Kirichenko 2019-03-03 20:26 ` [tarantool-patches] [PATCH 1/3] Applier gets rid of a xstream Georgy Kirichenko 2019-03-05 8:52 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 10:19 ` [tarantool-patches] " Vladimir Davydov 2019-03-03 20:26 ` [tarantool-patches] [PATCH 2/3] Merge apply row and apply_initial_join_row Georgy Kirichenko 2019-03-05 9:06 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 10:26 ` [tarantool-patches] " Vladimir Davydov 2019-03-03 20:26 ` [tarantool-patches] [PATCH 3/3] Transaction support for applier Georgy Kirichenko 2019-03-05 9:11 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 10:28 ` Vladimir Davydov [not found] ` <20190305112333.GA30697@chai> 2019-03-05 11:27 ` Vladimir Davydov 2019-03-05 9:13 ` Konstantin Osipov 2019-03-05 9:25 ` Konstantin Osipov [this message] 2019-03-05 9:28 ` Konstantin Osipov 2019-03-05 11:59 ` [tarantool-patches] " 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=20190305092538.GA21955@chai \ --to=kostja@tarantool.org \ --cc=georgy@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='[tarantool-patches] Re: [PATCH 3/3] Transaction support for applier' \ /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