From c592051a805ecb261dddc19b15fb56b7e42a78b8 Mon Sep 17 00:00:00 2001 From: catbref Date: Sat, 27 Feb 2021 17:29:19 +0000 Subject: [PATCH] Speed up BlockMinter by filtering out 'unconfirmable' transaction types like CHAT & PRESENCE --- .../repository/TransactionRepository.java | 9 ++++ .../HSQLDBTransactionRepository.java | 46 +++++++++++++++++++ .../org/qortal/transaction/Transaction.java | 4 +- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/repository/TransactionRepository.java b/src/main/java/org/qortal/repository/TransactionRepository.java index acde78df..4e5999eb 100644 --- a/src/main/java/org/qortal/repository/TransactionRepository.java +++ b/src/main/java/org/qortal/repository/TransactionRepository.java @@ -1,5 +1,6 @@ package org.qortal.repository; +import java.util.EnumSet; import java.util.List; import java.util.Map; @@ -251,6 +252,14 @@ public interface TransactionRepository { */ public List getUnconfirmedTransactions(TransactionType txType, byte[] creatorPublicKey) throws DataException; + /** + * Returns list of unconfirmed transactions excluding specified type(s). + * + * @return list of transactions, or empty if none. + * @throws DataException + */ + public List getUnconfirmedTransactions(EnumSet excludedTxTypes) throws DataException; + /** * Remove transaction from unconfirmed transactions pile. * diff --git a/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java b/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java index 83eeba72..a8062e2d 100644 --- a/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java @@ -9,6 +9,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.EnumMap; +import java.util.EnumSet; import java.util.List; import java.util.Map; @@ -1181,6 +1182,51 @@ public class HSQLDBTransactionRepository implements TransactionRepository { } } + @Override + public List getUnconfirmedTransactions(EnumSet excludedTxTypes) throws DataException { + StringBuilder sql = new StringBuilder(1024); + sql.append("SELECT signature FROM UnconfirmedTransactions "); + sql.append("JOIN Transactions USING (signature) "); + sql.append("WHERE type NOT IN ("); + + boolean firstTxType = true; + for (TransactionType txType : excludedTxTypes) { + if (firstTxType) + firstTxType = false; + else + sql.append(", "); + + sql.append(txType.value); + } + + sql.append(")"); + sql.append("ORDER BY created_when, signature"); + + List transactions = new ArrayList<>(); + + // Find transactions with no corresponding row in BlockTransactions + try (ResultSet resultSet = this.repository.checkedExecute(sql.toString())) { + if (resultSet == null) + return transactions; + + do { + byte[] signature = resultSet.getBytes(1); + + TransactionData transactionData = this.fromSignature(signature); + + if (transactionData == null) + // Something inconsistent with the repository + throw new DataException(String.format("Unable to fetch unconfirmed transaction %s from repository?", Base58.encode(signature))); + + transactions.add(transactionData); + } while (resultSet.next()); + + return transactions; + } catch (SQLException | DataException e) { + throw new DataException("Unable to fetch unconfirmed transactions from repository", e); + } + } + @Override public void confirmTransaction(byte[] signature) throws DataException { try { diff --git a/src/main/java/org/qortal/transaction/Transaction.java b/src/main/java/org/qortal/transaction/Transaction.java index 3ed02f8d..d7dd1455 100644 --- a/src/main/java/org/qortal/transaction/Transaction.java +++ b/src/main/java/org/qortal/transaction/Transaction.java @@ -4,6 +4,7 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; +import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -605,7 +606,8 @@ public abstract class Transaction { public static List getUnconfirmedTransactions(Repository repository) throws DataException { BlockData latestBlockData = repository.getBlockRepository().getLastBlock(); - List unconfirmedTransactions = repository.getTransactionRepository().getUnconfirmedTransactions(); + EnumSet excludedTxTypes = EnumSet.of(TransactionType.CHAT, TransactionType.PRESENCE); + List unconfirmedTransactions = repository.getTransactionRepository().getUnconfirmedTransactions(excludedTxTypes); unconfirmedTransactions.sort(getDataComparator());