rdkafka 0.28.0-aarch64-linux-gnu → 0.29.1-aarch64-linux-gnu

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/README.md +3 -2
  4. data/bin/verify_kafka_warnings +5 -0
  5. data/docker-compose-ssl.yml +4 -1
  6. data/docker-compose.yml +4 -1
  7. data/ext/librdkafka.so +0 -0
  8. data/lib/rdkafka/abstract_handle.rb +31 -2
  9. data/lib/rdkafka/admin/config_binding_result.rb +2 -2
  10. data/lib/rdkafka/admin/create_acl_handle.rb +6 -5
  11. data/lib/rdkafka/admin/create_acl_report.rb +2 -1
  12. data/lib/rdkafka/admin/create_partitions_handle.rb +4 -6
  13. data/lib/rdkafka/admin/create_topic_handle.rb +4 -6
  14. data/lib/rdkafka/admin/delete_acl_handle.rb +5 -7
  15. data/lib/rdkafka/admin/delete_groups_handle.rb +4 -6
  16. data/lib/rdkafka/admin/delete_records_handle.rb +31 -0
  17. data/lib/rdkafka/admin/delete_records_report.rb +25 -0
  18. data/lib/rdkafka/admin/delete_topic_handle.rb +4 -6
  19. data/lib/rdkafka/admin/describe_acl_handle.rb +5 -7
  20. data/lib/rdkafka/admin/describe_acl_report.rb +2 -1
  21. data/lib/rdkafka/admin/describe_configs_handle.rb +4 -10
  22. data/lib/rdkafka/admin/describe_configs_report.rb +1 -5
  23. data/lib/rdkafka/admin/incremental_alter_configs_handle.rb +4 -10
  24. data/lib/rdkafka/admin/incremental_alter_configs_report.rb +1 -5
  25. data/lib/rdkafka/admin/list_consumer_groups_handle.rb +31 -0
  26. data/lib/rdkafka/admin/list_consumer_groups_report.rb +83 -0
  27. data/lib/rdkafka/admin/list_offsets_handle.rb +5 -10
  28. data/lib/rdkafka/admin/list_offsets_report.rb +5 -2
  29. data/lib/rdkafka/admin.rb +238 -145
  30. data/lib/rdkafka/bindings.rb +61 -16
  31. data/lib/rdkafka/callbacks/base_handler.rb +62 -0
  32. data/lib/rdkafka/callbacks/create_acl_handler.rb +37 -0
  33. data/lib/rdkafka/callbacks/create_partitions_handler.rb +37 -0
  34. data/lib/rdkafka/callbacks/create_topic_handler.rb +37 -0
  35. data/lib/rdkafka/callbacks/delete_acl_handler.rb +42 -0
  36. data/lib/rdkafka/callbacks/delete_groups_handler.rb +37 -0
  37. data/lib/rdkafka/callbacks/delete_records_handler.rb +38 -0
  38. data/lib/rdkafka/callbacks/delete_topic_handler.rb +37 -0
  39. data/lib/rdkafka/callbacks/describe_acl_handler.rb +35 -0
  40. data/lib/rdkafka/callbacks/describe_configs_handler.rb +42 -0
  41. data/lib/rdkafka/callbacks/incremental_alter_configs_handler.rb +42 -0
  42. data/lib/rdkafka/callbacks/list_consumer_groups_handler.rb +39 -0
  43. data/lib/rdkafka/callbacks/list_offsets_handler.rb +42 -0
  44. data/lib/rdkafka/callbacks.rb +54 -246
  45. data/lib/rdkafka/config.rb +69 -50
  46. data/lib/rdkafka/consumer/headers.rb +19 -5
  47. data/lib/rdkafka/consumer/partition.rb +8 -1
  48. data/lib/rdkafka/consumer/topic_partition_list.rb +58 -30
  49. data/lib/rdkafka/consumer.rb +211 -52
  50. data/lib/rdkafka/defaults.rb +24 -7
  51. data/lib/rdkafka/helpers/list_offsets.rb +127 -0
  52. data/lib/rdkafka/helpers/metadata.rb +29 -0
  53. data/lib/rdkafka/helpers/oauth.rb +10 -5
  54. data/lib/rdkafka/metadata.rb +86 -19
  55. data/lib/rdkafka/native_kafka.rb +22 -11
  56. data/lib/rdkafka/producer/delivery_handle.rb +4 -5
  57. data/lib/rdkafka/producer/partitions_count_cache.rb +24 -38
  58. data/lib/rdkafka/producer.rb +81 -61
  59. data/lib/rdkafka/version.rb +3 -3
  60. data/lib/rdkafka.rb +19 -0
  61. data/package-lock.json +3 -3
  62. data/rdkafka.gemspec +1 -0
  63. metadata +21 -5
  64. data/Gemfile +0 -13
  65. data/Gemfile.lint +0 -14
  66. data/Gemfile.lint.lock +0 -123
