Browse Source

Removed all code that interfaced with the ArbitraryPeers table

pull/75/head
CalDescent 3 years ago
parent
commit
42fcee0cfd
  1. 13
      src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java
  2. 11
      src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileManager.java
  3. 13
      src/main/java/org/qortal/repository/ArbitraryRepository.java
  4. 145
      src/main/java/org/qortal/repository/hsqldb/HSQLDBArbitraryRepository.java
  5. 155
      src/test/java/org/qortal/test/arbitrary/ArbitraryPeerTests.java

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

11
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;

13
src/main/java/org/qortal/repository/ArbitraryRepository.java

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

145
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<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);
}
}
}

155
src/test/java/org/qortal/test/arbitrary/ArbitraryPeerTests.java

@ -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…
Cancel
Save