7
7
using k8s . Informers . Notifications ;
8
8
using Microsoft . Extensions . Logging ;
9
9
using Microsoft . Extensions . Logging . Abstractions ;
10
+ using Org . BouncyCastle . Asn1 . X509 ;
10
11
11
12
namespace k8s . Controllers
12
13
{
@@ -104,7 +105,8 @@ public DataflowMessageStatus OfferMessage(DataflowMessageHeader messageHeader, R
104
105
_log . LogTrace ( $ "Queuing up { resourceEvent } ") ;
105
106
QueueActionLocked ( resourceEvent ) ;
106
107
}
107
-
108
+ if ( _queue . Count == 1 ) // we've just added to empty queue, kick off processing
109
+ OfferMessagesToLinks ( ) ;
108
110
return DataflowMessageStatus . Accepted ;
109
111
}
110
112
@@ -139,8 +141,7 @@ private void QueueActionLocked(ResourceEvent<TResource> obj)
139
141
140
142
deltas . Add ( obj ) ;
141
143
CombineDeltas ( deltas ) ;
142
- if ( _queue . Count == 1 ) // we've just added to empty queue, kick off processing
143
- OfferMessagesToLinks ( ) ;
144
+
144
145
145
146
}
146
147
@@ -210,27 +211,32 @@ public List<ResourceEvent<TResource>> ConsumeMessage(DataflowMessageHeader messa
210
211
private void OfferMessagesToLinks ( )
211
212
{
212
213
_log . LogTrace ( "Offering messages to links" ) ;
213
- lock ( _lock )
214
- {
215
- foreach ( var link in _targets . ToList ( ) . Where ( x => x . LastOfferedMessageReply != DataflowMessageStatus . Postponed ) )
214
+ List < TargetLink > linksToOfferTo ;
215
+ lock ( _lock )
216
+ {
217
+ linksToOfferTo = _targets . Where ( x => x . LastOfferedMessageReply != DataflowMessageStatus . Postponed ) . ToList ( ) ;
218
+ }
219
+
220
+ foreach ( var link in linksToOfferTo )
221
+ {
222
+ DataflowMessageStatus reply ;
223
+ do // keep feeding the link messages until queue is either empty or it tells us that it can't handle any more
216
224
{
217
- do // keep feeding the link messages until queue is either empty or it tells us that it can't handle any more
218
- {
219
- OfferMessageToLink ( link ) ;
220
- } while ( _queue . Count > 0 && link . LastOfferedMessageReply == DataflowMessageStatus . Accepted ) ;
221
- }
225
+ reply = OfferMessageToLink ( link ) ;
226
+ } while ( reply == DataflowMessageStatus . Accepted ) ;
222
227
}
228
+
223
229
}
224
230
225
- private void OfferMessageToLink ( TargetLink link )
231
+ private DataflowMessageStatus OfferMessageToLink ( TargetLink link )
226
232
{
227
233
List < ResourceEvent < TResource > > msg ;
228
234
lock ( _lock )
229
235
{
230
236
if ( ! _queue . TryPeek ( out msg ) )
231
237
{
232
238
_log . LogTrace ( "Nothing to offer - queue is empty" ) ;
233
- return ; // queue is empty
239
+ return DataflowMessageStatus . NotAvailable ; // queue is empty
234
240
}
235
241
}
236
242
@@ -242,6 +248,8 @@ private void OfferMessageToLink(TargetLink link)
242
248
_targets . Remove ( link ) ;
243
249
_log . LogTrace ( "Link is no longer accepting messages - removing link" ) ;
244
250
}
251
+
252
+ return link . LastOfferedMessageReply ;
245
253
}
246
254
247
255
public IDisposable LinkTo ( ITargetBlock < List < ResourceEvent < TResource > > > target , DataflowLinkOptions linkOptions )
0 commit comments