@@ -58,6 +58,7 @@ module Rdkafka
58
58
  end
59
59
  end
60
60
 
61
+ RD_KAFKA_RESP_ERR__TIMED_OUT = -185
61
62
  RD_KAFKA_RESP_ERR__ASSIGN_PARTITIONS = -175
62
63
  RD_KAFKA_RESP_ERR__REVOKE_PARTITIONS = -174
63
64
  RD_KAFKA_RESP_ERR__STATE = -172
@@ -81,7 +82,7 @@ module Rdkafka
81
82
 
82
83
  # This function comes from our patch on top of librdkafka. It allows os to load all the
83
84
  # librdkafka components without initializing the client
84
- # @see https://github.com/confluentinc/librdkafka/issues/4590
85
+ # See: https://github.com/confluentinc/librdkafka/issues/4590
85
86
  attach_function :rd_kafka_global_init, [], :void
86
87
 
87
88
  # Polling
@@ -99,8 +100,9 @@ module Rdkafka
99
100
  # Metadata
100
101
 
101
102
  attach_function :rd_kafka_name, [:pointer], :string
102
- attach_function :rd_kafka_memberid, [:pointer], :string, blocking: true
103
- attach_function :rd_kafka_clusterid, [:pointer], :string, blocking: true
103
+ attach_function :rd_kafka_memberid, [:pointer], :pointer, blocking: true
104
+ attach_function :rd_kafka_clusterid, [:pointer, :int], :pointer, blocking: true
105
+ attach_function :rd_kafka_mem_free, [:pointer, :pointer], :void
104
106
  attach_function :rd_kafka_metadata, [:pointer, :int, :pointer, :pointer, :int], :int, blocking: true
105
107
  attach_function :rd_kafka_metadata_destroy, [:pointer], :void, blocking: true
106
108
 
@@ -234,6 +236,8 @@ module Rdkafka
234
236
 
235
237
  attach_function :rd_kafka_conf_new, [], :pointer
236
238
  attach_function :rd_kafka_conf_set, [:pointer, :string, :string, :pointer, :int], :kafka_config_response
239
+ attach_function :rd_kafka_conf_get, [:pointer, :string, :pointer, :pointer], :kafka_config_response
240
+ attach_function :rd_kafka_conf, [:pointer], :pointer
237
241
  attach_function :rd_kafka_conf_dump, [:pointer, :pointer], :pointer
238
242
  attach_function :rd_kafka_conf_dump_free, [:pointer, :size_t], :void
239
243
  attach_function :rd_kafka_conf_destroy, [:pointer], :void
@@ -256,13 +260,15 @@ module Rdkafka
256
260
 
257
261
  # Queue IO Event Support - for fiber scheduler integration
258
262
  # Enables notifications to a custom FD when queue transitions from empty to non-empty
259
- # @param queue rd_kafka_queue_t* - the queue to monitor
260
- # @param fd int - file descriptor to write to (provide your own pipe/eventfd)
261
- # @param payload const void* - data to write to fd
262
- # @param size size_t - size of payload
263
+ # Arguments:
264
+ # - queue (rd_kafka_queue_t*) - the queue to monitor
265
+ # - fd (int) - file descriptor to write to (provide your own pipe/eventfd)
266
+ # - payload (const void*) - data to write to fd
267
+ # - size (size_t) - size of payload
263
268
  attach_function :rd_kafka_queue_io_event_enable, [:pointer, :int, :pointer, :size_t], :void
264
269
  # Per topic configs
265
270
  attach_function :rd_kafka_topic_conf_new, [], :pointer
271
+ attach_function :rd_kafka_topic_conf_destroy, [:pointer], :void
266
272
  attach_function :rd_kafka_topic_conf_set, [:pointer, :string, :string, :pointer, :int], :kafka_config_response
267
273
 
