Browse Source

Allow duplicate variations of each OnlineAccountData in the import queue, but don't allow two entries that match exactly.

BLOCK_SUMMARIES_V2
CalDescent 2 years ago
parent
commit
6d9e6e8d4c
  1. 24
      src/main/java/org/qortal/controller/OnlineAccountsManager.java

24
src/main/java/org/qortal/controller/OnlineAccountsManager.java

@ -66,7 +66,7 @@ public class OnlineAccountsManager {
private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(4, new NamedThreadFactory("OnlineAccounts"));
private volatile boolean isStopping = false;
private final Set<OnlineAccountData> onlineAccountsImportQueue = ConcurrentHashMap.newKeySet();
private final List<OnlineAccountData> onlineAccountsImportQueue = Collections.synchronizedList(new ArrayList<>());
/**
* Cache of 'current' online accounts, keyed by timestamp
@ -184,9 +184,12 @@ public class OnlineAccountsManager {
LOGGER.debug("Processing online accounts import queue (size: {})", this.onlineAccountsImportQueue.size());
// Take a copy of onlineAccountsImportQueue so we can safely remove whilst iterating
List<OnlineAccountData> onlineAccountsImportQueueCopy = new ArrayList<>(this.onlineAccountsImportQueue);
Set<OnlineAccountData> onlineAccountsToAdd = new HashSet<>();
try (final Repository repository = RepositoryManager.getRepository()) {
for (OnlineAccountData onlineAccountData : this.onlineAccountsImportQueue) {
for (OnlineAccountData onlineAccountData : onlineAccountsImportQueueCopy) {
if (isStopping)
return;
@ -207,6 +210,19 @@ public class OnlineAccountsManager {
}
}
private boolean importQueueContainsExactMatch(OnlineAccountData acc) {
// Check if an item exists where all properties match exactly
// This is needed because signature and nonce are not compared in OnlineAccountData.equals()
synchronized (onlineAccountsImportQueue) {
return onlineAccountsImportQueue.stream().anyMatch(otherAcc ->
acc.getTimestamp() == otherAcc.getTimestamp() &&
Arrays.equals(acc.getPublicKey(), otherAcc.getPublicKey()) &&
acc.getNonce() == otherAcc.getNonce() &&
Arrays.equals(acc.getSignature(), otherAcc.getSignature())
);
}
}
/**
* Check if supplied onlineAccountData is superior (i.e. has a nonce value) than existing record.
* Two entries are considered equal even if the nonce differs, to prevent multiple variations
@ -809,6 +825,10 @@ public class OnlineAccountsManager {
// We have already validated this online account
continue;
if (this.importQueueContainsExactMatch(onlineAccountData))
// Identical online account data already present in queue
continue;
boolean isNewEntry = onlineAccountsImportQueue.add(onlineAccountData);
if (isNewEntry)

Loading…
Cancel
Save