diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java index 3edf0ef8..39425b7e 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java @@ -180,9 +180,6 @@ 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; } @@ -437,16 +434,6 @@ public class ArbitraryDataCleanupManager extends Thread { return false; } - 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/controller/arbitrary/ArbitraryDataFileManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java index b509ddfd..6c86d1b6 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java @@ -168,16 +168,6 @@ public class ArbitraryDataFileManager extends Thread { } if (receivedAtLeastOneFile) { - // Update our lookup table to indicate that this peer holds data for this signature - String peerAddress = peer.getPeerData().getAddress().toString(); - ArbitraryPeerData arbitraryPeerData = new ArbitraryPeerData(signature, peer); - repository.discardChanges(); - if (arbitraryPeerData.isPeerAddressValid()) { - LOGGER.debug("Adding arbitrary peer: {} for signature {}", peerAddress, Base58.encode(signature)); - repository.getArbitraryRepository().save(arbitraryPeerData); - repository.saveChanges(); - } - // Invalidate the hosted transactions cache as we are now hosting something new ArbitraryDataStorageManager.getInstance().invalidateHostedTransactionsCache(); @@ -188,7 +178,6 @@ public class ArbitraryDataFileManager extends Thread { // data cache so that it is rebuilt the next time we serve it ArbitraryDataManager.getInstance().invalidateCache(arbitraryTransactionData); } - } return receivedAtLeastOneFile; diff --git a/src/main/java/org/qortal/repository/ArbitraryRepository.java b/src/main/java/org/qortal/repository/ArbitraryRepository.java index ea8ae0de..7a31f40e 100644 --- a/src/main/java/org/qortal/repository/ArbitraryRepository.java +++ b/src/main/java/org/qortal/repository/ArbitraryRepository.java @@ -30,17 +30,4 @@ public interface ArbitraryRepository { public List getArbitraryResourceCreatorNames(Service service, String identifier, boolean defaultResource, Integer limit, Integer offset, Boolean reverse) throws DataException; - - public List getArbitraryPeerDataForSignature(byte[] signature) throws DataException; - - public ArbitraryPeerData getArbitraryPeerDataForSignatureAndPeer(byte[] signature, String peerAddress) throws DataException; - - public ArbitraryPeerData getArbitraryPeerDataForSignatureAndHost(byte[] signature, String host) throws DataException; - - public void save(ArbitraryPeerData arbitraryPeerData) throws DataException; - - 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 a7da66ae..2c88b089 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java @@ -499,149 +499,4 @@ public class HSQLDBArbitraryRepository implements ArbitraryRepository { } } - - // Peer file tracking - - /** - * Fetch a list of peers that have reported to be holding chunks related to - * supplied transaction signature. - * @param signature - * @return a list of ArbitraryPeerData objects, or null if none found - * @throws DataException - */ - @Override - public List getArbitraryPeerDataForSignature(byte[] signature) throws DataException { - // Hash the signature so it fits within 32 bytes - byte[] hashedSignature = Crypto.digest(signature); - - String sql = "SELECT hash, peer_address, successes, failures, last_attempted, last_retrieved " + - "FROM ArbitraryPeers " + - "WHERE hash = ?"; - - List arbitraryPeerData = new ArrayList<>(); - - try (ResultSet resultSet = this.repository.checkedExecute(sql, hashedSignature)) { - if (resultSet == null) - return null; - - do { - byte[] hash = resultSet.getBytes(1); - String peerAddr = resultSet.getString(2); - Integer successes = resultSet.getInt(3); - Integer failures = resultSet.getInt(4); - Long lastAttempted = resultSet.getLong(5); - Long lastRetrieved = resultSet.getLong(6); - - ArbitraryPeerData peerData = new ArbitraryPeerData(hash, peerAddr, successes, failures, - lastAttempted, lastRetrieved); - - arbitraryPeerData.add(peerData); - } while (resultSet.next()); - - return arbitraryPeerData; - } catch (SQLException e) { - throw new DataException("Unable to fetch arbitrary peer data from repository", e); - } - } - - public ArbitraryPeerData getArbitraryPeerDataForSignatureAndPeer(byte[] signature, String peerAddress) throws DataException { - // Hash the signature so it fits within 32 bytes - byte[] hashedSignature = Crypto.digest(signature); - - String sql = "SELECT hash, peer_address, successes, failures, last_attempted, last_retrieved " + - "FROM ArbitraryPeers " + - "WHERE hash = ? AND peer_address = ?"; - - try (ResultSet resultSet = this.repository.checkedExecute(sql, hashedSignature, peerAddress)) { - if (resultSet == null) - return null; - - byte[] hash = resultSet.getBytes(1); - String peerAddr = resultSet.getString(2); - Integer successes = resultSet.getInt(3); - Integer failures = resultSet.getInt(4); - Long lastAttempted = resultSet.getLong(5); - Long lastRetrieved = resultSet.getLong(6); - - ArbitraryPeerData arbitraryPeerData = new ArbitraryPeerData(hash, peerAddr, successes, failures, - lastAttempted, lastRetrieved); - - return arbitraryPeerData; - } catch (SQLException e) { - throw new DataException("Unable to fetch arbitrary peer data from repository", e); - } - } - - public ArbitraryPeerData getArbitraryPeerDataForSignatureAndHost(byte[] signature, String host) throws DataException { - // Hash the signature so it fits within 32 bytes - byte[] hashedSignature = Crypto.digest(signature); - - // Create a host wildcard string which allows any port - String hostWildcard = String.format("%s:%%", host); - - String sql = "SELECT hash, peer_address, successes, failures, last_attempted, last_retrieved " + - "FROM ArbitraryPeers " + - "WHERE hash = ? AND peer_address LIKE ?"; - - try (ResultSet resultSet = this.repository.checkedExecute(sql, hashedSignature, hostWildcard)) { - if (resultSet == null) - return null; - - byte[] hash = resultSet.getBytes(1); - String peerAddr = resultSet.getString(2); - Integer successes = resultSet.getInt(3); - Integer failures = resultSet.getInt(4); - Long lastAttempted = resultSet.getLong(5); - Long lastRetrieved = resultSet.getLong(6); - - ArbitraryPeerData arbitraryPeerData = new ArbitraryPeerData(hash, peerAddr, successes, failures, - lastAttempted, lastRetrieved); - - return arbitraryPeerData; - } catch (SQLException e) { - throw new DataException("Unable to fetch arbitrary peer data from repository", e); - } - } - - @Override - public void save(ArbitraryPeerData arbitraryPeerData) throws DataException { - HSQLDBSaver saveHelper = new HSQLDBSaver("ArbitraryPeers"); - - saveHelper.bind("hash", arbitraryPeerData.getHash()) - .bind("peer_address", arbitraryPeerData.getPeerAddress()) - .bind("successes", arbitraryPeerData.getSuccesses()) - .bind("failures", arbitraryPeerData.getFailures()) - .bind("last_attempted", arbitraryPeerData.getLastAttempted()) - .bind("last_retrieved", arbitraryPeerData.getLastRetrieved()); - - try { - saveHelper.execute(this.repository); - } catch (SQLException e) { - throw new DataException("Unable to save ArbitraryPeerData into repository", e); - } - } - - @Override - public void delete(ArbitraryPeerData arbitraryPeerData) throws DataException { - try { - // Remove peer/hash combination - this.repository.delete("ArbitraryPeers", "hash = ? AND peer_address = ?", - arbitraryPeerData.getHash(), arbitraryPeerData.getPeerAddress()); - - } catch (SQLException e) { - 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); - } - } } diff --git a/src/test/java/org/qortal/test/arbitrary/ArbitraryPeerTests.java b/src/test/java/org/qortal/test/arbitrary/ArbitraryPeerTests.java deleted file mode 100644 index b21713cb..00000000 --- a/src/test/java/org/qortal/test/arbitrary/ArbitraryPeerTests.java +++ /dev/null @@ -1,155 +0,0 @@ -package org.qortal.test.arbitrary; - -import org.junit.Before; -import org.junit.Test; -import org.qortal.crypto.Crypto; -import org.qortal.data.network.ArbitraryPeerData; -import org.qortal.data.network.PeerData; -import org.qortal.network.Peer; -import org.qortal.network.PeerAddress; -import org.qortal.repository.DataException; -import org.qortal.repository.Repository; -import org.qortal.repository.RepositoryManager; -import org.qortal.test.common.Common; -import org.qortal.utils.NTP; - -import java.util.Random; - -import static org.junit.Assert.*; - -public class ArbitraryPeerTests extends Common { - - @Before - public void beforeTest() throws DataException { - Common.useDefaultSettings(); - } - - @Test - public void testSaveArbitraryPeerData() throws DataException { - try (final Repository repository = RepositoryManager.getRepository()) { - - String peerAddress = "123.124.125.126:12392"; - String host = peerAddress.split(":")[0]; - - // Create random bytes to represent a signature - byte[] signature = new byte[64]; - new Random().nextBytes(signature); - - // Make sure we don't have an entry for this hash/peer combination - assertNull(repository.getArbitraryRepository().getArbitraryPeerDataForSignatureAndHost(signature, host)); - - // Now add this mapping to the db - Peer peer = new Peer(new PeerData(PeerAddress.fromString(peerAddress))); - ArbitraryPeerData arbitraryPeerData = new ArbitraryPeerData(signature, peer); - assertTrue(arbitraryPeerData.isPeerAddressValid()); - repository.getArbitraryRepository().save(arbitraryPeerData); - - // We should now have an entry for this hash/peer combination - ArbitraryPeerData retrievedArbitraryPeerData = repository.getArbitraryRepository() - .getArbitraryPeerDataForSignatureAndHost(signature, host); - assertNotNull(retrievedArbitraryPeerData); - - // .. and its data should match what was saved - assertArrayEquals(Crypto.digest(signature), retrievedArbitraryPeerData.getHash()); - assertEquals(peerAddress, retrievedArbitraryPeerData.getPeerAddress()); - - } - } - - @Test - public void testUpdateArbitraryPeerData() throws DataException, InterruptedException { - try (final Repository repository = RepositoryManager.getRepository()) { - - String peerAddress = "123.124.125.126:12392"; - String host = peerAddress.split(":")[0]; - - // Create random bytes to represent a signature - byte[] signature = new byte[64]; - new Random().nextBytes(signature); - - // Make sure we don't have an entry for this hash/peer combination - assertNull(repository.getArbitraryRepository().getArbitraryPeerDataForSignatureAndHost(signature, host)); - - // Now add this mapping to the db - Peer peer = new Peer(new PeerData(PeerAddress.fromString(peerAddress))); - ArbitraryPeerData arbitraryPeerData = new ArbitraryPeerData(signature, peer); - assertTrue(arbitraryPeerData.isPeerAddressValid()); - repository.getArbitraryRepository().save(arbitraryPeerData); - - // We should now have an entry for this hash/peer combination - ArbitraryPeerData retrievedArbitraryPeerData = repository.getArbitraryRepository() - .getArbitraryPeerDataForSignatureAndHost(signature, host); - assertNotNull(retrievedArbitraryPeerData); - - // .. and its data should match what was saved - assertArrayEquals(Crypto.digest(signature), retrievedArbitraryPeerData.getHash()); - assertEquals(peerAddress, retrievedArbitraryPeerData.getPeerAddress()); - - // All stats should be zero - assertEquals(Integer.valueOf(0), retrievedArbitraryPeerData.getSuccesses()); - assertEquals(Integer.valueOf(0), retrievedArbitraryPeerData.getFailures()); - assertEquals(Long.valueOf(0), retrievedArbitraryPeerData.getLastAttempted()); - assertEquals(Long.valueOf(0), retrievedArbitraryPeerData.getLastRetrieved()); - - // Now modify some values and re-save - retrievedArbitraryPeerData.incrementSuccesses(); retrievedArbitraryPeerData.incrementSuccesses(); // Twice - retrievedArbitraryPeerData.incrementFailures(); // Once - retrievedArbitraryPeerData.markAsAttempted(); - Thread.sleep(100); - retrievedArbitraryPeerData.markAsRetrieved(); - assertTrue(arbitraryPeerData.isPeerAddressValid()); - repository.getArbitraryRepository().save(retrievedArbitraryPeerData); - - // Retrieve data once again - ArbitraryPeerData updatedArbitraryPeerData = repository.getArbitraryRepository() - .getArbitraryPeerDataForSignatureAndHost(signature, host); - assertNotNull(updatedArbitraryPeerData); - - // Check the values - assertArrayEquals(Crypto.digest(signature), updatedArbitraryPeerData.getHash()); - assertEquals(peerAddress, updatedArbitraryPeerData.getPeerAddress()); - assertEquals(Integer.valueOf(2), updatedArbitraryPeerData.getSuccesses()); - assertEquals(Integer.valueOf(1), updatedArbitraryPeerData.getFailures()); - assertTrue(updatedArbitraryPeerData.getLastRetrieved().longValue() > 0L); - assertTrue(updatedArbitraryPeerData.getLastAttempted().longValue() > 0L); - assertTrue(updatedArbitraryPeerData.getLastRetrieved() > updatedArbitraryPeerData.getLastAttempted()); - assertTrue(NTP.getTime() - updatedArbitraryPeerData.getLastRetrieved() < 1000); - assertTrue(NTP.getTime() - updatedArbitraryPeerData.getLastAttempted() < 1000); - } - } - - @Test - public void testDuplicatePeerHost() throws DataException { - try (final Repository repository = RepositoryManager.getRepository()) { - - String peerAddress1 = "123.124.125.126:12392"; - String peerAddress2 = "123.124.125.126:62392"; - String host1 = peerAddress1.split(":")[0]; - String host2 = peerAddress2.split(":")[0]; - - // Create random bytes to represent a signature - byte[] signature = new byte[64]; - new Random().nextBytes(signature); - - // Make sure we don't have an entry for these hash/peer combinations - assertNull(repository.getArbitraryRepository().getArbitraryPeerDataForSignatureAndHost(signature, host1)); - assertNull(repository.getArbitraryRepository().getArbitraryPeerDataForSignatureAndHost(signature, host2)); - - // Now add this mapping to the db - Peer peer = new Peer(new PeerData(PeerAddress.fromString(peerAddress1))); - ArbitraryPeerData arbitraryPeerData = new ArbitraryPeerData(signature, peer); - assertTrue(arbitraryPeerData.isPeerAddressValid()); - repository.getArbitraryRepository().save(arbitraryPeerData); - - // We should now have an entry for this hash/peer combination - ArbitraryPeerData retrievedArbitraryPeerData = repository.getArbitraryRepository() - .getArbitraryPeerDataForSignatureAndHost(signature, host1); - assertNotNull(retrievedArbitraryPeerData); - - // And we should also have an entry for the similar peerAddress string with a matching host - ArbitraryPeerData retrievedArbitraryPeerData2 = repository.getArbitraryRepository() - .getArbitraryPeerDataForSignatureAndHost(signature, host2); - assertNotNull(retrievedArbitraryPeerData2); - } - } -}