From 06cb9443d68bfd39303adf183fbe79205fa89a4e Mon Sep 17 00:00:00 2001 From: Alex Pelagenko <2159629+ideoma@users.noreply.github.com> Date: Fri, 29 Oct 2021 14:48:52 +0100 Subject: [PATCH] fix(cairo): 6.1 migration issues (#1494) --- .../java/io/questdb/cairo/mig/Mig607.java | 25 +++++++++++++++++++ .../java/io/questdb/cairo/mig/Mig608.java | 4 ++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/io/questdb/cairo/mig/Mig607.java b/core/src/main/java/io/questdb/cairo/mig/Mig607.java index aa1e53cbf..276674ef5 100644 --- a/core/src/main/java/io/questdb/cairo/mig/Mig607.java +++ b/core/src/main/java/io/questdb/cairo/mig/Mig607.java @@ -42,6 +42,8 @@ final class Mig607 { path.trimTo(plen).concat(META_FILE_NAME).$(); + long metaFileSize; + long txFileSize; try (MemoryMARW metaMem = migrationContext.getRwMemory()) { metaMem.of(ff, path, ff.getPageSize(), ff.length(path), MemoryTag.NATIVE_DEFAULT); final int columnCount = metaMem.getInt(0); @@ -143,7 +145,30 @@ final class Mig607 { denseSymbolCount++; } } + txFileSize = txMem.getAppendOffset(); } + metaFileSize = metaMem.getAppendOffset(); + } + + // This migration when written originally used implementation of MemoryMARW which truncated files to size on close + // MemoryMARW now truncate to page size. To test old migrations here we simulate the migration as it is originally released + // So trim TX and META files to their sizes + path.trimTo(plen).concat(META_FILE_NAME).$(); + trimFile(ff, path, metaFileSize); + + path.trimTo(plen).concat(TXN_FILE_NAME).$(); + trimFile(ff, path, txFileSize); + } + + private static void trimFile(FilesFacade ff, Path path, long size) { + long fd = TableUtils.openFileRWOrFail(ff, path); + if (!ff.truncate(fd, size)) { + // This should never happens on migration but better to be on safe side anyway + throw CairoException.instance(ff.errno()).put("Cannot trim to size [file=").put(path).put(']'); + } + if (!ff.close(fd)) { + // This should never happens on migration but better to be on safe side anyway + throw CairoException.instance(ff.errno()).put("Cannot close [file=").put(path).put(']'); } } diff --git a/core/src/main/java/io/questdb/cairo/mig/Mig608.java b/core/src/main/java/io/questdb/cairo/mig/Mig608.java index 83edd0a88..e3fb3a995 100644 --- a/core/src/main/java/io/questdb/cairo/mig/Mig608.java +++ b/core/src/main/java/io/questdb/cairo/mig/Mig608.java @@ -85,7 +85,7 @@ final class Mig608 { o = offset + thatMetaColumnDataSize * (columnCount - 1); long o2 = offset + thisMetaColumnDataSize * (columnCount - 1); final Rnd rnd = SharedRandom.getRandom(migrationContext.getConfiguration()); - while (o > offset) { + while (o >= offset) { rwMem.putInt(o2, rwMem.getInt(o)); // type rwMem.putLong(o2 + 4, rwMem.getInt(o + 4)); // flags rwMem.putInt(o2 + 12, rwMem.getInt(o + 12)); // index block capacity @@ -93,6 +93,7 @@ final class Mig608 { o -= thatMetaColumnDataSize; o2 -= thisMetaColumnDataSize; } + rwMem.jumpTo(newNameOffset + nameSegmentLen); } // update _txn file @@ -119,6 +120,7 @@ final class Mig608 { long thatSize = thatTxOffsetMapWriterCount + 4 + symbolCount * 8L + 4L + partitionTableSize; long thisSize = thisTxOffsetMapWriterCount + 4 + symbolCount * 8L + 4L + partitionTableSize; txMem.extend(thisSize); + txMem.jumpTo(thisSize); Vect.memmove(txMem.addressOf(thisTxOffsetMapWriterCount), txMem.addressOf(thatTxOffsetMapWriterCount), thatSize - thatTxOffsetMapWriterCount); // zero out reserved area -- GitLab