@ -3,6 +3,7 @@ package org.qortal.controller.arbitrary;
import org.apache.logging.log4j.LogManager ;
import org.apache.logging.log4j.LogManager ;
import org.apache.logging.log4j.Logger ;
import org.apache.logging.log4j.Logger ;
import org.qortal.controller.Controller ;
import org.qortal.controller.Controller ;
import org.qortal.data.arbitrary.ArbitraryFileListResponseInfo ;
import org.qortal.data.transaction.ArbitraryTransactionData ;
import org.qortal.data.transaction.ArbitraryTransactionData ;
import org.qortal.network.Peer ;
import org.qortal.network.Peer ;
import org.qortal.repository.DataException ;
import org.qortal.repository.DataException ;
@ -11,11 +12,9 @@ import org.qortal.repository.RepositoryManager;
import org.qortal.utils.ArbitraryTransactionUtils ;
import org.qortal.utils.ArbitraryTransactionUtils ;
import org.qortal.utils.Base58 ;
import org.qortal.utils.Base58 ;
import org.qortal.utils.NTP ;
import org.qortal.utils.NTP ;
import org.qortal.utils.Triple ;
import java.util.Arrays ;
import java.util.* ;
import java.util.Iterator ;
import java.util.stream.Collectors ;
import java.util.Map ;
public class ArbitraryDataFileRequestThread implements Runnable {
public class ArbitraryDataFileRequestThread implements Runnable {
@ -51,45 +50,49 @@ public class ArbitraryDataFileRequestThread implements Runnable {
boolean shouldProcess = false ;
boolean shouldProcess = false ;
synchronized ( arbitraryDataFileManager . arbitraryDataFileHashResponses ) {
synchronized ( arbitraryDataFileManager . arbitraryDataFileHashResponses ) {
Iterator iterator = arbitraryDataFileManager . arbitraryDataFileHashResponses . entrySet ( ) . iterator ( ) ;
if ( ! arbitraryDataFileManager . arbitraryDataFileHashResponses . isEmpty ( ) ) {
while ( iterator . hasNext ( ) ) {
if ( Controller . isStopping ( ) ) {
// Sort by lowest number of node hops first
return ;
Comparator < ArbitraryFileListResponseInfo > lowestHopsFirstComparator =
}
Comparator . comparingInt ( ArbitraryFileListResponseInfo : : getRequestHops ) ;
arbitraryDataFileManager . arbitraryDataFileHashResponses = arbitraryDataFileManager . arbitraryDataFileHashResponses
Map . Entry entry = ( Map . Entry ) iterator . next ( ) ;
. stream ( ) . sorted ( lowestHopsFirstComparator )
if ( entry = = null | | entry . getKey ( ) = = null | | entry . getValue ( ) = = null ) {
. collect ( Collectors . toCollection ( ( ) - > Collections . synchronizedList ( new ArrayList < > ( ) ) ) ) ;
iterator . remove ( ) ;
continue ;
Iterator iterator = arbitraryDataFileManager . arbitraryDataFileHashResponses . iterator ( ) ;
}
while ( iterator . hasNext ( ) ) {
if ( Controller . isStopping ( ) ) {
hash58 = ( String ) entry . getKey ( ) ;
return ;
Triple < Peer , String , Long > value = ( Triple < Peer , String , Long > ) entry . getValue ( ) ;
}
if ( value = = null ) {
iterator . remove ( ) ;
ArbitraryFileListResponseInfo responseInfo = ( ArbitraryFileListResponseInfo ) iterator . next ( ) ;
continue ;
if ( responseInfo = = null ) {
}
iterator . remove ( ) ;
continue ;
peer = value . getA ( ) ;
}
signature58 = value . getB ( ) ;
Long timestamp = value . getC ( ) ;
hash58 = responseInfo . getHash58 ( ) ;
peer = responseInfo . getPeer ( ) ;
if ( now - timestamp > = ArbitraryDataManager . ARBITRARY_RELAY_TIMEOUT | | signature58 = = null | | peer = = null ) {
signature58 = responseInfo . getSignature58 ( ) ;
// Ignore - to be deleted
Long timestamp = responseInfo . getTimestamp ( ) ;
if ( now - timestamp > = ArbitraryDataManager . ARBITRARY_RELAY_TIMEOUT | | signature58 = = null | | peer = = null ) {
// Ignore - to be deleted
iterator . remove ( ) ;
continue ;
}
// Skip if already requesting, but don't remove, as we might want to retry later
if ( arbitraryDataFileManager . arbitraryDataFileRequests . containsKey ( hash58 ) ) {
// Already requesting - leave this attempt for later
continue ;
}
// We want to process this file
shouldProcess = true ;
iterator . remove ( ) ;
iterator . remove ( ) ;
continue ;
break ;
}
}
// Skip if already requesting, but don't remove, as we might want to retry later
if ( arbitraryDataFileManager . arbitraryDataFileRequests . containsKey ( hash58 ) ) {
// Already requesting - leave this attempt for later
continue ;
}
// We want to process this file
shouldProcess = true ;
iterator . remove ( ) ;
break ;
}
}
}
}