Search in sources :

Example 1 with BroadcastResponse

use of org.hyperledger.fabric.protos.orderer.Ab.BroadcastResponse in project fabric-sdk-java by hyperledger.

the class Channel method sendUpdateChannel.

private void sendUpdateChannel(byte[] configupdate, byte[][] signers, Orderer orderer) throws TransactionException, InvalidArgumentException {
    logger.debug(format("Channel %s sendUpdateChannel", name));
    checkOrderer(orderer);
    try {
        final long nanoTimeStart = System.nanoTime();
        int statusCode = 0;
        do {
            // Make sure we have fresh transaction context for each try just to be safe.
            TransactionContext transactionContext = getTransactionContext();
            ConfigUpdateEnvelope.Builder configUpdateEnvBuilder = ConfigUpdateEnvelope.newBuilder();
            configUpdateEnvBuilder.setConfigUpdate(ByteString.copyFrom(configupdate));
            for (byte[] signer : signers) {
                configUpdateEnvBuilder.addSignatures(ConfigSignature.parseFrom(signer));
            }
            // --------------
            // Construct Payload Envelope.
            final ByteString sigHeaderByteString = getSignatureHeaderAsByteString(transactionContext);
            final ChannelHeader payloadChannelHeader = ProtoUtils.createChannelHeader(HeaderType.CONFIG_UPDATE, transactionContext.getTxID(), name, transactionContext.getEpoch(), transactionContext.getFabricTimestamp(), null, null);
            final Header payloadHeader = Header.newBuilder().setChannelHeader(payloadChannelHeader.toByteString()).setSignatureHeader(sigHeaderByteString).build();
            final ByteString payloadByteString = Payload.newBuilder().setHeader(payloadHeader).setData(configUpdateEnvBuilder.build().toByteString()).build().toByteString();
            ByteString payloadSignature = transactionContext.signByteStrings(payloadByteString);
            Envelope payloadEnv = Envelope.newBuilder().setSignature(payloadSignature).setPayload(payloadByteString).build();
            BroadcastResponse trxResult = orderer.sendTransaction(payloadEnv);
            statusCode = trxResult.getStatusValue();
            logger.debug(format("Channel %s sendUpdateChannel %d", name, statusCode));
            if (statusCode == 404 || statusCode == 503) {
                // these we can retry..
                final long duration = TimeUnit.MILLISECONDS.convert(System.nanoTime() - nanoTimeStart, TimeUnit.NANOSECONDS);
                if (duration > CHANNEL_CONFIG_WAIT_TIME) {
                    // waited long enough .. throw an exception
                    String info = trxResult.getInfo();
                    if (null == info) {
                        info = "";
                    }
                    throw new TransactionException(format("Channel %s update error timed out after %d ms. Status value %d. Status %s. %s", name, duration, statusCode, trxResult.getStatus().name(), info));
                }
                try {
                    // try again sleep
                    Thread.sleep(ORDERER_RETRY_WAIT_TIME);
                } catch (InterruptedException e) {
                    TransactionException te = new TransactionException("update thread Sleep", e);
                    logger.warn(te.getMessage(), te);
                }
            } else if (200 != statusCode) {
                // Can't retry.
                String info = trxResult.getInfo();
                if (null == info) {
                    info = "";
                }
                throw new TransactionException(format("New channel %s error. StatusValue %d. Status %s. %s", name, statusCode, "" + trxResult.getStatus(), info));
            }
        } while (// try again
        200 != statusCode);
    } catch (TransactionException e) {
        logger.error(format("Channel %s error: %s", name, e.getMessage()), e);
        throw e;
    } catch (Exception e) {
        String msg = format("Channel %s error: %s", name, e.getMessage());
        logger.error(msg, e);
        throw new TransactionException(msg, e);
    }
}
Also used : ConfigUpdateEnvelope(org.hyperledger.fabric.protos.common.Configtx.ConfigUpdateEnvelope) BroadcastResponse(org.hyperledger.fabric.protos.orderer.Ab.BroadcastResponse) ProtoUtils.getSignatureHeaderAsByteString(org.hyperledger.fabric.sdk.transaction.ProtoUtils.getSignatureHeaderAsByteString) ByteString(com.google.protobuf.ByteString) ProtoUtils.getSignatureHeaderAsByteString(org.hyperledger.fabric.sdk.transaction.ProtoUtils.getSignatureHeaderAsByteString) ByteString(com.google.protobuf.ByteString) ConfigEnvelope(org.hyperledger.fabric.protos.common.Configtx.ConfigEnvelope) ConfigUpdateEnvelope(org.hyperledger.fabric.protos.common.Configtx.ConfigUpdateEnvelope) Envelope(org.hyperledger.fabric.protos.common.Common.Envelope) ProtoUtils.createSeekInfoEnvelope(org.hyperledger.fabric.sdk.transaction.ProtoUtils.createSeekInfoEnvelope) EventHubException(org.hyperledger.fabric.sdk.exception.EventHubException) InvalidProtocolBufferException(com.google.protobuf.InvalidProtocolBufferException) InvalidArgumentException(org.hyperledger.fabric.sdk.exception.InvalidArgumentException) TransactionException(org.hyperledger.fabric.sdk.exception.TransactionException) TransactionEventException(org.hyperledger.fabric.sdk.exception.TransactionEventException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) StatusRuntimeException(io.grpc.StatusRuntimeException) CryptoException(org.hyperledger.fabric.sdk.exception.CryptoException) TimeoutException(java.util.concurrent.TimeoutException) ProposalException(org.hyperledger.fabric.sdk.exception.ProposalException) TransactionException(org.hyperledger.fabric.sdk.exception.TransactionException) Header(org.hyperledger.fabric.protos.common.Common.Header) ChannelHeader(org.hyperledger.fabric.protos.common.Common.ChannelHeader) ChannelHeader(org.hyperledger.fabric.protos.common.Common.ChannelHeader) TransactionContext(org.hyperledger.fabric.sdk.transaction.TransactionContext)

