1
1
#include " kafka_read_session_actor.h"
2
+ #include " kafka_read_session_utils.h"
2
3
3
4
namespace NKafka {
4
5
static constexpr TDuration WAKEUP_INTERVAL = TDuration::Seconds(1 );
@@ -100,7 +101,7 @@ void TKafkaReadSessionActor::HandleJoinGroup(TEvKafka::TEvJoinGroupRequest::TPtr
100
101
<< " _" << " kafka" ;
101
102
102
103
if (!supportedProtocolFound) {
103
- SendJoinGroupResponseFail (ctx, ev->Get ()->CorrelationId , INCONSISTENT_GROUP_PROTOCOL, TStringBuilder () << " unsupported assign protocol. Must be " << SUPPORTED_ASSIGN_STRATEGY );
104
+ SendJoinGroupResponseFail (ctx, ev->Get ()->CorrelationId , INCONSISTENT_GROUP_PROTOCOL, TStringBuilder () << " unsupported assign protocol. Must be " << ASSIGN_STRATEGY_ROUNDROBIN );
104
105
CloseReadSession (ctx);
105
106
return ;
106
107
}
@@ -231,7 +232,7 @@ void TKafkaReadSessionActor::SendJoinGroupResponseOk(const TActorContext&, ui64
231
232
TJoinGroupResponseData::TPtr response = std::make_shared<TJoinGroupResponseData>();
232
233
233
234
response->ProtocolType = SUPPORTED_JOIN_GROUP_PROTOCOL;
234
- response->ProtocolName = SUPPORTED_ASSIGN_STRATEGY ;
235
+ response->ProtocolName = ASSIGN_STRATEGY_ROUNDROBIN ;
235
236
response->ErrorCode = EKafkaErrors::NONE_ERROR;
236
237
response->GenerationId = GenerationId;
237
238
response->MemberId = Session;
@@ -252,7 +253,7 @@ void TKafkaReadSessionActor::SendSyncGroupResponseOk(const TActorContext& ctx, u
252
253
TSyncGroupResponseData::TPtr response = std::make_shared<TSyncGroupResponseData>();
253
254
254
255
response->ProtocolType = SUPPORTED_JOIN_GROUP_PROTOCOL;
255
- response->ProtocolName = SUPPORTED_ASSIGN_STRATEGY ;
256
+ response->ProtocolName = ASSIGN_STRATEGY_ROUNDROBIN ;
256
257
response->ErrorCode = EKafkaErrors::NONE_ERROR;
257
258
258
259
auto assignment = BuildAssignmentAndInformBalancerIfRelease (ctx);
@@ -323,17 +324,28 @@ bool TKafkaReadSessionActor::CheckHeartbeatIsExpired() {
323
324
return now - LastHeartbeatTime > MaxHeartbeatTimeoutMs;
324
325
}
325
326
326
- bool TKafkaReadSessionActor::TryFillTopicsToRead (const TMessagePtr<TJoinGroupRequestData> joinGroupRequestData, THashSet<TString>& topics) {
327
- auto supportedProtocolFound = false ;
328
- for (auto protocol: joinGroupRequestData->Protocols ) {
329
- KAFKA_LOG_D (" JOIN_GROUP assign protocol supported by client: " << protocol.Name );
330
- if (protocol.Name == SUPPORTED_ASSIGN_STRATEGY) {
331
- FillTopicsFromJoinGroupMetadata (protocol.Metadata , topics);
332
- supportedProtocolFound = true ;
333
- break ;
327
+ bool TKafkaReadSessionActor::TryFillTopicsToRead (const TMessagePtr<TJoinGroupRequestData> request, THashSet<TString>& topics) {
328
+ auto validProtocol = request->ProtocolType == SUPPORTED_JOIN_GROUP_PROTOCOL
329
+ && AnyOf (request->Protocols , [](const TJoinGroupRequestData::TJoinGroupRequestProtocol& p) {
330
+ return p.Name == ASSIGN_STRATEGY_ROUNDROBIN || p.Name == ASSIGN_STRATEGY_SERVER;
331
+ });
332
+ if (!validProtocol) {
333
+ return false ;
334
+ }
335
+
336
+ auto result = GetSubscriptions (*request);
337
+ for (auto topic: result->Topics ) {
338
+ if (topic.has_value ()) {
339
+ KAFKA_LOG_D (" JOIN_GROUP requested topic to read: " << topic);
340
+
341
+ auto normalizedTopicName = NormalizePath (Context->DatabasePath , topic.value ());
342
+ OriginalTopicNames[normalizedTopicName] = topic.value ();
343
+ OriginalTopicNames[normalizedTopicName + " /streamImpl" ] = topic.value ();
344
+ topics.emplace (normalizedTopicName);
334
345
}
335
346
}
336
- return supportedProtocolFound;
347
+
348
+ return true ;
337
349
}
338
350
339
351
TConsumerProtocolAssignment TKafkaReadSessionActor::BuildAssignmentAndInformBalancerIfRelease (const TActorContext& ctx) {
@@ -376,26 +388,6 @@ TConsumerProtocolAssignment TKafkaReadSessionActor::BuildAssignmentAndInformBala
376
388
return assignment;
377
389
}
378
390
379
- void TKafkaReadSessionActor::FillTopicsFromJoinGroupMetadata (TKafkaBytes& metadata, THashSet<TString>& topics) {
380
- TKafkaVersion version = *(TKafkaVersion*)(metadata.value ().data () + sizeof (TKafkaVersion));
381
-
382
- TBuffer buffer (metadata.value ().data () + sizeof (TKafkaVersion), metadata.value ().size_bytes () - sizeof (TKafkaVersion));
383
- TKafkaReadable readable (buffer);
384
-
385
- TConsumerProtocolSubscription result;
386
- result.Read (readable, version);
387
-
388
- for (auto topic: result.Topics ) {
389
- if (topic.has_value ()) {
390
- auto normalizedTopicName = NormalizePath (Context->DatabasePath , topic.value ());
391
- OriginalTopicNames[normalizedTopicName] = topic.value ();
392
- OriginalTopicNames[normalizedTopicName + " /streamImpl" ] = topic.value ();
393
- topics.emplace (normalizedTopicName);
394
- KAFKA_LOG_D (" JOIN_GROUP requested topic to read: " << topic);
395
- }
396
- }
397
- }
398
-
399
391
void TKafkaReadSessionActor::HandlePipeConnected (TEvTabletPipe::TEvClientConnected::TPtr& ev, const TActorContext&) {
400
392
const auto * msg = ev->Get ();
401
393
if (msg->Status != NKikimrProto::OK) {
0 commit comments