@ -830,6 +830,10 @@ public class Controller extends Thread {
}
}
}
}
private void removeIncomingTransaction ( byte [ ] signature ) {
incomingTransactions . removeIf ( t - > Arrays . equals ( t . getSignature ( ) , signature ) ) ;
}
private void processIncomingTransactionsQueue ( ) {
private void processIncomingTransactionsQueue ( ) {
if ( this . incomingTransactions . size ( ) = = 0 ) {
if ( this . incomingTransactions . size ( ) = = 0 ) {
// Don't bother locking if there are no new transactions to process
// Don't bother locking if there are no new transactions to process
@ -853,17 +857,20 @@ public class Controller extends Thread {
}
}
try ( final Repository repository = RepositoryManager . getRepository ( ) ) {
try ( final Repository repository = RepositoryManager . getRepository ( ) ) {
LOGGER . debug ( "Processing incoming transactions queue (size {})..." , this . incomingTransactions . size ( ) ) ;
// Take a copy of incomingTransactions so we can release the lock
List < TransactionData > incomingTransactionsCopy = new ArrayList < > ( this . incomingTransactions ) ;
// Iterate through incoming transactions list
// Iterate through incoming transactions list
synchronized ( this . incomingTransactions ) { // Required in order to safely iterate a synchronizedList()
Iterator iterator = incomingTransactionsCopy . iterator ( ) ;
Iterator iterator = this . incomingTransactions . iterator ( ) ;
while ( iterator . hasNext ( ) ) {
while ( iterator . hasNext ( ) ) {
if ( isStopping ) {
if ( isStopping ) {
return ;
return ;
}
}
if ( Synchronizer . getInstance ( ) . isSyncRequestPending ( ) ) {
if ( Synchronizer . getInstance ( ) . isSyncRequestPending ( ) ) {
LOGGER . debug ( "Breaking out of transaction processing loop with {} remaining, because a sync request is pending" , this . incomingTransactions . size ( ) ) ;
LOGGER . debug ( "Breaking out of transaction processing loop with {} remaining, because a sync request is pending" , incomingTransactionsCopy . size ( ) ) ;
return ;
return ;
}
}
@ -873,7 +880,7 @@ public class Controller extends Thread {
// Check signature
// Check signature
if ( ! transaction . isSignatureValid ( ) ) {
if ( ! transaction . isSignatureValid ( ) ) {
LOGGER . trace ( ( ) - > String . format ( "Ignoring %s transaction %s with invalid signature" , transactionData . getType ( ) . name ( ) , Base58 . encode ( transactionData . getSignature ( ) ) ) ) ;
LOGGER . trace ( ( ) - > String . format ( "Ignoring %s transaction %s with invalid signature" , transactionData . getType ( ) . name ( ) , Base58 . encode ( transactionData . getSignature ( ) ) ) ) ;
iterator . remove ( ) ;
removeIncomingTransaction ( transactionData . getSignature ( ) ) ;
continue ;
continue ;
}
}
@ -881,13 +888,13 @@ public class Controller extends Thread {
if ( validationResult = = ValidationResult . TRANSACTION_ALREADY_EXISTS ) {
if ( validationResult = = ValidationResult . TRANSACTION_ALREADY_EXISTS ) {
LOGGER . trace ( ( ) - > String . format ( "Ignoring existing transaction %s" , Base58 . encode ( transactionData . getSignature ( ) ) ) ) ;
LOGGER . trace ( ( ) - > String . format ( "Ignoring existing transaction %s" , Base58 . encode ( transactionData . getSignature ( ) ) ) ) ;
iterator . remove ( ) ;
removeIncomingTransaction ( transactionData . getSignature ( ) ) ;
continue ;
continue ;
}
}
if ( validationResult = = ValidationResult . NO_BLOCKCHAIN_LOCK ) {
if ( validationResult = = ValidationResult . NO_BLOCKCHAIN_LOCK ) {
LOGGER . trace ( ( ) - > String . format ( "Couldn't lock blockchain to import unconfirmed transaction" , Base58 . encode ( transactionData . getSignature ( ) ) ) ) ;
LOGGER . trace ( ( ) - > String . format ( "Couldn't lock blockchain to import unconfirmed transaction" , Base58 . encode ( transactionData . getSignature ( ) ) ) ) ;
iterator . remove ( ) ;
removeIncomingTransaction ( transactionData . getSignature ( ) ) ;
continue ;
continue ;
}
}
@ -906,17 +913,17 @@ public class Controller extends Thread {
// Invalid, unconfirmed transaction has become stale - add to invalidUnconfirmedTransactions so that we don't keep requesting it
// Invalid, unconfirmed transaction has become stale - add to invalidUnconfirmedTransactions so that we don't keep requesting it
invalidUnconfirmedTransactions . put ( signature58 , expiry ) ;
invalidUnconfirmedTransactions . put ( signature58 , expiry ) ;
}
}
iterator . remove ( ) ;
removeIncomingTransaction ( transactionData . getSignature ( ) ) ;
continue ;
continue ;
}
}
LOGGER . debug ( ( ) - > String . format ( "Imported %s transaction %s" , transactionData . getType ( ) . name ( ) , Base58 . encode ( transactionData . getSignature ( ) ) ) ) ;
LOGGER . debug ( ( ) - > String . format ( "Imported %s transaction %s" , transactionData . getType ( ) . name ( ) , Base58 . encode ( transactionData . getSignature ( ) ) ) ) ;
iterator . remove ( ) ;
removeIncomingTransaction ( transactionData . getSignature ( ) ) ;
}
}
}
} catch ( DataException e ) {
} catch ( DataException e ) {
LOGGER . error ( String . format ( "Repository issue while processing incoming transactions" , e ) ) ;
LOGGER . error ( String . format ( "Repository issue while processing incoming transactions" , e ) ) ;
} finally {
} finally {
LOGGER . debug ( "Finished processing incoming transactions queue" ) ;
blockchainLock . unlock ( ) ;
blockchainLock . unlock ( ) ;
}
}
}
}