From 3cce097b9def30fa81522838b35afe0c07ed123d Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 13 Nov 2021 16:58:23 +0000 Subject: [PATCH] When a newer PUT exists for a resource, delete records of peers holding earlier transactions This should help keep the peer lookup table size down, as there is no need to locate files for transactions that existed before the most recent PUT transaction. --- .../arbitrary/ArbitraryDataCleanupManager.java | 13 +++++++++++++ .../org/qortal/repository/ArbitraryRepository.java | 2 ++ .../hsqldb/HSQLDBArbitraryRepository.java | 12 ++++++++++++ 3 files changed, 27 insertions(+) diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java index 5a7936e3..b904b3cd 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java @@ -146,6 +146,9 @@ public class ArbitraryDataCleanupManager extends Thread { arbitraryTransactionData.getName(), Base58.encode(signature))); ArbitraryTransactionUtils.deleteCompleteFileAndChunks(arbitraryTransactionData); + + // We should also remove peers for this transaction from the lookup table to save space + this.removePeersHostingTransactionData(repository, arbitraryTransactionData); continue; } @@ -187,6 +190,16 @@ public class ArbitraryDataCleanupManager extends Thread { } } + private void removePeersHostingTransactionData(Repository repository, ArbitraryTransactionData transactionData) { + byte[] signature = transactionData.getSignature(); + try { + repository.getArbitraryRepository().deleteArbitraryPeersWithSignature(signature); + repository.saveChanges(); + } catch (DataException e) { + LOGGER.debug("Unable to delete peers from lookup table for signature: {}", Base58.encode(signature)); + } + } + private void cleanupTempDirectory(String folder, long now, long minAge) { String baseDir = Settings.getInstance().getTempDataPath(); Path tempDir = Paths.get(baseDir, folder); diff --git a/src/main/java/org/qortal/repository/ArbitraryRepository.java b/src/main/java/org/qortal/repository/ArbitraryRepository.java index 608d475c..a013ae33 100644 --- a/src/main/java/org/qortal/repository/ArbitraryRepository.java +++ b/src/main/java/org/qortal/repository/ArbitraryRepository.java @@ -33,4 +33,6 @@ public interface ArbitraryRepository { public void delete(ArbitraryPeerData arbitraryPeerData) throws DataException; + public void deleteArbitraryPeersWithSignature(byte[] signature) throws DataException; + } diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java index 2a5312c6..a07c77e0 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java @@ -444,4 +444,16 @@ public class HSQLDBArbitraryRepository implements ArbitraryRepository { throw new DataException("Unable to delete arbitrary peer data from repository", e); } } + + @Override + public void deleteArbitraryPeersWithSignature(byte[] signature) throws DataException { + byte[] hash = Crypto.digest(signature); + try { + // Remove all records of peers hosting supplied signature + this.repository.delete("ArbitraryPeers", "hash = ?", hash); + + } catch (SQLException e) { + throw new DataException("Unable to delete arbitrary peer data from repository", e); + } + } }