Skip to content

Commit 9a822fa

Browse files
authored
Merge pull request #1708 from rabbitmq/lukebakken/more-todos
Address some more TODOs
2 parents 86827c3 + 38d7f80 commit 9a822fa

11 files changed

+137
-94
lines changed

projects/RabbitMQ.Client.OAuth2/OAuth2Client.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ public async Task<IToken> RequestTokenAsync(CancellationToken cancellationToken
245245

246246
if (token is null)
247247
{
248-
// TODO specific exception?
249248
throw new InvalidOperationException("token is null");
250249
}
251250

@@ -274,7 +273,6 @@ public async Task<IToken> RefreshTokenAsync(IToken token,
274273

275274
if (refreshedToken is null)
276275
{
277-
// TODO specific exception?
278276
throw new InvalidOperationException("refreshed token is null");
279277
}
280278

projects/RabbitMQ.Client/Events/CallbackExceptionEventArgs.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ public class CallbackExceptionEventArgs : BaseExceptionEventArgs
7878
private const string ContextString = "context";
7979
private const string ConsumerString = "consumer";
8080

81-
// TODO Why is this public when there is a build method?
8281
public CallbackExceptionEventArgs(IDictionary<string, object> detail, Exception exception, CancellationToken cancellationToken = default)
8382
: base(detail, exception, cancellationToken)
8483
{

projects/RabbitMQ.Client/Exceptions/UnexpectedMethodException.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
namespace RabbitMQ.Client.Exceptions
3636
{
3737
/// <summary>
38-
/// TODO WHY IS THIS UNREFERENCED?
3938
/// Thrown when the channel receives an RPC reply that it wasn't expecting.
4039
/// </summary>
4140
[Serializable]

projects/RabbitMQ.Client/Impl/AutorecoveringChannel.cs

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
using System.Collections.Generic;
3434
using System.Runtime.CompilerServices;
3535
using System.Threading;
36-
using System.Threading.RateLimiting;
3736
using System.Threading.Tasks;
3837
using RabbitMQ.Client.ConsumerDispatching;
3938
using RabbitMQ.Client.Events;
@@ -43,18 +42,17 @@ namespace RabbitMQ.Client.Impl
4342
{
4443
internal sealed class AutorecoveringChannel : IChannel, IRecoverable
4544
{
45+
private readonly ChannelOptions _channelOptions;
46+
private readonly List<string> _recordedConsumerTags = new List<string>();
47+
4648
private AutorecoveringConnection _connection;
4749
private RecoveryAwareChannel _innerChannel;
4850
private bool _disposed;
49-
private readonly List<string> _recordedConsumerTags = new List<string>();
5051

5152
private ushort _prefetchCountConsumer;
5253
private ushort _prefetchCountGlobal;
53-
private bool _publisherConfirmationsEnabled = false;
54-
private bool _publisherConfirmationTrackingEnabled = false;
55-
private RateLimiter? _outstandingPublisherConfirmationsRateLimiter = null;
54+
5655
private bool _usesTransactions;
57-
private ushort _consumerDispatchConcurrency;
5856

5957
internal IConsumerDispatcher ConsumerDispatcher => InnerChannel.ConsumerDispatcher;
6058

@@ -73,20 +71,13 @@ public TimeSpan ContinuationTimeout
7371
set => InnerChannel.ContinuationTimeout = value;
7472
}
7573

76-
// TODO just pass create channel options
7774
public AutorecoveringChannel(AutorecoveringConnection conn,
7875
RecoveryAwareChannel innerChannel,
79-
ushort consumerDispatchConcurrency,
80-
bool publisherConfirmationsEnabled,
81-
bool publisherConfirmationTrackingEnabled,
82-
RateLimiter? outstandingPublisherConfirmationsRateLimiter)
76+
ChannelOptions channelOptions)
8377
{
8478
_connection = conn;
8579
_innerChannel = innerChannel;
86-
_consumerDispatchConcurrency = consumerDispatchConcurrency;
87-
_publisherConfirmationsEnabled = publisherConfirmationsEnabled;
88-
_publisherConfirmationTrackingEnabled = publisherConfirmationTrackingEnabled;
89-
_outstandingPublisherConfirmationsRateLimiter = outstandingPublisherConfirmationsRateLimiter;
80+
_channelOptions = channelOptions;
9081
}
9182

9283
public event AsyncEventHandler<BasicAckEventArgs> BasicAcksAsync
@@ -171,13 +162,9 @@ internal async Task<bool> AutomaticallyRecoverAsync(AutorecoveringConnection con
171162

172163
_connection = conn;
173164

174-
RecoveryAwareChannel newChannel = await conn.CreateNonRecoveringChannelAsync(
175-
_publisherConfirmationsEnabled,
176-
_publisherConfirmationTrackingEnabled,
177-
_outstandingPublisherConfirmationsRateLimiter,
178-
_consumerDispatchConcurrency,
179-
cancellationToken)
165+
RecoveryAwareChannel newChannel = await conn.CreateNonRecoveringChannelAsync(_channelOptions, cancellationToken)
180166
.ConfigureAwait(false);
167+
181168
newChannel.TakeOver(_innerChannel);
182169

183170
if (_prefetchCountConsumer != 0)

projects/RabbitMQ.Client/Impl/AutorecoveringConnection.cs

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
using System.Collections.Generic;
3434
using System.Runtime.CompilerServices;
3535
using System.Threading;
36-
using System.Threading.RateLimiting;
3736
using System.Threading.Tasks;
3837
using RabbitMQ.Client.Events;
3938
using RabbitMQ.Client.Exceptions;
@@ -185,22 +184,12 @@ public event AsyncEventHandler<RecoveringConsumerEventArgs> RecoveringConsumerAs
185184

186185
public IProtocol Protocol => Endpoint.Protocol;
187186

188-
// TODO pass channel creation options?
189-
public async ValueTask<RecoveryAwareChannel> CreateNonRecoveringChannelAsync(
190-
bool publisherConfirmationsEnabled = false,
191-
bool publisherConfirmationTrackingEnabled = false,
192-
RateLimiter? outstandingPublisherConfirmationsRateLimiter = null,
193-
ushort? consumerDispatchConcurrency = null,
187+
public ValueTask<RecoveryAwareChannel> CreateNonRecoveringChannelAsync(
188+
ChannelOptions channelOptions,
194189
CancellationToken cancellationToken = default)
195190
{
196191
ISession session = InnerConnection.CreateSession();
197-
var result = new RecoveryAwareChannel(_config, session, consumerDispatchConcurrency);
198-
return (RecoveryAwareChannel)await result.OpenAsync(
199-
publisherConfirmationsEnabled,
200-
publisherConfirmationTrackingEnabled,
201-
outstandingPublisherConfirmationsRateLimiter,
202-
cancellationToken)
203-
.ConfigureAwait(false);
192+
return RecoveryAwareChannel.CreateAndOpenAsync(session, channelOptions, cancellationToken);
204193
}
205194

206195
public override string ToString()
@@ -271,23 +260,16 @@ public async Task<IChannel> CreateChannelAsync(CreateChannelOptions? options = d
271260

272261
ushort cdc = options.ConsumerDispatchConcurrency.GetValueOrDefault(_config.ConsumerDispatchConcurrency);
273262

274-
RecoveryAwareChannel recoveryAwareChannel = await CreateNonRecoveringChannelAsync(
275-
options.PublisherConfirmationsEnabled,
276-
options.PublisherConfirmationTrackingEnabled,
277-
options.OutstandingPublisherConfirmationsRateLimiter,
278-
cdc,
279-
cancellationToken)
263+
var channelOptions = ChannelOptions.From(options, _config);
264+
265+
RecoveryAwareChannel recoveryAwareChannel = await CreateNonRecoveringChannelAsync(channelOptions, cancellationToken)
280266
.ConfigureAwait(false);
281267

282-
// TODO just pass create channel options
283-
var autorecoveringChannel = new AutorecoveringChannel(this,
284-
recoveryAwareChannel,
285-
cdc,
286-
options.PublisherConfirmationsEnabled,
287-
options.PublisherConfirmationTrackingEnabled,
288-
options.OutstandingPublisherConfirmationsRateLimiter);
268+
var autorecoveringChannel = new AutorecoveringChannel(this, recoveryAwareChannel, channelOptions);
269+
289270
await RecordChannelAsync(autorecoveringChannel, channelsSemaphoreHeld: false, cancellationToken: cancellationToken)
290271
.ConfigureAwait(false);
272+
291273
return autorecoveringChannel;
292274
}
293275

projects/RabbitMQ.Client/Impl/Channel.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
using System.Runtime.CompilerServices;
3838
using System.Text;
3939
using System.Threading;
40-
using System.Threading.RateLimiting;
4140
using System.Threading.Tasks;
4241
using RabbitMQ.Client.ConsumerDispatching;
4342
using RabbitMQ.Client.Events;
@@ -62,11 +61,10 @@ internal partial class Channel : IChannel, IRecoverable
6261

6362
internal readonly IConsumerDispatcher ConsumerDispatcher;
6463

65-
public Channel(ConnectionConfig config, ISession session, ushort? perChannelConsumerDispatchConcurrency = null)
64+
public Channel(ISession session, ChannelOptions channelOptions)
6665
{
67-
ContinuationTimeout = config.ContinuationTimeout;
68-
ConsumerDispatcher = new AsyncConsumerDispatcher(this,
69-
perChannelConsumerDispatchConcurrency.GetValueOrDefault(config.ConsumerDispatchConcurrency));
66+
ContinuationTimeout = channelOptions.ContinuationTimeout;
67+
ConsumerDispatcher = new AsyncConsumerDispatcher(this, channelOptions.ConsumerDispatchConcurrency);
7068
Func<Exception, string, CancellationToken, Task> onExceptionAsync = (exception, context, cancellationToken) =>
7169
OnCallbackExceptionAsync(CallbackExceptionEventArgs.Build(exception, context, cancellationToken));
7270
_basicAcksAsyncWrapper = new AsyncEventingWrapper<BasicAckEventArgs>("OnBasicAck", onExceptionAsync);
@@ -361,14 +359,12 @@ protected bool Enqueue(IRpcContinuation k)
361359
}
362360
}
363361

364-
internal async Task<IChannel> OpenAsync(bool publisherConfirmationsEnabled,
365-
bool publisherConfirmationTrackingEnabled,
366-
RateLimiter? outstandingPublisherConfirmationsRateLimiter,
362+
internal async Task<IChannel> OpenAsync(ChannelOptions channelOptions,
367363
CancellationToken cancellationToken)
368364
{
369-
ConfigurePublisherConfirmations(publisherConfirmationsEnabled,
370-
publisherConfirmationTrackingEnabled,
371-
outstandingPublisherConfirmationsRateLimiter);
365+
ConfigurePublisherConfirmations(channelOptions.PublisherConfirmationsEnabled,
366+
channelOptions.PublisherConfirmationTrackingEnabled,
367+
channelOptions.OutstandingPublisherConfirmationsRateLimiter);
372368

373369
bool enqueued = false;
374370
var k = new ChannelOpenAsyncRpcContinuation(ContinuationTimeout, cancellationToken);
@@ -1497,6 +1493,15 @@ await ModelSendAsync(in method, k.CancellationToken)
14971493
}
14981494
}
14991495

1496+
internal static Task<IChannel> CreateAndOpenAsync(CreateChannelOptions createChannelOptions,
1497+
ConnectionConfig connectionConfig, ISession session,
1498+
CancellationToken cancellationToken)
1499+
{
1500+
ChannelOptions channelOptions = ChannelOptions.From(createChannelOptions, connectionConfig);
1501+
var channel = new Channel(session, channelOptions);
1502+
return channel.OpenAsync(channelOptions, cancellationToken);
1503+
}
1504+
15001505
/// <summary>
15011506
/// Returning <c>true</c> from this method means that the command was server-originated,
15021507
/// and handled already.
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// This source code is dual-licensed under the Apache License, version
2+
// 2.0, and the Mozilla Public License, version 2.0.
3+
//
4+
// The APL v2.0:
5+
//
6+
//---------------------------------------------------------------------------
7+
// Copyright (c) 2007-2024 Broadcom. All Rights Reserved.
8+
//
9+
// Licensed under the Apache License, Version 2.0 (the "License");
10+
// you may not use this file except in compliance with the License.
11+
// You may obtain a copy of the License at
12+
//
13+
// https://www.apache.org/licenses/LICENSE-2.0
14+
//
15+
// Unless required by applicable law or agreed to in writing, software
16+
// distributed under the License is distributed on an "AS IS" BASIS,
17+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
// See the License for the specific language governing permissions and
19+
// limitations under the License.
20+
//---------------------------------------------------------------------------
21+
//
22+
// The MPL v2.0:
23+
//
24+
//---------------------------------------------------------------------------
25+
// This Source Code Form is subject to the terms of the Mozilla Public
26+
// License, v. 2.0. If a copy of the MPL was not distributed with this
27+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
28+
//
29+
// Copyright (c) 2007-2024 Broadcom. All Rights Reserved.
30+
//---------------------------------------------------------------------------
31+
32+
using System;
33+
using System.Threading.RateLimiting;
34+
35+
namespace RabbitMQ.Client.Impl
36+
{
37+
internal sealed class ChannelOptions
38+
{
39+
private readonly bool _publisherConfirmationEnabled;
40+
private readonly bool _publisherConfirmationTrackingEnabled;
41+
private readonly ushort _consumerDispatchConcurrency;
42+
private readonly RateLimiter? _outstandingPublisherConfirmationsRateLimiter;
43+
private readonly TimeSpan _continuationTimeout;
44+
45+
public ChannelOptions(bool publisherConfirmationEnabled,
46+
bool publisherConfirmationTrackingEnabled,
47+
ushort consumerDispatchConcurrency,
48+
RateLimiter? outstandingPublisherConfirmationsRateLimiter,
49+
TimeSpan continuationTimeout)
50+
{
51+
_publisherConfirmationEnabled = publisherConfirmationEnabled;
52+
_publisherConfirmationTrackingEnabled = publisherConfirmationTrackingEnabled;
53+
_consumerDispatchConcurrency = consumerDispatchConcurrency;
54+
_outstandingPublisherConfirmationsRateLimiter = outstandingPublisherConfirmationsRateLimiter;
55+
_continuationTimeout = continuationTimeout;
56+
}
57+
58+
public bool PublisherConfirmationsEnabled => _publisherConfirmationEnabled;
59+
60+
public bool PublisherConfirmationTrackingEnabled => _publisherConfirmationTrackingEnabled;
61+
62+
public ushort ConsumerDispatchConcurrency => _consumerDispatchConcurrency;
63+
64+
public RateLimiter? OutstandingPublisherConfirmationsRateLimiter => _outstandingPublisherConfirmationsRateLimiter;
65+
66+
public TimeSpan ContinuationTimeout => _continuationTimeout;
67+
68+
public static ChannelOptions From(CreateChannelOptions createChannelOptions,
69+
ConnectionConfig connectionConfig)
70+
{
71+
ushort cdc = createChannelOptions.ConsumerDispatchConcurrency.GetValueOrDefault(
72+
connectionConfig.ConsumerDispatchConcurrency);
73+
74+
return new ChannelOptions(createChannelOptions.PublisherConfirmationsEnabled,
75+
createChannelOptions.PublisherConfirmationTrackingEnabled,
76+
cdc,
77+
createChannelOptions.OutstandingPublisherConfirmationsRateLimiter,
78+
connectionConfig.ContinuationTimeout);
79+
}
80+
81+
public static ChannelOptions From(ConnectionConfig connectionConfig)
82+
{
83+
return new ChannelOptions(publisherConfirmationEnabled: false,
84+
publisherConfirmationTrackingEnabled: false,
85+
consumerDispatchConcurrency: Constants.DefaultConsumerDispatchConcurrency,
86+
outstandingPublisherConfirmationsRateLimiter: null,
87+
continuationTimeout: connectionConfig.ContinuationTimeout);
88+
}
89+
}
90+
}

projects/RabbitMQ.Client/Impl/Connection.cs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ internal Connection(ConnectionConfig config, IFrameHandler frameHandler)
7878

7979
_sessionManager = new SessionManager(this, 0, config.MaxInboundMessageBodySize);
8080
_session0 = new MainSession(this, config.MaxInboundMessageBodySize);
81-
_channel0 = new Channel(_config, _session0);
81+
_channel0 = new Channel(_session0, ChannelOptions.From(config));
8282

8383
ClientProperties = new Dictionary<string, object?>(_config.ClientProperties)
8484
{
@@ -263,23 +263,15 @@ await CloseAsync(ea, true,
263263
}
264264
}
265265

266-
public async Task<IChannel> CreateChannelAsync(CreateChannelOptions? options = default,
266+
public Task<IChannel> CreateChannelAsync(CreateChannelOptions? createChannelOptions = default,
267267
CancellationToken cancellationToken = default)
268268
{
269269
EnsureIsOpen();
270270

271-
options ??= CreateChannelOptions.Default;
271+
createChannelOptions ??= CreateChannelOptions.Default;
272272
ISession session = CreateSession();
273273

274-
// TODO channel CreateChannelAsync() to combine ctor and OpenAsync
275-
var channel = new Channel(_config, session, options.ConsumerDispatchConcurrency);
276-
IChannel ch = await channel.OpenAsync(
277-
options.PublisherConfirmationsEnabled,
278-
options.PublisherConfirmationTrackingEnabled,
279-
options.OutstandingPublisherConfirmationsRateLimiter,
280-
cancellationToken)
281-
.ConfigureAwait(false);
282-
return ch;
274+
return Channel.CreateAndOpenAsync(createChannelOptions, _config, session, cancellationToken);
283275
}
284276

285277
internal ISession CreateSession()

projects/RabbitMQ.Client/Impl/RecoveryAwareChannel.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,13 @@
3131

3232
using System.Threading;
3333
using System.Threading.Tasks;
34-
using RabbitMQ.Client.Framing;
3534

3635
namespace RabbitMQ.Client.Impl
3736
{
3837
internal sealed class RecoveryAwareChannel : Channel
3938
{
40-
public RecoveryAwareChannel(ConnectionConfig config, ISession session, ushort? consumerDispatchConcurrency = null)
41-
: base(config, session, consumerDispatchConcurrency)
39+
public RecoveryAwareChannel(ISession session, ChannelOptions channelOptions)
40+
: base(session, channelOptions)
4241
{
4342
ActiveDeliveryTagOffset = 0;
4443
MaxSeenDeliveryTag = 0;
@@ -104,5 +103,13 @@ public override ValueTask BasicRejectAsync(ulong deliveryTag, bool requeue,
104103
return default;
105104
}
106105
}
106+
107+
internal static async ValueTask<RecoveryAwareChannel> CreateAndOpenAsync(ISession session, ChannelOptions channelOptions,
108+
CancellationToken cancellationToken)
109+
{
110+
var result = new RecoveryAwareChannel(session, channelOptions);
111+
return (RecoveryAwareChannel)await result.OpenAsync(channelOptions, cancellationToken)
112+
.ConfigureAwait(false);
113+
}
107114
}
108115
}

0 commit comments

Comments
 (0)