forked from Qortal/qortal
Removed all code that interfaced with the ArbitraryPeers table
This commit is contained in:
parent
829a2e937b
commit
42fcee0cfd
@ -180,9 +180,6 @@ public class ArbitraryDataCleanupManager extends Thread {
|
|||||||
arbitraryTransactionData.getName(), Base58.encode(signature)));
|
arbitraryTransactionData.getName(), Base58.encode(signature)));
|
||||||
|
|
||||||
ArbitraryTransactionUtils.deleteCompleteFileAndChunks(arbitraryTransactionData);
|
ArbitraryTransactionUtils.deleteCompleteFileAndChunks(arbitraryTransactionData);
|
||||||
|
|
||||||
// We should also remove peers for this transaction from the lookup table to save space
|
|
||||||
this.removePeersHostingTransactionData(repository, arbitraryTransactionData);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -437,16 +434,6 @@ public class ArbitraryDataCleanupManager extends Thread {
|
|||||||
return false;
|
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) {
|
private void cleanupTempDirectory(String folder, long now, long minAge) {
|
||||||
String baseDir = Settings.getInstance().getTempDataPath();
|
String baseDir = Settings.getInstance().getTempDataPath();
|
||||||
Path tempDir = Paths.get(baseDir, folder);
|
Path tempDir = Paths.get(baseDir, folder);
|
||||||
|
@ -168,16 +168,6 @@ public class ArbitraryDataFileManager extends Thread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (receivedAtLeastOneFile) {
|
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
|
// Invalidate the hosted transactions cache as we are now hosting something new
|
||||||
ArbitraryDataStorageManager.getInstance().invalidateHostedTransactionsCache();
|
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
|
// data cache so that it is rebuilt the next time we serve it
|
||||||
ArbitraryDataManager.getInstance().invalidateCache(arbitraryTransactionData);
|
ArbitraryDataManager.getInstance().invalidateCache(arbitraryTransactionData);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return receivedAtLeastOneFile;
|
return receivedAtLeastOneFile;
|
||||||
|
@ -30,17 +30,4 @@ public interface ArbitraryRepository {
|
|||||||
|
|
||||||
public List<ArbitraryResourceNameInfo> getArbitraryResourceCreatorNames(Service service, String identifier, boolean defaultResource, Integer limit, Integer offset, Boolean reverse) throws DataException;
|
public List<ArbitraryResourceNameInfo> getArbitraryResourceCreatorNames(Service service, String identifier, boolean defaultResource, Integer limit, Integer offset, Boolean reverse) throws DataException;
|
||||||
|
|
||||||
|
|
||||||
public List<ArbitraryPeerData> 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;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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<ArbitraryPeerData> 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> 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user