From 90e0f9dddca7c1b63a4ab568644340452d592e41 Mon Sep 17 00:00:00 2001 From: catbref Date: Wed, 11 Mar 2020 15:25:04 +0000 Subject: [PATCH] Fix system-dependent path separator usage. Although HSQLDB is happy being given unix-style path separator '/' and converting as necessary on other platforms (e.g. Windows), manipulation of repository pathnames in Java, outside of HSQLDB, needs to use platform-specific path separators. Thus, changes made to replace '/' with File.separator where necessary. This should fix repository rebuild errors, which then lead to odd start-up errors like: 2020-03-11 13:55:19 INFO Controller:270 - Starting repository 2020-03-11 13:55:20 INFO Controller:287 - Validating blockchain 2020-03-11 13:55:20 INFO HSQLDBRepository:227 - Rebuilding repository from scratch 2020-03-11 13:55:20 INFO GenesisBlock:296 - Using genesis block timestamp of 1583870000000 2020-03-11 13:55:21 WARN HSQLDBRepository:720 - Uncommitted changes (882) after connection close, session [3] java.lang.NullPointerException at org.qortal.transform.block.BlockTransformer.decodeOnlineAccounts(BlockTransformer.java:422) at org.qortal.block.Block.getExpandedAccounts(Block.java:546) at org.qortal.block.Block.increaseAccountLevels(Block.java:1245) at org.qortal.block.Block.increaseAccountLevels(Block.java:1239) at org.qortal.block.Block.process(Block.java:1206) at org.qortal.block.GenesisBlock.process(GenesisBlock.java:345) at org.qortal.block.BlockChain.rebuildBlockchain(BlockChain.java:526) at org.qortal.block.BlockChain.validate(BlockChain.java:481) at org.qortal.controller.Controller.main(Controller.java:289) The above happens because the old blockchain still exists when trying to process the genesis block. --- src/main/java/org/qortal/controller/Controller.java | 3 ++- .../org/qortal/repository/hsqldb/HSQLDBRepository.java | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 829f0b00..f351cfbe 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -1,5 +1,6 @@ package org.qortal.controller; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.security.SecureRandom; @@ -99,7 +100,7 @@ public class Controller extends Thread { private static final long MISBEHAVIOUR_COOLOFF = 10 * 60 * 1000L; // ms private static final int MAX_BLOCKCHAIN_TIP_AGE = 5; // blocks private static final Object shutdownLock = new Object(); - private static final String repositoryUrlTemplate = "jdbc:hsqldb:file:%s/blockchain;create=true;hsqldb.full_log_replay=true"; + private static final String repositoryUrlTemplate = "jdbc:hsqldb:file:%s" + File.separator + "blockchain;create=true;hsqldb.full_log_replay=true"; private static final long ARBITRARY_REQUEST_TIMEOUT = 5 * 1000L; // ms private static final long REPOSITORY_BACKUP_PERIOD = 123 * 60 * 1000L; // ms private static final long NTP_PRE_SYNC_CHECK_PERIOD = 5 * 1000L; // ms diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java index b0359218..da3bc5fb 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java @@ -337,8 +337,8 @@ public class HSQLDBRepository implements Repository { Path oldRepoFilePath = oldRepoPath.getFileName(); // Try to open backup. We need to remove "create=true" and insert "backup" dir before final filename. - String backupUrlTemplate = "jdbc:hsqldb:file:%s/backup/%s;create=false;hsqldb.full_log_replay=true"; - return String.format(backupUrlTemplate, oldRepoDirPath.toString(), oldRepoFilePath.toString()); + String backupUrlTemplate = "jdbc:hsqldb:file:%s%sbackup%s%s;create=false;hsqldb.full_log_replay=true"; + return String.format(backupUrlTemplate, oldRepoDirPath.toString(), File.separator, File.separator, oldRepoFilePath.toString()); } /* package */ static void attemptRecovery(String connectionUrl) throws DataException { @@ -361,8 +361,8 @@ public class HSQLDBRepository implements Repository { .forEach(File::delete); try (Statement stmt = connection.createStatement()) { - // Now "backup" the backup back to original repository location (the parent) - // NOTE: trailing / is OK because HSQLDB checks for both / and O/S-specific separator + // Now "backup" the backup back to original repository location (the parent). + // NOTE: trailing / is OK because HSQLDB checks for both / and O/S-specific separator. // textdb.allow_full_path connection property is required to be able to use '..' stmt.execute("BACKUP DATABASE TO '../' BLOCKING AS FILES"); } catch (SQLException e) {