@@ -17,24 +17,33 @@ TKafkaTestClient::TKafkaTestClient(ui16 port, const TString clientName)
17
17
, ClientName(clientName) {
18
18
}
19
19
20
- TMessagePtr<TApiVersionsResponseData> TKafkaTestClient::ApiVersions () {
21
- Cerr << " >>>>> ApiVersionsRequest\n " ;
20
+ TMessagePtr<TApiVersionsResponseData> TKafkaTestClient::ApiVersions (bool silent) {
21
+ if (!silent) {
22
+ Cerr << " >>>>> ApiVersionsRequest\n " ;
23
+ }
22
24
23
25
TRequestHeaderData header = Header (NKafka::EApiKey::API_VERSIONS, 2 );
24
26
25
27
TApiVersionsRequestData request;
26
28
request.ClientSoftwareName = " SuperTest" ;
27
29
request.ClientSoftwareVersion = " 3100.7.13" ;
28
30
29
- return WriteAndRead<TApiVersionsResponseData>(header, request);
31
+ return WriteAndRead<TApiVersionsResponseData>(header, request, silent );
30
32
}
31
33
32
- TMessagePtr<TMetadataResponseData> TKafkaTestClient::Metadata (const TVector<TString>& topics) {
34
+ // YDB ignores AllowAutoTopicCreation, i.e. it never creates a new topic implicitly.
35
+ // But in Apache Kafka the default behavior is to create a new topic, if there is no one at the moment of the request.
36
+ // With this flag, allowAutoTopicCreation, you can stop this behavior in Apache Kafka.
37
+ TMessagePtr<TMetadataResponseData> TKafkaTestClient::Metadata (const TVector<TString>& topics, std::optional<bool > allowAutoTopicCreation) {
33
38
Cerr << " >>>>> MetadataRequest\n " ;
34
39
35
- TRequestHeaderData header = Header (NKafka::EApiKey::METADATA, 9 );
40
+ TRequestHeaderData header = Header (NKafka::EApiKey::METADATA, 12 );
36
41
37
42
TMetadataRequestData request;
43
+ if (allowAutoTopicCreation.has_value ()) {
44
+ // If allowAutoTopicCreation does not have a value, use the default value (= true).
45
+ request.AllowAutoTopicCreation = allowAutoTopicCreation.value () ? 1 : 0 ;
46
+ }
38
47
request.Topics .reserve (topics.size ());
39
48
for (auto topicName : topics) {
40
49
NKafka::TMetadataRequestData::TMetadataRequestTopic topic;
@@ -70,7 +79,7 @@ TMessagePtr<TSaslAuthenticateResponseData> TKafkaTestClient::SaslAuthenticate(co
70
79
return WriteAndRead<TSaslAuthenticateResponseData>(header, request);
71
80
}
72
81
73
- TMessagePtr<TInitProducerIdResponseData> TKafkaTestClient::InitProducerId (const TString& transactionalId) {
82
+ TMessagePtr<TInitProducerIdResponseData> TKafkaTestClient::InitProducerId (const std::optional< TString> & transactionalId) {
74
83
Cerr << " >>>>> TInitProducerIdRequestData\n " ;
75
84
76
85
TRequestHeaderData header = Header (NKafka::EApiKey::INIT_PRODUCER_ID, 4 );
@@ -120,6 +129,7 @@ TMessagePtr<TProduceResponseData> TKafkaTestClient::Produce(const TString& topic
120
129
TRequestHeaderData header = Header (NKafka::EApiKey::PRODUCE, 9 );
121
130
122
131
TProduceRequestData request;
132
+ request.Acks = -1 ;
123
133
request.TopicData .resize (1 );
124
134
request.TopicData [0 ].Name = topicName;
125
135
request.TopicData [0 ].PartitionData .resize (msgs.size ());
@@ -427,8 +437,9 @@ TMessagePtr<TFetchResponseData> TKafkaTestClient::Fetch(const std::vector<std::p
427
437
TRequestHeaderData header = Header (NKafka::EApiKey::FETCH, 3 );
428
438
429
439
TFetchRequestData request;
430
- request.MaxBytes = 1024 ;
440
+ request.MaxWaitMs = 1000 ;
431
441
request.MinBytes = 1 ;
442
+ request.ReplicaId = -1 ;
432
443
433
444
for (auto & topic: topics) {
434
445
NKafka::TFetchRequestData::TFetchTopic topicReq {};
@@ -437,7 +448,33 @@ TMessagePtr<TFetchResponseData> TKafkaTestClient::Fetch(const std::vector<std::p
437
448
NKafka::TFetchRequestData::TFetchTopic::TFetchPartition partitionReq {};
438
449
partitionReq.FetchOffset = offset;
439
450
partitionReq.Partition = partition;
440
- partitionReq.PartitionMaxBytes = 1024 ;
451
+ partitionReq.PartitionMaxBytes = 1_MB;
452
+ topicReq.Partitions .push_back (partitionReq);
453
+ }
454
+ request.Topics .push_back (topicReq);
455
+ }
456
+
457
+ return WriteAndRead<TFetchResponseData>(header, request);
458
+ }
459
+
460
+ TMessagePtr<TFetchResponseData> TKafkaTestClient::Fetch (const std::vector<std::pair<TKafkaUuid, std::vector<i32 >>>& topics, i64 offset) {
461
+ Cerr << " >>>>> TFetchRequestData\n " ;
462
+
463
+ TRequestHeaderData header = Header (NKafka::EApiKey::FETCH, 13 );
464
+
465
+ TFetchRequestData request;
466
+ request.MaxWaitMs = 1000 ;
467
+ request.MinBytes = 1 ;
468
+ request.ReplicaId = -1 ;
469
+
470
+ for (auto & topic: topics) {
471
+ NKafka::TFetchRequestData::TFetchTopic topicReq {};
472
+ topicReq.TopicId = topic.first ;
473
+ for (auto & partition: topic.second ) {
474
+ NKafka::TFetchRequestData::TFetchTopic::TFetchPartition partitionReq {};
475
+ partitionReq.FetchOffset = offset;
476
+ partitionReq.Partition = partition;
477
+ partitionReq.PartitionMaxBytes = 1_MB;
441
478
topicReq.Partitions .push_back (partitionReq);
442
479
}
443
480
request.Topics .push_back (topicReq);
@@ -457,6 +494,7 @@ TMessagePtr<TCreateTopicsResponseData> TKafkaTestClient::CreateTopics(std::vecto
457
494
NKafka::TCreateTopicsRequestData::TCreatableTopic topic;
458
495
topic.Name = topicToCreate.Name ;
459
496
topic.NumPartitions = topicToCreate.PartitionsNumber ;
497
+ topic.ReplicationFactor = topicToCreate.ReplicationFactor ;
460
498
461
499
auto addConfig = [&topic](std::optional<TString> configValue, TString configName) {
462
500
if (configValue.has_value ()) {
@@ -672,31 +710,35 @@ ui32 TKafkaTestClient::NextCorrelation() {
672
710
}
673
711
674
712
template <std::derived_from<TApiMessage> T>
675
- TMessagePtr<T> TKafkaTestClient::WriteAndRead (TRequestHeaderData& header, TApiMessage& request) {
676
- Write (So, &header, &request);
713
+ TMessagePtr<T> TKafkaTestClient::WriteAndRead (TRequestHeaderData& header, TApiMessage& request, bool silent ) {
714
+ Write (So, &header, &request, silent );
677
715
return Read<T>(Si, &header);
678
716
}
679
717
680
- void TKafkaTestClient::Write (TSocketOutput& so, TApiMessage* request, TKafkaVersion version) {
718
+ void TKafkaTestClient::Write (TSocketOutput& so, TApiMessage* request, TKafkaVersion version, bool silent ) {
681
719
TWritableBuf sb (nullptr , request->Size (version) + 1000 );
682
720
TKafkaWritable writable (sb);
683
721
request->Write (writable, version);
684
722
so.Write (sb.Data (), sb.Size ());
685
723
686
- Print (sb.GetBuffer ());
724
+ if (!silent) {
725
+ Print (sb.GetBuffer ());
726
+ }
687
727
}
688
728
689
- void TKafkaTestClient::Write (TSocketOutput& so, TRequestHeaderData* header, TApiMessage* request) {
729
+ void TKafkaTestClient::Write (TSocketOutput& so, TRequestHeaderData* header, TApiMessage* request, bool silent ) {
690
730
TKafkaVersion version = header->RequestApiVersion ;
691
731
TKafkaVersion headerVersion = RequestHeaderVersion (request->ApiKey (), version);
692
732
693
733
TKafkaInt32 size = header->Size (headerVersion) + request->Size (version);
694
- Cerr << " >>>>> Size=" << size << Endl;
734
+ if (!silent) {
735
+ Cerr << " >>>>> Size=" << size << Endl;
736
+ }
695
737
NKafka::NormalizeNumber (size);
696
738
so.Write (&size, sizeof (size));
697
739
698
- Write (so, header, headerVersion);
699
- Write (so, request, version);
740
+ Write (so, header, headerVersion, silent );
741
+ Write (so, request, version, silent );
700
742
701
743
so.Flush ();
702
744
}
0 commit comments