Skip to content

Commit 9c6391f

Browse files
Adding a new error code so users can handle the "entity not found" error (Azure#24501)
Adding a new error code so users can handle the "entity not found" error. Fixes Azure#24499
1 parent ab8bc51 commit 9c6391f

File tree

7 files changed

+34
-27
lines changed

7 files changed

+34
-27
lines changed

sdk/messaging/azservicebus/CHANGELOG.md

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
# Release History
22

3-
## 1.8.2-beta.1 (Unreleased)
3+
## 1.9.0 (2025-05-06)
44

55
### Features Added
66

7-
### Breaking Changes
8-
9-
### Bugs Fixed
10-
11-
### Other Changes
7+
- Added a new azservicebus.Code value, `CodeNotFound`, which indicates the queue, topic or subscription doesn't exist. (PR#24501)
128

139
## 1.8.1 (2025-04-08)
1410

sdk/messaging/azservicebus/client_test.go

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package azservicebus
66
import (
77
"context"
88
"io"
9+
910
"net"
1011
"net/http"
1112
"strings"
@@ -159,7 +160,9 @@ func TestNewClientNewSenderNotFound(t *testing.T) {
159160
defer cancel()
160161

161162
err = sender.SendMessage(ctx, &Message{Body: []byte("hello")}, nil)
162-
assertRPCNotFound(t, err)
163+
var sbErr *Error
164+
require.ErrorAs(t, err, &sbErr)
165+
require.Equal(t, CodeNotFound, sbErr.Code)
163166
}
164167

165168
func TestNewClientNewReceiverNotFound(t *testing.T) {
@@ -175,7 +178,9 @@ func TestNewClientNewReceiverNotFound(t *testing.T) {
175178

176179
messages, err := receiver.ReceiveMessages(ctx, 1, nil)
177180
require.Nil(t, messages)
178-
assertRPCNotFound(t, err)
181+
var sbErr *Error
182+
require.ErrorAs(t, err, &sbErr)
183+
require.Equal(t, CodeNotFound, sbErr.Code)
179184

180185
receiver, err = client.NewReceiverForSubscription("non-existent-topic", "non-existent-subscription", nil)
181186
require.NoError(t, err)
@@ -185,7 +190,9 @@ func TestNewClientNewReceiverNotFound(t *testing.T) {
185190

186191
messages, err = receiver.PeekMessages(ctx, 1, nil)
187192
require.Nil(t, messages)
188-
assertRPCNotFound(t, err)
193+
sbErr = nil
194+
require.ErrorAs(t, err, &sbErr)
195+
require.Equal(t, CodeNotFound, sbErr.Code)
189196
}
190197

191198
func TestClientNewSessionReceiverNotFound(t *testing.T) {
@@ -198,14 +205,18 @@ func TestClientNewSessionReceiverNotFound(t *testing.T) {
198205

199206
receiver, err := client.AcceptSessionForQueue(ctx, "non-existent-queue", "session-id", nil)
200207
require.Nil(t, receiver)
201-
assertRPCNotFound(t, err)
208+
var sbErr *Error
209+
require.ErrorAs(t, err, &sbErr)
210+
require.Equal(t, CodeNotFound, sbErr.Code)
202211

203212
ctx, cancel = context.WithTimeout(context.Background(), fastNotFoundDuration)
204213
defer cancel()
205214

206215
receiver, err = client.AcceptNextSessionForQueue(ctx, "non-existent-queue", nil)
207216
require.Nil(t, receiver)
208-
assertRPCNotFound(t, err)
217+
sbErr = nil
218+
require.ErrorAs(t, err, &sbErr)
219+
require.Equal(t, CodeNotFound, sbErr.Code)
209220
}
210221

211222
func TestClientCloseVsClosePermanently(t *testing.T) {
@@ -555,18 +566,6 @@ func TestNewClientUnitTests(t *testing.T) {
555566
})
556567
}
557568

558-
func assertRPCNotFound(t *testing.T, err error) {
559-
require.NotNil(t, err)
560-
561-
var rpcError interface {
562-
RPCCode() int
563-
error
564-
}
565-
566-
require.ErrorAs(t, err, &rpcError)
567-
require.Equal(t, http.StatusNotFound, rpcError.RPCCode())
568-
}
569-
570569
func forceManagementSettlement(messages []*ReceivedMessage) {
571570
for _, m := range messages {
572571
m.settleOnMgmtLink = true

sdk/messaging/azservicebus/error.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ const (
3131
// any available sessions it will eventually time out and return an *azservicebus.Error
3232
// with this code.
3333
CodeTimeout = exported.CodeTimeout
34+
35+
// CodeNotFound means the entity you're attempting to connect to doesn't exist.
36+
CodeNotFound = exported.CodeNotFound
3437
)
3538

3639
// Error represents a Service Bus specific error.

sdk/messaging/azservicebus/internal/constants.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
package internal
55

66
// Version is the semantic version number
7-
const Version = "v1.8.2-beta.1"
7+
const Version = "v1.9.0"

sdk/messaging/azservicebus/internal/errors.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,13 @@ func TransformError(err error) error {
7878

7979
var rpcErr RPCError
8080

81-
if errors.As(err, &rpcErr) && rpcErr.Resp.Code == http.StatusUnauthorized {
82-
return exported.NewError(exported.CodeUnauthorizedAccess, err)
81+
if errors.As(err, &rpcErr) {
82+
switch rpcErr.Resp.Code {
83+
case http.StatusUnauthorized:
84+
return exported.NewError(exported.CodeUnauthorizedAccess, err)
85+
case http.StatusNotFound:
86+
return exported.NewError(exported.CodeNotFound, err)
87+
}
8388
}
8489

8590
rk := GetRecoveryKind(err)

sdk/messaging/azservicebus/internal/errors_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,8 @@ func Test_TransformError(t *testing.T) {
260260

261261
// sanity check, an RPCError but it's not a azservicebus.Code type error.
262262
err = TransformError(RPCError{Resp: &amqpwrap.RPCResponse{Code: http.StatusNotFound}})
263-
require.False(t, errors.As(err, &asExportedErr))
263+
require.ErrorAs(t, err, &asExportedErr)
264+
require.Equal(t, exported.CodeNotFound, asExportedErr.Code)
264265

265266
err = TransformError(&amqp.Error{Condition: amqp.ErrCond("com.microsoft:message-lock-lost")})
266267
require.ErrorAs(t, err, &asExportedErr)

sdk/messaging/azservicebus/internal/exported/error.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ const (
2929
// any available sessions it will eventually time out and return an *azservicebus.Error
3030
// with this code.
3131
CodeTimeout Code = "timeout"
32+
33+
// CodeNotFound means the entity you're attempting to connect to doesn't exist.
34+
CodeNotFound Code = "notfound"
3235
)
3336

3437
// Error represents a Service Bus specific error.

0 commit comments

Comments
 (0)