From 9850c294d133e6feaa7e7e51af0a47f0a7649ee3 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sun, 15 Aug 2021 11:28:26 +0100 Subject: [PATCH] Fixed various issues relating to syncing data for transactions without any chunks. --- .../org/qortal/arbitrary/ArbitraryDataFile.java | 3 +++ .../qortal/controller/ArbitraryDataManager.java | 15 ++++++++++++--- .../hsqldb/HSQLDBArbitraryRepository.java | 5 +++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java index 434c626b..98b0c667 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataFile.java @@ -390,6 +390,9 @@ public class ArbitraryDataFile { return chunk.exists(); } } + if (Arrays.equals(this.getHash(), hash)) { + return this.exists(); + } return false; } diff --git a/src/main/java/org/qortal/controller/ArbitraryDataManager.java b/src/main/java/org/qortal/controller/ArbitraryDataManager.java index 991565bd..10c5d448 100644 --- a/src/main/java/org/qortal/controller/ArbitraryDataManager.java +++ b/src/main/java/org/qortal/controller/ArbitraryDataManager.java @@ -287,8 +287,11 @@ public class ArbitraryDataManager extends Thread { for (byte[] hash : hashes) { //LOGGER.info("Received hash {}", Base58.encode(hash)); if (!arbitraryDataFile.containsChunk(hash)) { - LOGGER.info("Received non-matching chunk hash {} for signature {}", Base58.encode(hash), signature58); - return; + // Check the hash against the complete file + if (!Arrays.equals(arbitraryDataFile.getHash(), hash)) { + LOGGER.info("Received non-matching chunk hash {} for signature {}", Base58.encode(hash), signature58); + return; + } } } @@ -391,6 +394,12 @@ public class ArbitraryDataManager extends Thread { } } } + else { + // This transaction has no chunks, so include the complete file if we have it + if (arbitraryDataFile.exists()) { + hashes.add(arbitraryDataFile.getHash()); + } + } } } catch (DataException e) { @@ -403,7 +412,7 @@ public class ArbitraryDataManager extends Thread { LOGGER.info("Couldn't send list of hashes"); peer.disconnect("failed to send list of hashes"); } - LOGGER.info("Sent list of hashes", hashes); + LOGGER.info("Sent list of hashes (count: {})", hashes.size()); } } diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java index 42321584..b6a920af 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java @@ -65,6 +65,11 @@ public class HSQLDBArbitraryRepository implements ArbitraryRepository { return true; } + // If this transaction doesn't have any chunks, then we require the complete file + if (chunkHashes == null) { + return false; + } + // Alternatively, if we have all the chunks, then it's safe to assume the data is local if (arbitraryDataFile.allChunksExist(chunkHashes)) { return true;