diff --git a/convex-core/src/main/java/convex/core/BeliefMerge.java b/convex-core/src/main/java/convex/core/BeliefMerge.java index e2b6e59b3..bcfa361ef 100644 --- a/convex-core/src/main/java/convex/core/BeliefMerge.java +++ b/convex-core/src/main/java/convex/core/BeliefMerge.java @@ -561,6 +561,9 @@ public static boolean compareOrders(Order oldOrder, Order newOrder) { // new Order is more recent, so switch to this return true; } else { + // Don't replace if equal + if (oldOrder.equals(newOrder)) return false; + // This probably shouldn't happen if peers are sticking to timestamps // But we compare anyway // Prefer advanced consensus diff --git a/convex-gui/src/main/java/convex/gui/manager/windows/peer/PeerInfoPanel.java b/convex-gui/src/main/java/convex/gui/manager/windows/peer/PeerInfoPanel.java index bf9184e76..0e2649560 100644 --- a/convex-gui/src/main/java/convex/gui/manager/windows/peer/PeerInfoPanel.java +++ b/convex-gui/src/main/java/convex/gui/manager/windows/peer/PeerInfoPanel.java @@ -87,7 +87,10 @@ private void updateState(Convex p) { sb.append(s.getStatusVector()+"\n"); sb.append("\n"); - sb.append("Transactions Pending: "+s.getTransactionHandler().countInterests()); + sb.append("Transactions:\n"); + sb.append("- Received: "+s.getTransactionHandler().receivedTransactionCount+"\n"); + sb.append("- Queued (valid): "+s.getTransactionHandler().clientTransactionCount+"\n"); + sb.append("- Pending: "+s.getTransactionHandler().countInterests()+"\n"); sb.append("\n"); sb.append("Beliefs Sent: "+s.getBeliefPropagator().getBeliefBroadcastCount()+"\n"); diff --git a/convex-peer/src/main/java/convex/peer/BeliefPropagator.java b/convex-peer/src/main/java/convex/peer/BeliefPropagator.java index cd6a8f556..d9a2f098e 100644 --- a/convex-peer/src/main/java/convex/peer/BeliefPropagator.java +++ b/convex-peer/src/main/java/convex/peer/BeliefPropagator.java @@ -279,10 +279,11 @@ private Belief awaitBelief() throws InterruptedException { beliefQueue.drainTo(beliefMessages); HashMap> newOrders=belief.getOrdersHashMap(); // log.info("Merging Beliefs: "+allBeliefs.size()); - boolean anyOrderChanged=false; + boolean anyOrderChanged=false; for (Message m: beliefMessages) { - anyOrderChanged=mergeBeliefMessage(newOrders,m); + boolean changed=mergeBeliefMessage(newOrders,m); + if (changed) anyOrderChanged=true; } if (!anyOrderChanged) return null; @@ -291,7 +292,7 @@ private Belief awaitBelief() throws InterruptedException { } - protected boolean mergeBeliefMessage(HashMap> newOrders, Message m) { + protected boolean mergeBeliefMessage(HashMap> orders, Message m) { boolean changed=false; AccountKey myKey=server.getPeerKey(); try { @@ -305,14 +306,17 @@ protected boolean mergeBeliefMessage(HashMap> newO try { AccountKey key=so.getAccountKey(); + // Check if this Order could replace existing Order if (Utils.equals(myKey, key)) continue; // skip own order - if (newOrders.containsKey(key)) { + if (orders.containsKey(key)) { Order newOrder=so.getValue(); - Order oldOrder=newOrders.get(key).getValue(); + Order oldOrder=orders.get(key).getValue(); boolean replace=BeliefMerge.compareOrders(oldOrder, newOrder); if (!replace) continue; } + // TODO: check if Peer key is valid in current state? + // Check signature before we accept Order if (!so.checkSignature()) { log.warn("Bad Order signature"); @@ -323,7 +327,7 @@ protected boolean mergeBeliefMessage(HashMap> newO // Ensure we can persist newly received Order so=ACell.createPersisted(so).getValue(); - newOrders.put(key, so); + orders.put(key, so); changed=true; } catch (MissingDataException e) { Hash h=e.getMissingHash(); diff --git a/convex-peer/src/main/java/convex/peer/TransactionHandler.java b/convex-peer/src/main/java/convex/peer/TransactionHandler.java index 91f6c1981..13d64cac2 100644 --- a/convex-peer/src/main/java/convex/peer/TransactionHandler.java +++ b/convex-peer/src/main/java/convex/peer/TransactionHandler.java @@ -61,7 +61,7 @@ public class TransactionHandler extends AThreadedComponent{ protected final ArrayBlockingQueue txMessageQueue; /** - * Queue for received Transactions submitted for clients of this Peer + * Queue for valid received Transactions submitted for clients of this Peer */ ArrayBlockingQueue> transactionQueue; @@ -85,6 +85,9 @@ public boolean offerTransaction(Message m) { */ private HashMap interests = new HashMap<>(); + public long clientTransactionCount=0; + public long receivedTransactionCount=0; + /** * Register interest in receiving a result for a transaction * @param signedTransactionHash @@ -96,6 +99,8 @@ private void registerInterest(Hash signedTransactionHash, Message m) { protected void processMessage(Message m) { try { + this.receivedTransactionCount++; + // Transaction is a vector [id , signed-object] AVector v = m.getPayload(); @SuppressWarnings("unchecked") @@ -129,6 +134,7 @@ protected void processMessage(Message m) { LoadMonitor.down(); transactionQueue.put(sd); LoadMonitor.up(); + this.clientTransactionCount++; registerInterest(sd.getHash(), m); } catch (Throwable e) {