268
274
  LogCallback = FFI::Function.new(
@@ -333,9 +339,10 @@ module Rdkafka
333
339
  end
334
340
  end
335
341
 
336
- # The OAuth callback is currently global and contextless.
337
- # This means that the callback will be called for all instances, and the callback must be able to determine to which instance it is associated.
338
- # The instance name will be provided in the callback, allowing the callback to reference the correct instance.
342
+ # The OAuth callback is currently global and contextless. This means that the callback will be
343
+ # called for all instances, and the callback must be able to determine to which instance it is
344
+ # associated. The instance name will be provided in the callback, allowing the callback to
345
+ # reference the correct instance.
339
346
  #
340
347
  # An example of how to use the instance name in the callback is given below.
341
348
  # The `refresh_token` is configured as the `oauthbearer_token_refresh_callback`.
@@ -354,7 +361,9 @@ module Rdkafka
354
361
  OAuthbearerTokenRefreshCallback = FFI::Function.new(
355
362
  :void, [:pointer, :string, :pointer]
356
363
  ) do |client_ptr, config, _opaque|
357
- Rdkafka::Config.oauthbearer_token_refresh_callback&.call(config, Rdkafka::Bindings.rd_kafka_name(client_ptr))
364
+ if Rdkafka::Config.oauthbearer_token_refresh_callback && !client_ptr.null?
365
+ Rdkafka::Config.oauthbearer_token_refresh_callback.call(config, Rdkafka::Bindings.rd_kafka_name(client_ptr))
366
+ end
358
367
  end
359
368
 
360
369
  # Handle
@@ -444,7 +453,7 @@ module Rdkafka
444
453
 
445
454
  # Stats
446
455
 
447
- attach_function :rd_kafka_query_watermark_offsets, [:pointer, :string, :int, :pointer, :pointer, :int], :int
456
+ attach_function :rd_kafka_query_watermark_offsets, [:pointer, :string, :int, :pointer, :pointer, :int], :int, blocking: true
448
457
 
449
458
  # Producer
450
459
  RD_KAFKA_VTYPE_END = 0
@@ -537,6 +546,37 @@ module Rdkafka
537
546
  attach_function :rd_kafka_event_DeleteGroups_result, [:pointer], :pointer, blocking: true # rd_kafka_event_t* => rd_kafka_DeleteGroups_result_t*
538
547
  attach_function :rd_kafka_DeleteGroups_result_groups, [:pointer, :pointer], :pointer, blocking: true # rd_kafka_DeleteGroups_result_t*, size_t* => rd_kafka_group_result_t**
539
548
 
549
+ # Delete Records
550
+ RD_KAFKA_ADMIN_OP_DELETERECORDS = 6 # rd_kafka_admin_op_t
551
+ RD_KAFKA_EVENT_DELETERECORDS_RESULT = 105 # rd_kafka_event_type_t
552
+
553
+ attach_function :rd_kafka_DeleteRecords, [:pointer, :pointer, :size_t, :pointer, :pointer], :void, blocking: true
554
+ attach_function :rd_kafka_DeleteRecords_new, [:pointer], :pointer, blocking: true
555
+ attach_function :rd_kafka_DeleteRecords_destroy, [:pointer], :void, blocking: true
556
+ attach_function :rd_kafka_event_DeleteRecords_result, [:pointer], :pointer, blocking: true # rd_kafka_event_t* => rd_kafka_DeleteRecords_result_t*
557
+ attach_function :rd_kafka_DeleteRecords_result_offsets, [:pointer], :pointer, blocking: true # rd_kafka_DeleteRecords_result_t* => rd_kafka_topic_partition_list_t*
558
+
559
+ # List Consumer Groups
560
+ RD_KAFKA_ADMIN_OP_LISTCONSUMERGROUPS = 12 # rd_kafka_admin_op_t
561
+ RD_KAFKA_EVENT_LISTCONSUMERGROUPS_RESULT = 0x2000 # rd_kafka_event_type_t
562
+
563
+ # Consumer group states (rd_kafka_consumer_group_state_t)
564
+ RD_KAFKA_CONSUMER_GROUP_STATE_UNKNOWN = 0
565
+ RD_KAFKA_CONSUMER_GROUP_STATE_PREPARING_REBALANCE = 1
566
+ RD_KAFKA_CONSUMER_GROUP_STATE_COMPLETING_REBALANCE = 2
567
+ RD_KAFKA_CONSUMER_GROUP_STATE_STABLE = 3
568
+ RD_KAFKA_CONSUMER_GROUP_STATE_DEAD = 4
569
+ RD_KAFKA_CONSUMER_GROUP_STATE_EMPTY = 5
570
+
571
+ attach_function :rd_kafka_ListConsumerGroups, [:pointer, :pointer, :pointer], :void, blocking: true
572
+ attach_function :rd_kafka_event_ListConsumerGroups_result, [:pointer], :pointer, blocking: true # rd_kafka_event_t* => rd_kafka_ListConsumerGroups_result_t*
573
+ attach_function :rd_kafka_ListConsumerGroups_result_valid, [:pointer, :pointer], :pointer, blocking: true # result*, size_t* => rd_kafka_ConsumerGroupListing_t**
574
+ attach_function :rd_kafka_ListConsumerGroups_result_errors, [:pointer, :pointer], :pointer, blocking: true # result*, size_t* => rd_kafka_error_t**
575
+ attach_function :rd_kafka_ConsumerGroupListing_group_id, [:pointer], :pointer, blocking: true # => const char*
576
+ attach_function :rd_kafka_ConsumerGroupListing_is_simple_consumer_group, [:pointer], :int, blocking: true
577
+ attach_function :rd_kafka_ConsumerGroupListing_state, [:pointer], :int, blocking: true
578
+ attach_function :rd_kafka_consumer_group_state_name, [:int], :pointer, blocking: true # => const char*
579
+
540
580
  # Background Queue and Callback
541
581
 
542
582
  attach_function :rd_kafka_conf_set_background_event_cb, [:pointer, :pointer], :void
@@ -552,6 +592,7 @@ module Rdkafka
552
592
 
553
593
  attach_function :rd_kafka_event_type, [:pointer], :int32
554
594
  attach_function :rd_kafka_event_opaque, [:pointer], :pointer
595
+ attach_function :rd_kafka_event_destroy, [:pointer], :void
555
596
 
556
597
  # Extracting data from topic results
557
598
 
@@ -598,21 +639,24 @@ module Rdkafka
598
639
  attach_function :rd_kafka_AclBindingFilter_new, [:int32, :pointer, :int32, :pointer, :pointer, :int32, :int32, :pointer, :size_t], :pointer
599
640
  attach_function :rd_kafka_AclBinding_destroy, [:pointer], :void
600
641
 
601
- # rd_kafka_ResourceType_t - https://github.com/confluentinc/librdkafka/blob/292d2a66b9921b783f08147807992e603c7af059/src/rdkafka.h#L7307
642
+ # rd_kafka_ResourceType_t -
643
+ # https://github.com/confluentinc/librdkafka/blob/292d2a66b992/src/rdkafka.h#L7307
602
644
  RD_KAFKA_RESOURCE_ANY = 1
603
645
  RD_KAFKA_RESOURCE_TOPIC = 2
604
646
  RD_KAFKA_RESOURCE_GROUP = 3
605
647
  RD_KAFKA_RESOURCE_BROKER = 4
606
648
  RD_KAFKA_RESOURCE_TRANSACTIONAL_ID = 5
607
649
 
608
- # rd_kafka_ResourcePatternType_t - https://github.com/confluentinc/librdkafka/blob/292d2a66b9921b783f08147807992e603c7af059/src/rdkafka.h#L7320
650
+ # rd_kafka_ResourcePatternType_t -
651
+ # https://github.com/confluentinc/librdkafka/blob/292d2a66b992/src/rdkafka.h#L7320
609
652
  RD_KAFKA_RESOURCE_PATTERN_UNKNOWN = 0
610
653
  RD_KAFKA_RESOURCE_PATTERN_ANY = 1
611
654
  RD_KAFKA_RESOURCE_PATTERN_MATCH = 2
612
655
  RD_KAFKA_RESOURCE_PATTERN_LITERAL = 3
613
656
  RD_KAFKA_RESOURCE_PATTERN_PREFIXED = 4
614
657
 
615
- # rd_kafka_AclOperation_t - https://github.com/confluentinc/librdkafka/blob/292d2a66b9921b783f08147807992e603c7af059/src/rdkafka.h#L8403
658
+ # rd_kafka_AclOperation_t -
659
+ # https://github.com/confluentinc/librdkafka/blob/292d2a66b992/src/rdkafka.h#L8403
616
660
  RD_KAFKA_ACL_OPERATION_ANY = 1
617
661
  RD_KAFKA_ACL_OPERATION_ALL = 2
618
662
  RD_KAFKA_ACL_OPERATION_READ = 3
@@ -626,7 +670,8 @@ module Rdkafka
626
670
  RD_KAFKA_ACL_OPERATION_ALTER_CONFIGS = 11
627
671
  RD_KAFKA_ACL_OPERATION_IDEMPOTENT_WRITE = 12
628
672
 
629
- # rd_kafka_AclPermissionType_t - https://github.com/confluentinc/librdkafka/blob/292d2a66b9921b783f08147807992e603c7af059/src/rdkafka.h#L8435
673
+ # rd_kafka_AclPermissionType_t -
674
+ # https://github.com/confluentinc/librdkafka/blob/292d2a66b992/src/rdkafka.h#L8435
630
675
  RD_KAFKA_ACL_PERMISSION_TYPE_ANY = 1
631
676
  RD_KAFKA_ACL_PERMISSION_TYPE_DENY = 2
632
677
  RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW = 3
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Base class for admin background-event result handlers.
6
+ #
7
+ # Each subclass handles one librdkafka admin result event type: it extracts the result from
8
+ # the event, looks up the matching {AbstractHandle} in the registry and resolves it (sets the
9
+ # response, builds the report, copies the broker message, then unlocks it).
10
+ #
11
+ # The event is owned by the application and destroyed by {BackgroundEventCallback} right after
12
+ # dispatch, so handlers must copy everything they need out of event-owned memory into Ruby
13
+ # objects before returning.
14
+ #
15
+ # @private
16
+ class BaseHandler
17
+ class << self
18
+ # Processes a background event for the operation this handler is responsible for.
19
+ # @param event_ptr [FFI::Pointer] pointer to the event
20
+ # @return [void]
21
+ def call(event_ptr)
22
+ raise NotImplementedError, "#{name} must implement .call"
23
+ end
24
+
25
+ private
26
+
27
+ # Copies an event-owned C string into a Ruby string
28
+ # @param ptr [FFI::Pointer] pointer to the C string
29
+ # @return [String, nil] copied string or nil when NULL
30
+ def read_event_string(ptr)
31
+ ptr.null? ? nil : ptr.read_string
32
+ end
33
+
34
+ # Resolves a handle directly from an operation-level event error and unlocks it.
35
+ #
36
+ # librdkafka signals a failure of the whole admin operation (e.g. `_TIMED_OUT` when the
37
+ # brokers are unreachable, or `_DESTROY` when the client is closed with the request in
38
+ # flight) by setting the event error and delivering an *empty* results array. The
39
+ # per-element result handlers must not index into that empty array; they call this first
40
+ # and skip results parsing when it returns true. Without this, indexing `results[0]`
41
+ # raises inside the FFI callback, the handle is never unlocked, and the caller's `wait`
42
+ # blocks until its own timeout and raises `WaitTimeoutError`, losing the real error code.
43
+ #
44
+ # @param event_ptr [FFI::Pointer] pointer to the event
45
+ # @param handle [Rdkafka::AbstractHandle] the handle to resolve
46
+ # @return [Boolean] true when the event carried an operation-level error and the handle
47
+ # was resolved here
48
+ def resolve_operation_error(event_ptr, handle)
49
+ error_code = Rdkafka::Bindings.rd_kafka_event_error(event_ptr)
50
+
51
+ return false if error_code == Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
52
+
53
+ handle[:response] = error_code
54
+ handle.broker_message = read_event_string(Rdkafka::Bindings.rd_kafka_event_error_string(event_ptr))
55
+ handle.unlock
56
+
57
+ true
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_EVENT_CREATEACLS_RESULT` events
6
+ # @private
7
+ class CreateAclHandler < BaseHandler
8
+ class << self
9
+ # Resolves the create-ACL handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ create_acls_result = Rdkafka::Bindings.rd_kafka_event_CreateAcls_result(event_ptr)
14
+
15
+ # Get the number of acl results
16
+ pointer_to_size_t = FFI::MemoryPointer.new(:size_t)
17
+ create_acl_result_array = Rdkafka::Bindings.rd_kafka_CreateAcls_result_acls(create_acls_result, pointer_to_size_t)
18
+ create_acl_results = CreateAclResult.create_acl_results_from_array(pointer_to_size_t.read_int, create_acl_result_array)
19
+ create_acl_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
20
+
21
+ if create_acl_handle = Rdkafka::Admin::CreateAclHandle.remove(create_acl_handle_ptr.address)
22
+ unless resolve_operation_error(event_ptr, create_acl_handle)
23
+ create_acl_handle[:response] = create_acl_results[0].result_error
24
+ create_acl_handle.result = Rdkafka::Admin::CreateAclReport.new(
25
+ rdkafka_response: create_acl_results[0].result_error,
26
+ rdkafka_response_string: create_acl_results[0].error_string
27
+ )
28
+ create_acl_handle.broker_message = create_acl_handle.result.rdkafka_response_string
29
+
30
+ create_acl_handle.unlock
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_ADMIN_OP_CREATEPARTITIONS_RESULT` events
6
+ # @private
7
+ class CreatePartitionsHandler < BaseHandler
8
+ class << self
9
+ # Resolves the create-partitions handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ create_partitionss_result = Rdkafka::Bindings.rd_kafka_event_CreatePartitions_result(event_ptr)
14
+
15
+ # Get the number of create topic results
16
+ pointer_to_size_t = FFI::MemoryPointer.new(:size_t)
17
+ create_partitions_result_array = Rdkafka::Bindings.rd_kafka_CreatePartitions_result_topics(create_partitionss_result, pointer_to_size_t)
18
+ create_partitions_results = TopicResult.create_topic_results_from_array(pointer_to_size_t.read_int, create_partitions_result_array)
19
+ create_partitions_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
20
+
21
+ if create_partitions_handle = Rdkafka::Admin::CreatePartitionsHandle.remove(create_partitions_handle_ptr.address)
22
+ unless resolve_operation_error(event_ptr, create_partitions_handle)
23
+ create_partitions_handle[:response] = create_partitions_results[0].result_error
24
+ create_partitions_handle.result = Rdkafka::Admin::CreatePartitionsReport.new(
25
+ create_partitions_results[0].error_string,
26
+ create_partitions_results[0].result_name
27
+ )
28
+ create_partitions_handle.broker_message = create_partitions_handle.result.error_string
29
+
30
+ create_partitions_handle.unlock
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_EVENT_CREATETOPICS_RESULT` events
6
+ # @private
7
+ class CreateTopicHandler < BaseHandler
8
+ class << self
9
+ # Resolves the create-topic handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ create_topics_result = Rdkafka::Bindings.rd_kafka_event_CreateTopics_result(event_ptr)
14
+
15
+ # Get the number of create topic results
16
+ pointer_to_size_t = FFI::MemoryPointer.new(:size_t)
17
+ create_topic_result_array = Rdkafka::Bindings.rd_kafka_CreateTopics_result_topics(create_topics_result, pointer_to_size_t)
18
+ create_topic_results = TopicResult.create_topic_results_from_array(pointer_to_size_t.read_int, create_topic_result_array)
19
+ create_topic_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
20
+
21
+ if create_topic_handle = Rdkafka::Admin::CreateTopicHandle.remove(create_topic_handle_ptr.address)
22
+ unless resolve_operation_error(event_ptr, create_topic_handle)
23
+ create_topic_handle[:response] = create_topic_results[0].result_error
24
+ create_topic_handle.result = Rdkafka::Admin::CreateTopicReport.new(
25
+ create_topic_results[0].error_string,
26
+ create_topic_results[0].result_name
27
+ )
28
+ create_topic_handle.broker_message = create_topic_handle.result.error_string
29
+
30
+ create_topic_handle.unlock
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_EVENT_DELETEACLS_RESULT` events
6
+ # @private
7
+ class DeleteAclHandler < BaseHandler
8
+ class << self
9
+ # Resolves the delete-ACL handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ delete_acls_result = Rdkafka::Bindings.rd_kafka_event_DeleteAcls_result(event_ptr)
14
+
15
+ # Get the number of acl results
16
+ pointer_to_size_t = FFI::MemoryPointer.new(:size_t)
17
+ delete_acl_result_responses = Rdkafka::Bindings.rd_kafka_DeleteAcls_result_responses(delete_acls_result, pointer_to_size_t)
18
+ delete_acl_results = DeleteAclResult.delete_acl_results_from_array(pointer_to_size_t.read_int, delete_acl_result_responses)
19
+ delete_acl_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
20
+
21
+ if delete_acl_handle = Rdkafka::Admin::DeleteAclHandle.remove(delete_acl_handle_ptr.address)
22
+ unless resolve_operation_error(event_ptr, delete_acl_handle)
23
+ delete_acl_handle[:response] = delete_acl_results[0].result_error
24
+ delete_acl_handle.broker_message = read_event_string(delete_acl_results[0].error_string)
25
+
26
+ delete_acl_handle.result = if delete_acl_results[0].result_error == Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
27
+ Rdkafka::Admin::DeleteAclReport.new(
28
+ matching_acls: delete_acl_results[0].matching_acls,
29
+ matching_acls_count: delete_acl_results[0].matching_acls_count
30
+ )
31
+ else
32
+ Rdkafka::Admin::DeleteAclReport.new(matching_acls: FFI::Pointer::NULL, matching_acls_count: 0)
33
+ end
34
+
35
+ delete_acl_handle.unlock
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_EVENT_DELETEGROUPS_RESULT` events
6
+ # @private
7
+ class DeleteGroupsHandler < BaseHandler
8
+ class << self
9
+ # Resolves the delete-groups handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ delete_groups_result = Rdkafka::Bindings.rd_kafka_event_DeleteGroups_result(event_ptr)
14
+
15
+ # Get the number of delete group results
16
+ pointer_to_size_t = FFI::MemoryPointer.new(:size_t)
17
+ delete_group_result_array = Rdkafka::Bindings.rd_kafka_DeleteGroups_result_groups(delete_groups_result, pointer_to_size_t)
18
+ delete_group_results = GroupResult.create_group_results_from_array(pointer_to_size_t.read_int, delete_group_result_array)
19
+ delete_group_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
20
+
21
+ if (delete_group_handle = Rdkafka::Admin::DeleteGroupsHandle.remove(delete_group_handle_ptr.address))
22
+ unless resolve_operation_error(event_ptr, delete_group_handle)
23
+ delete_group_handle[:response] = delete_group_results[0].result_error
24
+ delete_group_handle.result = Rdkafka::Admin::DeleteGroupsReport.new(
25
+ delete_group_results[0].error_string,
26
+ delete_group_results[0].result_name
27
+ )
28
+ delete_group_handle.broker_message = delete_group_handle.result.error_string
29
+
30
+ delete_group_handle.unlock
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_EVENT_DELETERECORDS_RESULT` events
6
+ # @private
7
+ class DeleteRecordsHandler < BaseHandler
8
+ class << self
9
+ # Resolves the delete-records handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ result_ptr = Rdkafka::Bindings.rd_kafka_event_DeleteRecords_result(event_ptr)
14
+ handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
15
+
16
+ return unless (handle = Rdkafka::Admin::DeleteRecordsHandle.remove(handle_ptr.address))
17
+
18
+ # An operation-level error (e.g. timeout or a closed client) is delivered on the event
19
+ # itself, with no per-partition result to parse.
20
+ return if resolve_operation_error(event_ptr, handle)
21
+
22
+ handle[:response] = Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
23
+
24
+ # Parsing must copy everything out of event-owned memory before the event is destroyed.
25
+ # An exception here is captured and re-raised on the waiting thread, since it cannot
26
+ # unwind through librdkafka native frames.
27
+ handle.result = begin
28
+ Rdkafka::Admin::DeleteRecordsReport.new(result_ptr)
29
+ rescue => e
30
+ e
31
+ end
32
+
33
+ handle.unlock
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_EVENT_DELETETOPICS_RESULT` events
6
+ # @private
7
+ class DeleteTopicHandler < BaseHandler
8
+ class << self
9
+ # Resolves the delete-topic handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ delete_topics_result = Rdkafka::Bindings.rd_kafka_event_DeleteTopics_result(event_ptr)
14
+
15
+ # Get the number of topic results
16
+ pointer_to_size_t = FFI::MemoryPointer.new(:size_t)
17
+ delete_topic_result_array = Rdkafka::Bindings.rd_kafka_DeleteTopics_result_topics(delete_topics_result, pointer_to_size_t)
18
+ delete_topic_results = TopicResult.create_topic_results_from_array(pointer_to_size_t.read_int, delete_topic_result_array)
19
+ delete_topic_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
20
+
21
+ if delete_topic_handle = Rdkafka::Admin::DeleteTopicHandle.remove(delete_topic_handle_ptr.address)
22
+ unless resolve_operation_error(event_ptr, delete_topic_handle)
23
+ delete_topic_handle[:response] = delete_topic_results[0].result_error
24
+ delete_topic_handle.result = Rdkafka::Admin::DeleteTopicReport.new(
25
+ delete_topic_results[0].error_string,
26
+ delete_topic_results[0].result_name
27
+ )
28
+ delete_topic_handle.broker_message = delete_topic_handle.result.error_string
29
+
30
+ delete_topic_handle.unlock
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_EVENT_DESCRIBEACLS_RESULT` events
6
+ # @private
7
+ class DescribeAclHandler < BaseHandler
8
+ class << self
9
+ # Resolves the describe-ACL handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ describe_acl = DescribeAclResult.new(event_ptr)
14
+ describe_acl_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
15
+
16
+ if describe_acl_handle = Rdkafka::Admin::DescribeAclHandle.remove(describe_acl_handle_ptr.address)
17
+ describe_acl_handle[:response] = describe_acl.result_error
18
+ describe_acl_handle.broker_message = read_event_string(describe_acl.error_string)
19
+
20
+ describe_acl_handle.result = if describe_acl.result_error == Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
21
+ Rdkafka::Admin::DescribeAclReport.new(
22
+ acls: describe_acl.matching_acls,
23
+ acls_count: describe_acl.matching_acls_count
24
+ )
25
+ else
26
+ Rdkafka::Admin::DescribeAclReport.new(acls: FFI::Pointer::NULL, acls_count: 0)
27
+ end
28
+
29
+ describe_acl_handle.unlock
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_EVENT_DESCRIBECONFIGS_RESULT` events
6
+ # @private
7
+ class DescribeConfigsHandler < BaseHandler
8
+ class << self
9
+ # Resolves the describe-configs handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ describe_configs = DescribeConfigsResult.new(event_ptr)
14
+ describe_configs_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
15
+
16
+ if describe_configs_handle = Rdkafka::Admin::DescribeConfigsHandle.remove(describe_configs_handle_ptr.address)
17
+ describe_configs_handle[:response] = describe_configs.result_error
18
+ describe_configs_handle.broker_message = read_event_string(describe_configs.error_string)
19
+
20
+ # Parsing can raise on per-resource errors. The exception is captured and re-raised on
21
+ # the waiting thread, since an exception leaving this callback would unwind through
22
+ # librdkafka native frames.
23
+ describe_configs_handle.result = begin
24
+ if describe_configs.result_error == Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
25
+ Rdkafka::Admin::DescribeConfigsReport.new(
26
+ config_entries: describe_configs.results,
27
+ entry_count: describe_configs.results_count
28
+ )
29
+ else
30
+ Rdkafka::Admin::DescribeConfigsReport.new(config_entries: FFI::Pointer::NULL, entry_count: 0)
31
+ end
32
+ rescue => e
33
+ e
34
+ end
35
+
36
+ describe_configs_handle.unlock
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_EVENT_INCREMENTALALTERCONFIGS_RESULT` events
6
+ # @private
7
+ class IncrementalAlterConfigsHandler < BaseHandler
8
+ class << self
9
+ # Resolves the incremental-alter-configs handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ incremental_alter = IncrementalAlterConfigsResult.new(event_ptr)
14
+ incremental_alter_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
15
+
16
+ if incremental_alter_handle = Rdkafka::Admin::IncrementalAlterConfigsHandle.remove(incremental_alter_handle_ptr.address)
17
+ incremental_alter_handle[:response] = incremental_alter.result_error
18
+ incremental_alter_handle.broker_message = read_event_string(incremental_alter.error_string)
19
+
20
+ # Parsing can raise on per-resource errors. The exception is captured and re-raised on
21
+ # the waiting thread, since an exception leaving this callback would unwind through
22
+ # librdkafka native frames.
23
+ incremental_alter_handle.result = begin
24
+ if incremental_alter.result_error == Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
25
+ Rdkafka::Admin::IncrementalAlterConfigsReport.new(
26
+ config_entries: incremental_alter.results,
27
+ entry_count: incremental_alter.results_count
28
+ )
29
+ else
30
+ Rdkafka::Admin::IncrementalAlterConfigsReport.new(config_entries: FFI::Pointer::NULL, entry_count: 0)
31
+ end
32
+ rescue => e
33
+ e
34
+ end
35
+
36
+ incremental_alter_handle.unlock
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Handles `RD_KAFKA_EVENT_LISTCONSUMERGROUPS_RESULT` events
6
+ # @private
7
+ class ListConsumerGroupsHandler < BaseHandler
8
+ class << self
9
+ # Resolves the list-consumer-groups handle from its result event
10
+ # @param event_ptr [FFI::Pointer] pointer to the event
11
+ # @return [void]
12
+ def call(event_ptr)
13
+ result_ptr = Rdkafka::Bindings.rd_kafka_event_ListConsumerGroups_result(event_ptr)
14
+ handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
15
+
16
+ return unless (handle = Rdkafka::Admin::ListConsumerGroupsHandle.remove(handle_ptr.address))
17
+
18
+ # An operation-level error (e.g. timeout or a closed client) is delivered on the event
19
+ # itself; per the source feature's all-or-nothing contract we surface it as the result
20
+ # rather than returning a partial listing.
21
+ return if resolve_operation_error(event_ptr, handle)
22
+
23
+ handle[:response] = Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
24
+
25
+ # Parsing must copy everything out of event-owned memory before the event is destroyed.
26
+ # An exception here is captured and re-raised on the waiting thread, since it cannot
27
+ # unwind through librdkafka native frames.
28
+ handle.result = begin
29
+ Rdkafka::Admin::ListConsumerGroupsReport.new(result_ptr)
30
+ rescue => e
31
+ e
32
+ end
33
+
34
+ handle.unlock
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end