Skip to content

Commit

Permalink
Merge pull request #67 from SolaceDev/SOL-98116
Browse files Browse the repository at this point in the history
SOL-98116/EBP-43: Memory Allocation Of Error Structs
  • Loading branch information
cjwmorgan-sol authored Oct 21, 2024
2 parents f35a991 + 02d2ff2 commit ea18817
Show file tree
Hide file tree
Showing 20 changed files with 171 additions and 98 deletions.
4 changes: 2 additions & 2 deletions internal/ccsmp/ccsmp_container.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ func (opaqueContainer *SolClientOpaqueContainer) SolClientContainerGetNextField(
if errorInfo != nil {
// we expect and end of stream, but an error is logged if we fail
if errorInfo.ReturnCode == SolClientReturnCodeFail {
logging.Default.Debug(fmt.Sprintf("ccsmp.SolClientContainerGetNextField: Unable to retrieve next field: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode))
logging.Default.Debug(fmt.Sprintf("ccsmp.SolClientContainerGetNextField: Unable to retrieve next field: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
}
return "", fieldT, false
}
Expand All @@ -172,7 +172,7 @@ func (opaqueContainer *SolClientOpaqueContainer) SolClientContainerGetField(key
if errorInfo != nil {
// we expect and end of stream, but an error is logged if we fail
if errorInfo.ReturnCode == SolClientReturnCodeFail {
logging.Default.Debug(fmt.Sprintf("ccsmp.SolClientContainerGetField: unable to retrieve next field: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode))
logging.Default.Debug(fmt.Sprintf("ccsmp.SolClientContainerGetField: unable to retrieve next field: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
}
return fieldT, false
}
Expand Down
64 changes: 53 additions & 11 deletions internal/ccsmp/ccsmp_core.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,19 +193,46 @@ type SolClientResponseCode = C.solClient_session_responseCode_t
// SolClientErrorInfoWrapper is assigned a value
type SolClientErrorInfoWrapper C.solClient_errorInfo_wrapper_t

// SolClientErrorInfoWrapperDetailed is assigned a value
type SolClientErrorInfoWrapperDetailed C.solClient_errorInfo_t

func (info *SolClientErrorInfoWrapper) String() string {
if info == nil {
return ""
}
return fmt.Sprintf("{ReturnCode: %d, SubCode: %d, ResponseCode: %d, ErrorStr: %s}", info.ReturnCode, info.SubCode, info.ResponseCode, info.GetMessageAsString())
if info.DetailedErrorInfo == nil {
return fmt.Sprintf("{ReturnCode: %d, SubCode: nil, ResponseCode: nil, ErrorStr: nil}", info.ReturnCode)
}
detailedErrorInfo := *(info.DetailedErrorInfo)
return fmt.Sprintf("{ReturnCode: %d, SubCode: %d, ResponseCode: %d, ErrorStr: %s}",
info.ReturnCode,
detailedErrorInfo.subCode,
detailedErrorInfo.responseCode,
info.GetMessageAsString())
}

// GetMessageAsString function outputs a string
func (info *SolClientErrorInfoWrapper) GetMessageAsString() string {
if len(info.ErrorStr) == 0 {
if info.DetailedErrorInfo == nil || len(info.DetailedErrorInfo.errorStr) == 0 {
return ""
}
return C.GoString((*C.char)(&info.ErrorStr[0]))
return C.GoString((*C.char)(&info.DetailedErrorInfo.errorStr[0]))
}

// SubCode function returns subcode if available
func (info *SolClientErrorInfoWrapper) SubCode() SolClientSubCode {
if info.DetailedErrorInfo != nil {
return (*(info.DetailedErrorInfo)).subCode
}
return SolClientSubCode(0)
}

// ResponseCode function returns response code if available
func (info *SolClientErrorInfoWrapper) ResponseCode() SolClientResponseCode {
if info.DetailedErrorInfo != nil {
return (*(info.DetailedErrorInfo)).responseCode
}
return SolClientResponseCode(0)
}

// Definition of structs returned from this package to be used externally
Expand Down Expand Up @@ -486,7 +513,7 @@ func (session *SolClientSession) SolClientSessionGetRXStat(stat SolClientStatsRX
})
// we should not in normal operation encounter an error fetching stats, but just in case...
if err != nil {
logging.Default.Warning("Encountered error loading core rx stat: " + err.GetMessageAsString() + ", subcode " + fmt.Sprint(err.SubCode))
logging.Default.Warning("Encountered error loading core rx stat: " + err.GetMessageAsString() + ", subcode " + fmt.Sprint(err.SubCode()))
}
return value
}
Expand All @@ -497,7 +524,7 @@ func (session *SolClientSession) SolClientSessionGetTXStat(stat SolClientStatsTX
return C.solClient_session_getTxStat(session.pointer, C.solClient_stats_tx_t(stat), (C.solClient_stats_pt)(unsafe.Pointer(&value)))
})
if err != nil {
logging.Default.Warning("Encountered error loading core stat: " + err.GetMessageAsString() + ", subcode " + fmt.Sprint(err.SubCode))
logging.Default.Warning("Encountered error loading core stat: " + err.GetMessageAsString() + ", subcode " + fmt.Sprint(err.SubCode()))
}
return value
}
Expand Down Expand Up @@ -621,17 +648,28 @@ func NewSessionReplyDispatch(id uint64) uintptr {
return uintptr(id)
}

// GetLastErrorInfoReturnCodeOnly returns a SolClientErrorInfoWrapper with only the ReturnCode field set.
// This adds a function call on failure paths, but we'd be passing strings around in that case anyways and it should
// happen rarely, so it's fine to slow it down a bit more if it means avoiding code duplication. See this function's
// usage in GetLastErrorInfo() and handleCcsmpError to see where the duplicated code would otherwise have been.
func GetLastErrorInfoReturnCodeOnly(returnCode SolClientReturnCode) *SolClientErrorInfoWrapper {
errorInfo := &SolClientErrorInfoWrapper{}
errorInfo.ReturnCode = returnCode
return errorInfo
}

// GetLastErrorInfo should NOT be called in most cases as it is dependent on the thread.
// Unless you know that the goroutine running the code will not be interrupted, do NOT
// call this function!
func GetLastErrorInfo(returnCode SolClientReturnCode) *SolClientErrorInfoWrapper {
errorInfo := &SolClientErrorInfoWrapper{}
errorInfo.ReturnCode = returnCode
errorInfo := GetLastErrorInfoReturnCodeOnly(returnCode)
if returnCode != SolClientReturnCodeNotFound {
detailedErrorInfo := C.solClient_errorInfo_t{}
solClientErrorInfoPt := C.solClient_getLastErrorInfo()
errorInfo.SubCode = solClientErrorInfoPt.subCode
errorInfo.ResponseCode = solClientErrorInfoPt.responseCode
C.strcpy((*C.char)(&errorInfo.ErrorStr[0]), (*C.char)(&solClientErrorInfoPt.errorStr[0]))
detailedErrorInfo.subCode = solClientErrorInfoPt.subCode
detailedErrorInfo.responseCode = solClientErrorInfoPt.responseCode
C.strcpy((*C.char)(&detailedErrorInfo.errorStr[0]), (*C.char)(&solClientErrorInfoPt.errorStr[0]))
errorInfo.DetailedErrorInfo = &detailedErrorInfo
}
return errorInfo
}
Expand All @@ -649,8 +687,12 @@ func handleCcsmpError(f func() SolClientReturnCode) *SolClientErrorInfoWrapper {
defer runtime.UnlockOSThread()

returnCode := f()
if returnCode != SolClientReturnCodeOk && returnCode != SolClientReturnCodeInProgress {
if returnCode == SolClientReturnCodeFail || returnCode == SolClientReturnCodeNotReady {
// Return full error struct if rc requires additional error info.
return GetLastErrorInfo(returnCode)
} else if returnCode != SolClientReturnCodeOk && returnCode != SolClientReturnCodeInProgress {
// Return partial error if not ok but not failure so that caller can parse on rc
return GetLastErrorInfoReturnCodeOnly(returnCode)
}
return nil
}
Expand Down
4 changes: 1 addition & 3 deletions internal/ccsmp/ccsmp_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@
typedef struct solClient_errorInfo_wrapper
{
solClient_returnCode_t ReturnCode;
solClient_subCode_t SubCode;
solClient_session_responseCode_t ResponseCode;
char ErrorStr[SOLCLIENT_ERRORINFO_STR_SIZE];
solClient_errorInfo_t * DetailedErrorInfo;
} solClient_errorInfo_wrapper_t;

/**
Expand Down
20 changes: 13 additions & 7 deletions internal/ccsmp/ccsmp_message.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,12 @@ func SolClientMessageGetBinaryAttachmentAsBytes(messageP SolClientMessagePt) ([]
})
if errorInfo != nil {
if errorInfo.ReturnCode == SolClientReturnCodeFail {
logging.Default.Warning(fmt.Sprintf("Encountered error fetching payload as bytes: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode))
logging.Default.Warning(fmt.Sprintf("Encountered error fetching payload as bytes: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
return nil, false
} else if errorInfo.ReturnCode != SolClientReturnCodeOk {
logging.Default.Debug(fmt.Sprintf("Did not find payload as bytes: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
return nil, false
}
return nil, false
}
return C.GoBytes(dataPtr, C.int(size)), true
}
Expand All @@ -105,9 +108,12 @@ func SolClientMessageGetXMLAttachmentAsBytes(messageP SolClientMessagePt) ([]byt
})
if errorInfo != nil {
if errorInfo.ReturnCode == SolClientReturnCodeFail {
logging.Default.Warning(fmt.Sprintf("Encountered error fetching XML payload as bytes: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode))
logging.Default.Warning(fmt.Sprintf("Encountered error fetching XML payload as bytes: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
return nil, false
} else if errorInfo.ReturnCode != SolClientReturnCodeOk {
logging.Default.Debug(fmt.Sprintf("Did not find XML payload as bytes: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
return nil, false
}
return nil, false
}
return C.GoBytes(dataPtr, C.int(size)), true
}
Expand All @@ -132,7 +138,7 @@ func SolClientMessageGetBinaryAttachmentAsString(messageP SolClientMessagePt) (s
})
if errorInfo != nil {
if errorInfo.ReturnCode == SolClientReturnCodeFail {
logging.Default.Warning(fmt.Sprintf("Encountered error fetching payload as string: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode))
logging.Default.Warning(fmt.Sprintf("Encountered error fetching payload as string: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
}
return "", false
}
Expand All @@ -156,7 +162,7 @@ func SolClientMessageGetBinaryAttachmentAsStream(messageP SolClientMessagePt) (*
})
if errorInfo != nil {
if errorInfo.ReturnCode == SolClientReturnCodeFail {
logging.Default.Warning(fmt.Sprintf("Encountered error fetching payload as stream: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode))
logging.Default.Warning(fmt.Sprintf("Encountered error fetching payload as stream: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
}
return nil, false
}
Expand All @@ -174,7 +180,7 @@ func SolClientMessageGetBinaryAttachmentAsMap(messageP SolClientMessagePt) (*Sol
})
if errorInfo != nil {
if errorInfo.ReturnCode == SolClientReturnCodeFail {
logging.Default.Warning(fmt.Sprintf("Encountered error fetching payload as stream: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode))
logging.Default.Warning(fmt.Sprintf("Encountered error fetching payload as stream: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
}
return nil, false
}
Expand Down
10 changes: 5 additions & 5 deletions internal/ccsmp/ccsmp_message_tracing.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func SolClientMessageGetTraceContextTraceID(messageP SolClientMessagePt, context
fmt.Sprintf(
"Encountered error fetching Creation context traceID prop: %s, subcode: %d",
errorInfo.GetMessageAsString(),
errorInfo.SubCode))
errorInfo.SubCode()))
}
return [TraceIDSize]byte{}, errorInfo
}
Expand Down Expand Up @@ -122,7 +122,7 @@ func SolClientMessageGetTraceContextSpanID(messageP SolClientMessagePt, contextT
fmt.Sprintf(
"Encountered error fetching Creation context spanID prop: %s, subcode: %d",
errorInfo.GetMessageAsString(),
errorInfo.SubCode))
errorInfo.SubCode()))
}
return [SpanIDSize]byte{}, errorInfo
}
Expand Down Expand Up @@ -161,7 +161,7 @@ func SolClientMessageGetTraceContextSampled(messageP SolClientMessagePt, context
fmt.Sprintf(
"Encountered error fetching Creation context sampled prop: %s, subcode: %d",
errorInfo.GetMessageAsString(),
errorInfo.SubCode))
errorInfo.SubCode()))
}
return false, errorInfo
}
Expand Down Expand Up @@ -198,7 +198,7 @@ func SolClientMessageGetTraceContextTraceState(messageP SolClientMessagePt, cont
fmt.Sprintf(
"Encountered error fetching Creation contex traceState prop: %s, subcode: %d",
errorInfo.GetMessageAsString(),
errorInfo.SubCode))
errorInfo.SubCode()))
}
return "", errorInfo
}
Expand Down Expand Up @@ -336,7 +336,7 @@ func SolClientMessageGetBaggage(messageP SolClientMessagePt) (string, *SolClient
fmt.Sprintf(
"Encountered error fetching baggage: %s, subcode: %d",
errorInfo.GetMessageAsString(),
errorInfo.SubCode))
errorInfo.SubCode()))
}
return "", errorInfo
}
Expand Down
19 changes: 19 additions & 0 deletions internal/ccsmp/cgo_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ package ccsmp
/*
#include <stdio.h>
#include <stdlib.h>
#include "./ccsmp_helper.h"
*/
import "C"
import "unsafe"
Expand Down Expand Up @@ -53,3 +55,20 @@ func ToCArray(arr []string, nullTerminated bool) (cArray **C.char, freeArray fun
}
return (**C.char)(unsafe.Pointer(&cArr[0])), freeFunction
}

// NewInternalSolClientErrorInfoWrapper manually creates a Go representation of the error struct usually passed to the
// Go API by CCSMP. This function is intended to be used only when such an error struct is required but cannot be
// provided by CCSMP.
func NewInternalSolClientErrorInfoWrapper(returnCode SolClientReturnCode, subCode SolClientSubCode, responseCode SolClientResponseCode, errorInfo string) *SolClientErrorInfoWrapper {
errorInfoWrapper := SolClientErrorInfoWrapper{}
errorInfoWrapper.ReturnCode = returnCode
detailedErrorInfo := C.solClient_errorInfo_t{}
detailedErrorInfo.subCode = subCode
detailedErrorInfo.responseCode = responseCode
for i := 0; i < len(errorInfo) && i < len(detailedErrorInfo.errorStr)-1; i++ {
detailedErrorInfo.errorStr[i] = (C.char)(errorInfo[i])
}
detailedErrorInfo.errorStr[len(detailedErrorInfo.errorStr)-1] = '\x00'
errorInfoWrapper.DetailedErrorInfo = &detailedErrorInfo
return &errorInfoWrapper
}
2 changes: 1 addition & 1 deletion internal/impl/core/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func ToNativeError(err ErrorInfo, args ...string) error {
if len(args) > 0 {
prefix = args[0]
}
nativeError := solace.NewNativeError(prefix+err.GetMessageAsString(), subcode.Code(err.SubCode))
nativeError := solace.NewNativeError(prefix+err.GetMessageAsString(), subcode.Code(err.SubCode()))
switch nativeError.SubCode() {
case subcode.LoginFailure:
return solace.NewError(&solace.AuthenticationError{}, constants.LoginFailure+nativeError.Error(), nativeError)
Expand Down
2 changes: 1 addition & 1 deletion internal/impl/core/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ func (events *ccsmpBackedEvents) eventCallback(sessionEvent ccsmp.SolClientSessi
logging.Default.Debug(fmt.Sprintf("Retrieved Last Error Info: %s", lastErrorInfo))
}
var err error
if lastErrorInfo.SubCode != ccsmp.SolClientSubCodeOK {
if lastErrorInfo.SubCode() != ccsmp.SolClientSubCodeOK {
err = ToNativeError(lastErrorInfo)
}
for _, eventHandler := range eventHandlers {
Expand Down
2 changes: 1 addition & 1 deletion internal/impl/core/receiver.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ func (receiver *ccsmpBackedReceiver) NewPersistentReceiver(properties []string,
flowEventCallback := func(flowEvent ccsmp.SolClientFlowEvent, responseCode ccsmp.SolClientResponseCode, info string) {
lastErrorInfo := ccsmp.GetLastErrorInfo(0)
var err error
if lastErrorInfo.SubCode != ccsmp.SolClientSubCodeOK {
if lastErrorInfo.SubCode() != ccsmp.SolClientSubCodeOK {
err = ToNativeError(lastErrorInfo)
}
eventCallback(flowEvent, &flowEventInfo{err: err, infoString: info})
Expand Down
4 changes: 2 additions & 2 deletions internal/impl/core/transport.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,14 +157,14 @@ func (transport *ccsmpTransport) Close() error {
func destroySession(session *ccsmp.SolClientSession) {
err := session.SolClientSessionDestroy()
if err != nil {
logging.Default.Error(fmt.Sprintf("an error occurred while cleaning up session: %s (subcode %d)", err.GetMessageAsString(), err.SubCode))
logging.Default.Error(fmt.Sprintf("an error occurred while cleaning up session: %s (subcode %d)", err.GetMessageAsString(), err.SubCode()))
}
}

func destroyContext(context *ccsmp.SolClientContext) {
err := context.SolClientContextDestroy()
if err != nil {
logging.Default.Error(fmt.Sprintf("an error occurred while cleaning up context: %s (subcode %d)", err.GetMessageAsString(), err.SubCode))
logging.Default.Error(fmt.Sprintf("an error occurred while cleaning up context: %s (subcode %d)", err.GetMessageAsString(), err.SubCode()))
}
}

Expand Down
14 changes: 7 additions & 7 deletions internal/impl/message/inbound_message_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ func (message *InboundMessageImpl) Dispose() {
func freeInboundMessage(message *InboundMessageImpl) {
err := ccsmp.SolClientMessageFree(&message.messagePointer)
if err != nil && logging.Default.IsErrorEnabled() {
logging.Default.Error("encountered unexpected error while freeing message pointer: " + err.GetMessageAsString() + " [sub code = " + strconv.Itoa(int(err.SubCode)) + "]")
logging.Default.Error("encountered unexpected error while freeing message pointer: " + err.GetMessageAsString() + " [sub code = " + strconv.Itoa(int(err.SubCode())) + "]")
}
}

Expand All @@ -81,7 +81,7 @@ func (message *InboundMessageImpl) GetDestinationName() string {
destName, errorInfo := ccsmp.SolClientMessageGetDestinationName(message.messagePointer)
if errorInfo != nil {
if errorInfo.ReturnCode == ccsmp.SolClientReturnCodeFail {
logging.Default.Debug(fmt.Sprintf("Unable to retrieve the destination this message was published to: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode))
logging.Default.Debug(fmt.Sprintf("Unable to retrieve the destination this message was published to: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
}
}
return destName
Expand All @@ -94,7 +94,7 @@ func (message *InboundMessageImpl) GetTimeStamp() (time.Time, bool) {
t, errInfo := ccsmp.SolClientMessageGetTimestamp(message.messagePointer)
if errInfo != nil {
if errInfo.ReturnCode == ccsmp.SolClientReturnCodeFail {
logging.Default.Debug(fmt.Sprintf("Encountered error retrieving Sender Timestamp: %s, subcode: %d", errInfo.GetMessageAsString(), errInfo.SubCode))
logging.Default.Debug(fmt.Sprintf("Encountered error retrieving Sender Timestamp: %s, subcode: %d", errInfo.GetMessageAsString(), errInfo.SubCode()))
}
return t, false
}
Expand All @@ -107,7 +107,7 @@ func (message *InboundMessageImpl) GetSenderTimestamp() (time.Time, bool) {
t, errInfo := ccsmp.SolClientMessageGetSenderTimestamp(message.messagePointer)
if errInfo != nil {
if errInfo.ReturnCode == ccsmp.SolClientReturnCodeFail {
logging.Default.Debug(fmt.Sprintf("Encountered error retrieving Sender Timestamp: %s, subcode: %d", errInfo.GetMessageAsString(), errInfo.SubCode))
logging.Default.Debug(fmt.Sprintf("Encountered error retrieving Sender Timestamp: %s, subcode: %d", errInfo.GetMessageAsString(), errInfo.SubCode()))
}
return t, false
}
Expand All @@ -119,7 +119,7 @@ func (message *InboundMessageImpl) GetSenderID() (string, bool) {
id, errInfo := ccsmp.SolClientMessageGetSenderID(message.messagePointer)
if errInfo != nil {
if errInfo.ReturnCode == ccsmp.SolClientReturnCodeFail {
logging.Default.Debug(fmt.Sprintf("Encountered error retrieving Sender ID: %s, subcode: %d", errInfo.GetMessageAsString(), errInfo.SubCode))
logging.Default.Debug(fmt.Sprintf("Encountered error retrieving Sender ID: %s, subcode: %d", errInfo.GetMessageAsString(), errInfo.SubCode()))
}
return id, false
}
Expand All @@ -136,7 +136,7 @@ func (message *InboundMessageImpl) GetReplicationGroupMessageID() (rgmid.Replica
rmidPt, errInfo := ccsmp.SolClientMessageGetRGMID(message.messagePointer)
if errInfo != nil {
if errInfo.ReturnCode == ccsmp.SolClientReturnCodeFail {
logging.Default.Debug(fmt.Sprintf("Encountered error retrieving ReplicationGroupMessageID: %s, subcode: %d", errInfo.GetMessageAsString(), errInfo.SubCode))
logging.Default.Debug(fmt.Sprintf("Encountered error retrieving ReplicationGroupMessageID: %s, subcode: %d", errInfo.GetMessageAsString(), errInfo.SubCode()))
}
return nil, false
}
Expand Down Expand Up @@ -197,7 +197,7 @@ func GetReplyToDestinationName(message *InboundMessageImpl) (string, bool) {
destName, errorInfo := ccsmp.SolClientMessageGetReplyToDestinationName(message.messagePointer)
if errorInfo != nil {
if errorInfo.ReturnCode == ccsmp.SolClientReturnCodeFail {
logging.Default.Debug(fmt.Sprintf("Unable to retrieve the reply to destination this message was published to: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode))
logging.Default.Debug(fmt.Sprintf("Unable to retrieve the reply to destination this message was published to: %s, subcode: %d", errorInfo.GetMessageAsString(), errorInfo.SubCode()))
}
return destName, false
}
Expand Down
Loading

0 comments on commit ea18817

Please sign in to comment.