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)));
|
||||
|
||||
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);
|
||||
|
@ -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;
|
||||
|
@ -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<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