Example 2 with BroadcastResponse

use of org.hyperledger.fabric.protos.orderer.Ab.BroadcastResponse in project fabric-sdk-java by hyperledger.

the class Channel method sendTransaction.

/**
 * Send transaction to one of a specified set of orderers with the specified user context.
 * IF there are no event hubs or eventing peers this future returns immediately completed
 * indicating that orderer has accepted the transaction only.
 *
 * @param proposalResponses
 * @param transactionOptions
 * @return Future allowing access to the result of the transaction invocation.
 */
public CompletableFuture<TransactionEvent> sendTransaction(Collection<ProposalResponse> proposalResponses, TransactionOptions transactionOptions) {
    try {
        if (null == transactionOptions) {
            throw new InvalidArgumentException("Parameter transactionOptions can't be null");
        }
        checkChannelState();
        User userContext = transactionOptions.userContext != null ? transactionOptions.userContext : client.getUserContext();
        userContextCheck(userContext);
        if (null == proposalResponses) {
            throw new InvalidArgumentException("sendTransaction proposalResponses was null");
        }
        List<Orderer> orderers = transactionOptions.orderers != null ? transactionOptions.orderers : new ArrayList<>(getOrderers());
        // make certain we have our own copy
        final List<Orderer> shuffeledOrderers = new ArrayList<>(orderers);
        if (transactionOptions.shuffleOrders) {
            Collections.shuffle(shuffeledOrderers);
        }
        if (config.getProposalConsistencyValidation()) {
            HashSet<ProposalResponse> invalid = new HashSet<>();
            int consistencyGroups = SDKUtils.getProposalConsistencySets(proposalResponses, invalid).size();
            if (consistencyGroups != 1 || !invalid.isEmpty()) {
                throw new IllegalArgumentException(format("The proposal responses have %d inconsistent groups with %d that are invalid." + " Expected all to be consistent and none to be invalid.", consistencyGroups, invalid.size()));
            }
        }
        List<FabricProposalResponse.Endorsement> ed = new LinkedList<>();
        FabricProposal.Proposal proposal = null;
        ByteString proposalResponsePayload = null;
        String proposalTransactionID = null;
        for (ProposalResponse sdkProposalResponse : proposalResponses) {
            ed.add(sdkProposalResponse.getProposalResponse().getEndorsement());
            if (proposal == null) {
                proposal = sdkProposalResponse.getProposal();
                proposalTransactionID = sdkProposalResponse.getTransactionID();
                proposalResponsePayload = sdkProposalResponse.getProposalResponse().getPayload();
            }
        }
        TransactionBuilder transactionBuilder = TransactionBuilder.newBuilder();
        Payload transactionPayload = transactionBuilder.chaincodeProposal(proposal).endorsements(ed).proposalResponsePayload(proposalResponsePayload).build();
        Envelope transactionEnvelope = createTransactionEnvelope(transactionPayload, userContext);
        NOfEvents nOfEvents = transactionOptions.nOfEvents;
        if (nOfEvents == null) {
            nOfEvents = NOfEvents.createNofEvents();
            Collection<Peer> eventingPeers = getEventingPeers();
            boolean anyAdded = false;
            if (!eventingPeers.isEmpty()) {
                anyAdded = true;
                nOfEvents.addPeers(eventingPeers);
            }
            Collection<EventHub> eventHubs = getEventHubs();
            if (!eventHubs.isEmpty()) {
                anyAdded = true;
                nOfEvents.addEventHubs(getEventHubs());
            }
            if (!anyAdded) {
                nOfEvents = NOfEvents.createNoEvents();
            }
        } else if (nOfEvents != NOfEvents.nofNoEvents) {
            StringBuilder issues = new StringBuilder(100);
            Collection<Peer> eventingPeers = getEventingPeers();
            nOfEvents.unSeenPeers().forEach(peer -> {
                if (peer.getChannel() != this) {
                    issues.append(format("Peer %s added to NOFEvents does not belong this channel. ", peer.getName()));
                } else if (!eventingPeers.contains(peer)) {
                    issues.append(format("Peer %s added to NOFEvents is not a eventing Peer in this channel. ", peer.getName()));
                }
            });
            nOfEvents.unSeenEventHubs().forEach(eventHub -> {
                if (!eventHubs.contains(eventHub)) {
                    issues.append(format("Eventhub %s added to NOFEvents does not belong this channel. ", eventHub.getName()));
                }
            });
            if (nOfEvents.unSeenEventHubs().isEmpty() && nOfEvents.unSeenPeers().isEmpty()) {
                issues.append("NofEvents had no Eventhubs added or Peer eventing services.");
            }
            String foundIssues = issues.toString();
            if (!foundIssues.isEmpty()) {
                throw new InvalidArgumentException(foundIssues);
            }
        }
        final boolean replyonly = nOfEvents == NOfEvents.nofNoEvents || (getEventHubs().isEmpty() && getEventingPeers().isEmpty());
        CompletableFuture<TransactionEvent> sret;
        if (replyonly) {
            // If there are no eventhubs to complete the future, complete it
            // immediately but give no transaction event
            logger.debug(format("Completing transaction id %s immediately no event hubs or peer eventing services found in channel %s.", proposalTransactionID, name));
            sret = new CompletableFuture<>();
        } else {
            sret = registerTxListener(proposalTransactionID, nOfEvents, transactionOptions.failFast);
        }
        logger.debug(format("Channel %s sending transaction to orderer(s) with TxID %s ", name, proposalTransactionID));
        boolean success = false;
        // Save last exception to report to user .. others are just logged.
        Exception lException = null;
        BroadcastResponse resp = null;
        Orderer failed = null;
        for (Orderer orderer : shuffeledOrderers) {
            if (failed != null) {
                logger.warn(format("Channel %s  %s failed. Now trying %s.", name, failed, orderer));
            }
            failed = orderer;
            try {
                if (null != diagnosticFileDumper) {
                    logger.trace(format("Sending to channel %s, orderer: %s, transaction: %s", name, orderer.getName(), diagnosticFileDumper.createDiagnosticProtobufFile(transactionEnvelope.toByteArray())));
                }
                resp = orderer.sendTransaction(transactionEnvelope);
                // no longer last exception .. maybe just failed.
                lException = null;
                if (resp.getStatus() == Status.SUCCESS) {
                    success = true;
                    break;
                } else {
                    logger.warn(format("Channel %s %s failed. Status returned %s", name, orderer, getRespData(resp)));
                }
            } catch (Exception e) {
                String emsg = format("Channel %s unsuccessful sendTransaction to orderer %s (%s)", name, orderer.getName(), orderer.getUrl());
                if (resp != null) {
                    emsg = format("Channel %s unsuccessful sendTransaction to orderer %s (%s).  %s", name, orderer.getName(), orderer.getUrl(), getRespData(resp));
                }
                logger.error(emsg);
                lException = new Exception(emsg, e);
            }
        }
        if (success) {
            logger.debug(format("Channel %s successful sent to Orderer transaction id: %s", name, proposalTransactionID));
            if (replyonly) {
                // just say we're done.
                sret.complete(null);
            }
            return sret;
        } else {
            String emsg = format("Channel %s failed to place transaction %s on Orderer. Cause: UNSUCCESSFUL. %s", name, proposalTransactionID, getRespData(resp));
            unregisterTxListener(proposalTransactionID);
            CompletableFuture<TransactionEvent> ret = new CompletableFuture<>();
            ret.completeExceptionally(lException != null ? new Exception(emsg, lException) : new Exception(emsg));
            return ret;
        }
    } catch (Exception e) {
        CompletableFuture<TransactionEvent> future = new CompletableFuture<>();
        future.completeExceptionally(e);
        return future;
    }
}
Also used : InstallProposalBuilder(org.hyperledger.fabric.sdk.transaction.InstallProposalBuilder) Arrays(java.util.Arrays) GetConfigBlockBuilder(org.hyperledger.fabric.sdk.transaction.GetConfigBlockBuilder) MspConfig(org.hyperledger.fabric.protos.msp.MspConfig) BroadcastResponse(org.hyperledger.fabric.protos.orderer.Ab.BroadcastResponse) Header(org.hyperledger.fabric.protos.common.Common.Header) ConfigEnvelope(org.hyperledger.fabric.protos.common.Configtx.ConfigEnvelope) Future(java.util.concurrent.Future) EventHubException(org.hyperledger.fabric.sdk.exception.EventHubException) Map(java.util.Map) ChannelHeader(org.hyperledger.fabric.protos.common.Common.ChannelHeader) QueryPeerChannelsBuilder(org.hyperledger.fabric.sdk.transaction.QueryPeerChannelsBuilder) ConfigSignature(org.hyperledger.fabric.protos.common.Configtx.ConfigSignature) FabricProposalResponse(org.hyperledger.fabric.protos.peer.FabricProposalResponse) Response(org.hyperledger.fabric.protos.peer.FabricProposalResponse.Response) EnumSet(java.util.EnumSet) InvalidProtocolBufferException(com.google.protobuf.InvalidProtocolBufferException) SignedProposal(org.hyperledger.fabric.protos.peer.FabricProposal.SignedProposal) InvalidArgumentException(org.hyperledger.fabric.sdk.exception.InvalidArgumentException) ConfigGroup(org.hyperledger.fabric.protos.common.Configtx.ConfigGroup) Set(java.util.Set) QueryInstalledChaincodesBuilder(org.hyperledger.fabric.sdk.transaction.QueryInstalledChaincodesBuilder) BlockingQueue(java.util.concurrent.BlockingQueue) ProcessedTransaction(org.hyperledger.fabric.protos.peer.FabricTransaction.ProcessedTransaction) Ab(org.hyperledger.fabric.protos.orderer.Ab) Executors(java.util.concurrent.Executors) Serializable(java.io.Serializable) UpgradeProposalBuilder(org.hyperledger.fabric.sdk.transaction.UpgradeProposalBuilder) Status(org.hyperledger.fabric.protos.common.Common.Status) TransactionException(org.hyperledger.fabric.sdk.exception.TransactionException) LogFactory(org.apache.commons.logging.LogFactory) HeaderType(org.hyperledger.fabric.protos.common.Common.HeaderType) ByteArrayOutputStream(java.io.ByteArrayOutputStream) ConfigValue(org.hyperledger.fabric.protos.common.Configtx.ConfigValue) TransactionContext(org.hyperledger.fabric.sdk.transaction.TransactionContext) ConfigUpdateEnvelope(org.hyperledger.fabric.protos.common.Configtx.ConfigUpdateEnvelope) ProposalBuilder(org.hyperledger.fabric.sdk.transaction.ProposalBuilder) TransactionOptions.createTransactionOptions(org.hyperledger.fabric.sdk.Channel.TransactionOptions.createTransactionOptions) ArrayList(java.util.ArrayList) Block(org.hyperledger.fabric.protos.common.Common.Block) LinkedHashMap(java.util.LinkedHashMap) TransactionEventException(org.hyperledger.fabric.sdk.exception.TransactionEventException) ProtoUtils(org.hyperledger.fabric.sdk.transaction.ProtoUtils) QueryInstantiatedChaincodesBuilder(org.hyperledger.fabric.sdk.transaction.QueryInstantiatedChaincodesBuilder) ObjectOutputStream(java.io.ObjectOutputStream) Payload(org.hyperledger.fabric.protos.common.Common.Payload) Utils.isNullOrEmpty(org.hyperledger.fabric.sdk.helper.Utils.isNullOrEmpty) Envelope(org.hyperledger.fabric.protos.common.Common.Envelope) Utils(org.hyperledger.fabric.sdk.helper.Utils) SeekInfo(org.hyperledger.fabric.protos.orderer.Ab.SeekInfo) Files(java.nio.file.Files) IOException(java.io.IOException) DiagnosticFileDumper(org.hyperledger.fabric.sdk.helper.DiagnosticFileDumper) ChaincodeQueryResponse(org.hyperledger.fabric.protos.peer.Query.ChaincodeQueryResponse) TransactionBuilder(org.hyperledger.fabric.sdk.transaction.TransactionBuilder) File(java.io.File) Config(org.hyperledger.fabric.sdk.helper.Config) ExecutionException(java.util.concurrent.ExecutionException) StatusRuntimeException(io.grpc.StatusRuntimeException) Paths(java.nio.file.Paths) BlockMetadata(org.hyperledger.fabric.protos.common.Common.BlockMetadata) CryptoException(org.hyperledger.fabric.sdk.exception.CryptoException) SeekPosition(org.hyperledger.fabric.protos.orderer.Ab.SeekPosition) SeekSpecified(org.hyperledger.fabric.protos.orderer.Ab.SeekSpecified) User.userContextCheck(org.hyperledger.fabric.sdk.User.userContextCheck) ScheduledFuture(java.util.concurrent.ScheduledFuture) ProtoUtils.createSeekInfoEnvelope(org.hyperledger.fabric.sdk.transaction.ProtoUtils.createSeekInfoEnvelope) ObjectInputStream(java.io.ObjectInputStream) TimeoutException(java.util.concurrent.TimeoutException) Random(java.util.Random) Collection(java.util.Collection) ProposalException(org.hyperledger.fabric.sdk.exception.ProposalException) StandardOpenOption(java.nio.file.StandardOpenOption) ProtoUtils.getSignatureHeaderAsByteString(org.hyperledger.fabric.sdk.transaction.ProtoUtils.getSignatureHeaderAsByteString) ChaincodeInfo(org.hyperledger.fabric.protos.peer.Query.ChaincodeInfo) LinkedBlockingQueue(java.util.concurrent.LinkedBlockingQueue) JoinPeerProposalBuilder(org.hyperledger.fabric.sdk.transaction.JoinPeerProposalBuilder) Ledger(org.hyperledger.fabric.protos.common.Ledger) String.format(java.lang.String.format) Objects(java.util.Objects) ByteString(com.google.protobuf.ByteString) Metadata(org.hyperledger.fabric.protos.common.Common.Metadata) List(java.util.List) Pattern(java.util.regex.Pattern) FabricProposal(org.hyperledger.fabric.protos.peer.FabricProposal) PeerRole(org.hyperledger.fabric.sdk.Peer.PeerRole) TransactionEvent(org.hyperledger.fabric.sdk.BlockEvent.TransactionEvent) InstantiateProposalBuilder(org.hyperledger.fabric.sdk.transaction.InstantiateProposalBuilder) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) Hex(org.apache.commons.codec.binary.Hex) HashSet(java.util.HashSet) ChannelQueryResponse(org.hyperledger.fabric.protos.peer.Query.ChannelQueryResponse) LinkedList(java.util.LinkedList) ExecutorService(java.util.concurrent.ExecutorService) Iterator(java.util.Iterator) Query(org.hyperledger.fabric.protos.peer.Query) DeliverResponse(org.hyperledger.fabric.protos.orderer.Ab.DeliverResponse) TimeUnit(java.util.concurrent.TimeUnit) LastConfig(org.hyperledger.fabric.protos.common.Common.LastConfig) Log(org.apache.commons.logging.Log) Collections(java.util.Collections) BroadcastResponse(org.hyperledger.fabric.protos.orderer.Ab.BroadcastResponse) ProtoUtils.getSignatureHeaderAsByteString(org.hyperledger.fabric.sdk.transaction.ProtoUtils.getSignatureHeaderAsByteString) ByteString(com.google.protobuf.ByteString) ArrayList(java.util.ArrayList) TransactionBuilder(org.hyperledger.fabric.sdk.transaction.TransactionBuilder) ProtoUtils.getSignatureHeaderAsByteString(org.hyperledger.fabric.sdk.transaction.ProtoUtils.getSignatureHeaderAsByteString) ByteString(com.google.protobuf.ByteString) ConfigEnvelope(org.hyperledger.fabric.protos.common.Configtx.ConfigEnvelope) ConfigUpdateEnvelope(org.hyperledger.fabric.protos.common.Configtx.ConfigUpdateEnvelope) Envelope(org.hyperledger.fabric.protos.common.Common.Envelope) ProtoUtils.createSeekInfoEnvelope(org.hyperledger.fabric.sdk.transaction.ProtoUtils.createSeekInfoEnvelope) TransactionEvent(org.hyperledger.fabric.sdk.BlockEvent.TransactionEvent) CompletableFuture(java.util.concurrent.CompletableFuture) InvalidArgumentException(org.hyperledger.fabric.sdk.exception.InvalidArgumentException) HashSet(java.util.HashSet) LinkedList(java.util.LinkedList) EventHubException(org.hyperledger.fabric.sdk.exception.EventHubException) InvalidProtocolBufferException(com.google.protobuf.InvalidProtocolBufferException) InvalidArgumentException(org.hyperledger.fabric.sdk.exception.InvalidArgumentException) TransactionException(org.hyperledger.fabric.sdk.exception.TransactionException) TransactionEventException(org.hyperledger.fabric.sdk.exception.TransactionEventException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) StatusRuntimeException(io.grpc.StatusRuntimeException) CryptoException(org.hyperledger.fabric.sdk.exception.CryptoException) TimeoutException(java.util.concurrent.TimeoutException) ProposalException(org.hyperledger.fabric.sdk.exception.ProposalException) FabricProposal(org.hyperledger.fabric.protos.peer.FabricProposal) Collection(java.util.Collection) Payload(org.hyperledger.fabric.protos.common.Common.Payload) FabricProposalResponse(org.hyperledger.fabric.protos.peer.FabricProposalResponse)

Aggregations

ByteString (com.google.protobuf.ByteString)2 InvalidProtocolBufferException (com.google.protobuf.InvalidProtocolBufferException)2 StatusRuntimeException (io.grpc.StatusRuntimeException)2 IOException (java.io.IOException)2 ExecutionException (java.util.concurrent.ExecutionException)2 TimeoutException (java.util.concurrent.TimeoutException)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 File (java.io.File)1 ObjectInputStream (java.io.ObjectInputStream)1 ObjectOutputStream (java.io.ObjectOutputStream)1 Serializable (java.io.Serializable)1 String.format (java.lang.String.format)1 Files (java.nio.file.Files)1 Paths (java.nio.file.Paths)1 StandardOpenOption (java.nio.file.StandardOpenOption)1 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 Collection (java.util.Collection)1 Collections (java.util.Collections)1 EnumSet (java.util.EnumSet)1