TransactionBroadcast: use stream to simplify collecting sentFutures

This commit is contained in:
Sean Gilligan 2022-07-30 22:54:20 -07:00 committed by Andreas Schildbach
parent 419dba9845
commit 2bd3a8bcde

View file

@ -18,6 +18,7 @@ package org.bitcoinj.core;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.util.concurrent.Uninterruptibles; import com.google.common.util.concurrent.Uninterruptibles;
import org.bitcoinj.base.utils.StreamUtils;
import org.bitcoinj.core.internal.InternalUtils; import org.bitcoinj.core.internal.InternalUtils;
import org.bitcoinj.core.listeners.PreMessageReceivedEventListener; import org.bitcoinj.core.listeners.PreMessageReceivedEventListener;
import org.bitcoinj.utils.ListenableCompletableFuture; import org.bitcoinj.utils.ListenableCompletableFuture;
@ -184,14 +185,11 @@ public class TransactionBroadcast {
numWaitingFor = (int) Math.ceil((peers.size() - numToBroadcastTo) / 2.0); numWaitingFor = (int) Math.ceil((peers.size() - numToBroadcastTo) / 2.0);
log.info("broadcastTransaction: We have {} peers, adding {} to the memory pool", peers.size(), tx.getTxId()); log.info("broadcastTransaction: We have {} peers, adding {} to the memory pool", peers.size(), tx.getTxId());
log.info("Sending to {} peers, will wait for {}, sending to: {}", numToBroadcastTo, numWaitingFor, InternalUtils.joiner(",").join(peers)); log.info("Sending to {} peers, will wait for {}, sending to: {}", numToBroadcastTo, numWaitingFor, InternalUtils.joiner(",").join(peers));
CompletableFuture[] sentFutures = new CompletableFuture[broadcastPeers.size()]; List<CompletableFuture<Void>> sentFutures = broadcastPeers.stream()
int i = 0; .map(this::broadcastOne)
for (final Peer peer : broadcastPeers) { .collect(StreamUtils.toUnmodifiableList());
sentFutures[i] = broadcastOne(peer);
i++;
}
// Complete successfully if ALL peer.sendMessage complete successfully, fail otherwise // Complete successfully if ALL peer.sendMessage complete successfully, fail otherwise
return CompletableFuture.allOf(sentFutures); return CompletableFuture.allOf(sentFutures.toArray(new CompletableFuture[0]));
}, Threading.SAME_THREAD) }, Threading.SAME_THREAD)
.whenComplete((v, err) -> { .whenComplete((v, err) -> {
// Complete `sentFuture` (even though it is currently unused) // Complete `sentFuture` (even though it is currently unused)