Skip to content

Commit 5296d44

Browse files
committed
Add publish sequence number as long as _publisherConfirmationsEnabled is true
Fix the `PublisherConfirms` test program
1 parent d8d00e8 commit 5296d44

File tree

2 files changed

+46
-30
lines changed

2 files changed

+46
-30
lines changed

projects/RabbitMQ.Client/Impl/ChannelBase.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ await _basicReturnAsyncWrapper.InvokeAsync(this, e)
653653
.ConfigureAwait(false);
654654
}
655655

656-
if (_publisherConfirmationsEnabled && _publisherConfirmationTrackingEnabled)
656+
if (_publisherConfirmationsEnabled)
657657
{
658658
ulong publishSequenceNumber = 0;
659659
IReadOnlyBasicProperties props = e.BasicProperties;
@@ -666,7 +666,7 @@ await _basicReturnAsyncWrapper.InvokeAsync(this, e)
666666
}
667667
}
668668

669-
if (publishSequenceNumber != 0)
669+
if (publishSequenceNumber != 0 && _publisherConfirmationTrackingEnabled)
670670
{
671671
await HandleAckNack(publishSequenceNumber, false, true, cancellationToken)
672672
.ConfigureAwait(false);
@@ -1018,10 +1018,10 @@ await _confirmSemaphore.WaitAsync(cancellationToken)
10181018
.ConfigureAwait(false);
10191019
try
10201020
{
1021+
publishSequenceNumber = _nextPublishSeqNo;
1022+
10211023
if (_publisherConfirmationTrackingEnabled)
10221024
{
1023-
publishSequenceNumber = _nextPublishSeqNo;
1024-
10251025
_pendingDeliveryTags.AddLast(publishSequenceNumber);
10261026
publisherConfirmationTcs = new(TaskCreationOptions.RunContinuationsAsynchronously);
10271027
_confirmsTaskCompletionSources[publishSequenceNumber] = publisherConfirmationTcs;
@@ -1115,10 +1115,10 @@ await _confirmSemaphore.WaitAsync(cancellationToken)
11151115
.ConfigureAwait(false);
11161116
try
11171117
{
1118+
publishSequenceNumber = _nextPublishSeqNo;
1119+
11181120
if (_publisherConfirmationTrackingEnabled)
11191121
{
1120-
publishSequenceNumber = _nextPublishSeqNo;
1121-
11221122
_pendingDeliveryTags.AddLast(publishSequenceNumber);
11231123
publisherConfirmationTcs = new(TaskCreationOptions.RunContinuationsAsynchronously);
11241124
_confirmsTaskCompletionSources[publishSequenceNumber] = publisherConfirmationTcs;
@@ -1880,7 +1880,7 @@ await _confirmSemaphore.WaitAsync(cancellationToken)
18801880
Activity? sendActivity, ulong publishSequenceNumber)
18811881
where TProperties : IReadOnlyBasicProperties, IAmqpHeader
18821882
{
1883-
if (sendActivity is null && false == _publisherConfirmationTrackingEnabled)
1883+
if (sendActivity is null && false == _publisherConfirmationsEnabled)
18841884
{
18851885
return null;
18861886
}
@@ -1936,7 +1936,7 @@ void MaybeAddActivityToHeaders(IDictionary<string, object?> headers,
19361936

19371937
void MaybeAddPublishSequenceNumberToHeaders(IDictionary<string, object?> headers)
19381938
{
1939-
if (_publisherConfirmationTrackingEnabled)
1939+
if (_publisherConfirmationsEnabled)
19401940
{
19411941
byte[] publishSequenceNumberBytes;
19421942
if (BitConverter.IsLittleEndian)

projects/Test/Applications/PublisherConfirms/PublisherConfirms.cs

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,13 @@
3838
using System.Threading.Tasks;
3939
using RabbitMQ.Client;
4040

41-
// const int MESSAGE_COUNT = 50_000;
42-
const int MESSAGE_COUNT = 5;
41+
const int MESSAGE_COUNT = 50_000;
4342
bool debug = false;
4443

4544
#pragma warning disable CS8321 // Local function is declared but never used
4645

47-
// await PublishMessagesIndividuallyAsync();
48-
// await PublishMessagesInBatchAsync();
46+
await PublishMessagesIndividuallyAsync();
47+
await PublishMessagesInBatchAsync();
4948
await HandlePublishConfirmsAsynchronously();
5049

5150
static Task<IConnection> CreateConnectionAsync()
@@ -68,10 +67,15 @@ static async Task PublishMessagesIndividuallyAsync()
6867
var sw = new Stopwatch();
6968
sw.Start();
7069

70+
bool ack = false;
7171
for (int i = 0; i < MESSAGE_COUNT; i++)
7272
{
7373
byte[] body = Encoding.UTF8.GetBytes(i.ToString());
74-
await channel.BasicPublishAsync(exchange: string.Empty, routingKey: queueName, body: body);
74+
ack = await channel.BasicPublishAsync(exchange: string.Empty, routingKey: queueName, body: body);
75+
if (false == ack)
76+
{
77+
Console.Error.WriteLine($"{DateTime.Now} [ERROR] saw nack '{ack}'");
78+
}
7579
}
7680

7781
sw.Stop();
@@ -90,7 +94,7 @@ static async Task PublishMessagesInBatchAsync()
9094
QueueDeclareOk queueDeclareResult = await channel.QueueDeclareAsync();
9195
string queueName = queueDeclareResult.QueueName;
9296

93-
int batchSize = 500;
97+
int batchSize = 1000;
9498
int outstandingMessageCount = 0;
9599

96100
var sw = new Stopwatch();
@@ -105,9 +109,13 @@ static async Task PublishMessagesInBatchAsync()
105109

106110
if (outstandingMessageCount == batchSize)
107111
{
108-
foreach (ValueTask<bool> vt in publishTasks)
112+
foreach (ValueTask<bool> pt in publishTasks)
109113
{
110-
await vt;
114+
bool ack = await pt;
115+
if (false == ack)
116+
{
117+
Console.Error.WriteLine($"{DateTime.Now} [ERROR] saw nack '{ack}'");
118+
}
111119
}
112120
publishTasks.Clear();
113121
outstandingMessageCount = 0;
@@ -116,9 +124,13 @@ static async Task PublishMessagesInBatchAsync()
116124

117125
if (publishTasks.Count > 0)
118126
{
119-
foreach (ValueTask<bool> vt in publishTasks)
127+
foreach (ValueTask<bool> pt in publishTasks)
120128
{
121-
await vt;
129+
bool ack = await pt;
130+
if (false == ack)
131+
{
132+
Console.Error.WriteLine($"{DateTime.Now} [ERROR] saw nack '{ack}'");
133+
}
122134
}
123135
publishTasks.Clear();
124136
outstandingMessageCount = 0;
@@ -134,25 +146,21 @@ async Task HandlePublishConfirmsAsynchronously()
134146

135147
await using IConnection connection = await CreateConnectionAsync();
136148

137-
// NOTE: setting trackConfirmations to false because this program
138-
// is tracking them itself.
139149
var channelOptions = new CreateChannelOptions
140150
{
141151
PublisherConfirmationsEnabled = true,
142-
PublisherConfirmationTrackingEnabled = true
152+
PublisherConfirmationTrackingEnabled = false
143153
};
144154
await using IChannel channel = await connection.CreateChannelAsync(channelOptions);
145155

146156
// declare a server-named queue
147157
QueueDeclareOk queueDeclareResult = await channel.QueueDeclareAsync();
148158
string queueName = queueDeclareResult.QueueName;
149159

150-
#pragma warning disable CS0219 // Variable is assigned but its value is never used
151-
bool publishingCompleted = false;
152-
#pragma warning restore CS0219 // Variable is assigned but its value is never used
153160
var allMessagesConfirmedTcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
154161
var outstandingConfirms = new LinkedList<ulong>();
155162
var semaphore = new SemaphoreSlim(1, 1);
163+
int confirmedCount = 0;
156164
async Task CleanOutstandingConfirms(ulong deliveryTag, bool multiple)
157165
{
158166
if (debug)
@@ -181,10 +189,13 @@ async Task CleanOutstandingConfirms(ulong deliveryTag, bool multiple)
181189
{
182190
break;
183191
}
192+
193+
confirmedCount++;
184194
} while (true);
185195
}
186196
else
187197
{
198+
confirmedCount++;
188199
outstandingConfirms.Remove(deliveryTag);
189200
}
190201
}
@@ -193,8 +204,7 @@ async Task CleanOutstandingConfirms(ulong deliveryTag, bool multiple)
193204
semaphore.Release();
194205
}
195206

196-
// if (publishingCompleted && outstandingConfirms.Count == 0)
197-
if (outstandingConfirms.Count == 0)
207+
if (outstandingConfirms.Count == 0 || confirmedCount == MESSAGE_COUNT)
198208
{
199209
allMessagesConfirmedTcs.SetResult(true);
200210
}
@@ -248,8 +258,12 @@ async Task CleanOutstandingConfirms(ulong deliveryTag, bool multiple)
248258
semaphore.Release();
249259
}
250260

251-
// string rk = queueName;
252-
string rk = Guid.NewGuid().ToString();
261+
string rk = queueName;
262+
if (i % 1000 == 0)
263+
{
264+
// This will cause a basic.return, for fun
265+
rk = Guid.NewGuid().ToString();
266+
}
253267
ValueTask<bool> pt = channel.BasicPublishAsync(exchange: string.Empty, routingKey: rk, body: body, mandatory: true);
254268
publishTasks.Add(pt);
255269
}
@@ -259,9 +273,11 @@ async Task CleanOutstandingConfirms(ulong deliveryTag, bool multiple)
259273
foreach (ValueTask<bool> pt in publishTasks)
260274
{
261275
bool ack = await pt;
262-
Console.WriteLine($"{DateTime.Now} [INFO] saw ack '{ack}'");
276+
if (false == ack)
277+
{
278+
Console.Error.WriteLine($"{DateTime.Now} [ERROR] saw nack '{ack}'");
279+
}
263280
}
264-
publishingCompleted = true;
265281

266282
try
267283
{

0 commit comments

Comments
 (0)