commit - 9fcbbb3e7d5e9f5a876ee27a7bf93303321e26b2
commit + f41d1ddd5faf95483f66e3dfeb31ea51b4c7a997
blob - 74cc74684ee63167683b4317f549d0141ece4d39
blob + ef89733ede3ff5dc695197b5527115260cd9a60e
--- src/box/wal.c
+++ src/box/wal.c
struct xrow_header **end)
{
int64_t tsn = 0;
+ struct xrow_header **start = row;
+ struct xrow_header **first_glob_row = row;
/** Assign LSN to all local rows. */
for ( ; row < end; row++) {
if ((*row)->replica_id == 0) {
/*
* All rows representing local space data
- * manipulations are signed wth a zero
+ * manipulations are signed with a zero
* instance id. This is also true for
* anonymous replicas, since they are
* only capable of writing to local and
(*row)->lsn = vclock_inc(vclock_diff, (*row)->replica_id) +
vclock_get(base, (*row)->replica_id);
- /* Use lsn of the first local row as transaction id. */
- tsn = tsn == 0 ? (*row)->lsn : tsn;
- (*row)->tsn = tsn;
+ /*
+ * Use lsn of the first global row as
+ * transaction id.
+ */
+ if ((*row)->group_id != GROUP_LOCAL && tsn == 0) {
+ tsn = (*row)->lsn;
+ /*
+ * Remember the tail being processed.
+ */
+ first_glob_row = row;
+ }
+ (*row)->tsn = tsn == 0 ? (*start)->lsn : tsn;
(*row)->is_commit = row == end - 1;
} else {
int64_t diff = (*row)->lsn - vclock_get(base, (*row)->replica_id);
}
}
}
+
+ /*
+ * Fill transaction id for all the local rows preceding
+ * the first global row. tsn was yet unknown when those
+ * rows were processed.
+ */
+ for (row = start; row < first_glob_row; row++)
+ (*row)->tsn = tsn;
}
static void