karafka-rdkafka 0.20.0.rc3-arm64-darwin

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 (100) hide show
  1. checksums.yaml +7 -0
  2. data/.github/CODEOWNERS +3 -0
  3. data/.github/FUNDING.yml +1 -0
  4. data/.github/workflows/ci_linux_x86_64_gnu.yml +248 -0
  5. data/.github/workflows/ci_macos_arm64.yml +301 -0
  6. data/.github/workflows/push_linux_x86_64_gnu.yml +60 -0
  7. data/.github/workflows/push_macos_arm64.yml +50 -0
  8. data/.github/workflows/push_ruby.yml +37 -0
  9. data/.github/workflows/verify-action-pins.yml +16 -0
  10. data/.gitignore +15 -0
  11. data/.rspec +2 -0
  12. data/.ruby-gemset +1 -0
  13. data/.ruby-version +1 -0
  14. data/.yardopts +2 -0
  15. data/CHANGELOG.md +323 -0
  16. data/Gemfile +5 -0
  17. data/MIT-LICENSE +22 -0
  18. data/README.md +177 -0
  19. data/Rakefile +96 -0
  20. data/docker-compose.yml +25 -0
  21. data/ext/README.md +19 -0
  22. data/ext/Rakefile +131 -0
  23. data/ext/build_common.sh +361 -0
  24. data/ext/build_linux_x86_64_gnu.sh +306 -0
  25. data/ext/build_macos_arm64.sh +550 -0
  26. data/ext/librdkafka.dylib +0 -0
  27. data/karafka-rdkafka.gemspec +63 -0
  28. data/lib/rdkafka/abstract_handle.rb +116 -0
  29. data/lib/rdkafka/admin/acl_binding_result.rb +51 -0
  30. data/lib/rdkafka/admin/config_binding_result.rb +30 -0
  31. data/lib/rdkafka/admin/config_resource_binding_result.rb +18 -0
  32. data/lib/rdkafka/admin/create_acl_handle.rb +28 -0
  33. data/lib/rdkafka/admin/create_acl_report.rb +24 -0
  34. data/lib/rdkafka/admin/create_partitions_handle.rb +30 -0
  35. data/lib/rdkafka/admin/create_partitions_report.rb +6 -0
  36. data/lib/rdkafka/admin/create_topic_handle.rb +32 -0
  37. data/lib/rdkafka/admin/create_topic_report.rb +24 -0
  38. data/lib/rdkafka/admin/delete_acl_handle.rb +30 -0
  39. data/lib/rdkafka/admin/delete_acl_report.rb +23 -0
  40. data/lib/rdkafka/admin/delete_groups_handle.rb +28 -0
  41. data/lib/rdkafka/admin/delete_groups_report.rb +24 -0
  42. data/lib/rdkafka/admin/delete_topic_handle.rb +32 -0
  43. data/lib/rdkafka/admin/delete_topic_report.rb +24 -0
  44. data/lib/rdkafka/admin/describe_acl_handle.rb +30 -0
  45. data/lib/rdkafka/admin/describe_acl_report.rb +24 -0
  46. data/lib/rdkafka/admin/describe_configs_handle.rb +33 -0
  47. data/lib/rdkafka/admin/describe_configs_report.rb +48 -0
  48. data/lib/rdkafka/admin/incremental_alter_configs_handle.rb +33 -0
  49. data/lib/rdkafka/admin/incremental_alter_configs_report.rb +48 -0
  50. data/lib/rdkafka/admin.rb +832 -0
  51. data/lib/rdkafka/bindings.rb +582 -0
  52. data/lib/rdkafka/callbacks.rb +415 -0
  53. data/lib/rdkafka/config.rb +398 -0
  54. data/lib/rdkafka/consumer/headers.rb +79 -0
  55. data/lib/rdkafka/consumer/message.rb +86 -0
  56. data/lib/rdkafka/consumer/partition.rb +57 -0
  57. data/lib/rdkafka/consumer/topic_partition_list.rb +190 -0
  58. data/lib/rdkafka/consumer.rb +663 -0
  59. data/lib/rdkafka/error.rb +201 -0
  60. data/lib/rdkafka/helpers/oauth.rb +58 -0
  61. data/lib/rdkafka/helpers/time.rb +14 -0
  62. data/lib/rdkafka/metadata.rb +115 -0
  63. data/lib/rdkafka/native_kafka.rb +139 -0
  64. data/lib/rdkafka/producer/delivery_handle.rb +48 -0
  65. data/lib/rdkafka/producer/delivery_report.rb +45 -0
  66. data/lib/rdkafka/producer/partitions_count_cache.rb +216 -0
  67. data/lib/rdkafka/producer.rb +492 -0
  68. data/lib/rdkafka/version.rb +7 -0
  69. data/lib/rdkafka.rb +54 -0
  70. data/renovate.json +92 -0
  71. data/spec/rdkafka/abstract_handle_spec.rb +117 -0
  72. data/spec/rdkafka/admin/create_acl_handle_spec.rb +56 -0
  73. data/spec/rdkafka/admin/create_acl_report_spec.rb +18 -0
  74. data/spec/rdkafka/admin/create_topic_handle_spec.rb +54 -0
  75. data/spec/rdkafka/admin/create_topic_report_spec.rb +16 -0
  76. data/spec/rdkafka/admin/delete_acl_handle_spec.rb +85 -0
  77. data/spec/rdkafka/admin/delete_acl_report_spec.rb +72 -0
  78. data/spec/rdkafka/admin/delete_topic_handle_spec.rb +54 -0
  79. data/spec/rdkafka/admin/delete_topic_report_spec.rb +16 -0
  80. data/spec/rdkafka/admin/describe_acl_handle_spec.rb +85 -0
  81. data/spec/rdkafka/admin/describe_acl_report_spec.rb +73 -0
  82. data/spec/rdkafka/admin_spec.rb +769 -0
  83. data/spec/rdkafka/bindings_spec.rb +222 -0
  84. data/spec/rdkafka/callbacks_spec.rb +20 -0
  85. data/spec/rdkafka/config_spec.rb +258 -0
  86. data/spec/rdkafka/consumer/headers_spec.rb +73 -0
  87. data/spec/rdkafka/consumer/message_spec.rb +139 -0
  88. data/spec/rdkafka/consumer/partition_spec.rb +57 -0
  89. data/spec/rdkafka/consumer/topic_partition_list_spec.rb +248 -0
  90. data/spec/rdkafka/consumer_spec.rb +1299 -0
  91. data/spec/rdkafka/error_spec.rb +95 -0
  92. data/spec/rdkafka/metadata_spec.rb +79 -0
  93. data/spec/rdkafka/native_kafka_spec.rb +130 -0
  94. data/spec/rdkafka/producer/delivery_handle_spec.rb +60 -0
  95. data/spec/rdkafka/producer/delivery_report_spec.rb +25 -0
  96. data/spec/rdkafka/producer/partitions_count_cache_spec.rb +359 -0
  97. data/spec/rdkafka/producer/partitions_count_spec.rb +359 -0
  98. data/spec/rdkafka/producer_spec.rb +1234 -0
  99. data/spec/spec_helper.rb +181 -0
  100. metadata +273 -0
@@ -0,0 +1,415 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rdkafka
4
+ module Callbacks
5
+ # Extracts attributes of a rd_kafka_topic_result_t
6
+ #
7
+ # @private
8
+ class TopicResult
9
+ attr_reader :result_error, :error_string, :result_name
10
+
11
+ def initialize(topic_result_pointer)
12
+ @result_error = Rdkafka::Bindings.rd_kafka_topic_result_error(topic_result_pointer)
13
+ @error_string = Rdkafka::Bindings.rd_kafka_topic_result_error_string(topic_result_pointer)
14
+ @result_name = Rdkafka::Bindings.rd_kafka_topic_result_name(topic_result_pointer)
15
+ end
16
+
17
+ def self.create_topic_results_from_array(count, array_pointer)
18
+ (1..count).map do |index|
19
+ result_pointer = (array_pointer + (index - 1)).read_pointer
20
+ new(result_pointer)
21
+ end
22
+ end
23
+ end
24
+
25
+ class GroupResult
26
+ attr_reader :result_error, :error_string, :result_name
27
+ def initialize(group_result_pointer)
28
+ native_error = Rdkafka::Bindings.rd_kafka_group_result_error(group_result_pointer)
29
+
30
+ if native_error.null?
31
+ @result_error = 0
32
+ @error_string = FFI::Pointer::NULL
33
+ else
34
+ @result_error = native_error[:code]
35
+ @error_string = native_error[:errstr]
36
+ end
37
+
38
+ @result_name = Rdkafka::Bindings.rd_kafka_group_result_name(group_result_pointer)
39
+ end
40
+ def self.create_group_results_from_array(count, array_pointer)
41
+ (1..count).map do |index|
42
+ result_pointer = (array_pointer + (index - 1)).read_pointer
43
+ new(result_pointer)
44
+ end
45
+ end
46
+ end
47
+
48
+ # Extracts attributes of rd_kafka_acl_result_t
49
+ #
50
+ # @private
51
+ class CreateAclResult
52
+ attr_reader :result_error, :error_string
53
+
54
+ def initialize(acl_result_pointer)
55
+ rd_kafka_error_pointer = Bindings.rd_kafka_acl_result_error(acl_result_pointer)
56
+ @result_error = Rdkafka::Bindings.rd_kafka_error_code(rd_kafka_error_pointer)
57
+ @error_string = Rdkafka::Bindings.rd_kafka_error_string(rd_kafka_error_pointer)
58
+ end
59
+
60
+ def self.create_acl_results_from_array(count, array_pointer)
61
+ (1..count).map do |index|
62
+ result_pointer = (array_pointer + (index - 1)).read_pointer
63
+ new(result_pointer)
64
+ end
65
+ end
66
+ end
67
+
68
+ # Extracts attributes of rd_kafka_DeleteAcls_result_response_t
69
+ #
70
+ # @private
71
+ class DeleteAclResult
72
+ attr_reader :result_error, :error_string, :matching_acls, :matching_acls_count
73
+
74
+ def initialize(acl_result_pointer)
75
+ @matching_acls=[]
76
+ rd_kafka_error_pointer = Rdkafka::Bindings.rd_kafka_DeleteAcls_result_response_error(acl_result_pointer)
77
+ @result_error = Rdkafka::Bindings.rd_kafka_error_code(rd_kafka_error_pointer)
78
+ @error_string = Rdkafka::Bindings.rd_kafka_error_string(rd_kafka_error_pointer)
79
+ if @result_error == 0
80
+ # Get the number of matching acls
81
+ pointer_to_size_t = FFI::MemoryPointer.new(:int32)
82
+ @matching_acls = Rdkafka::Bindings.rd_kafka_DeleteAcls_result_response_matching_acls(acl_result_pointer, pointer_to_size_t)
83
+ @matching_acls_count = pointer_to_size_t.read_int
84
+ end
85
+ end
86
+
87
+ def self.delete_acl_results_from_array(count, array_pointer)
88
+ (1..count).map do |index|
89
+ result_pointer = (array_pointer + (index - 1)).read_pointer
90
+ new(result_pointer)
91
+ end
92
+ end
93
+ end
94
+
95
+ # Extracts attributes of rd_kafka_DeleteAcls_result_response_t
96
+ #
97
+ # @private
98
+ class DescribeAclResult
99
+ attr_reader :result_error, :error_string, :matching_acls, :matching_acls_count
100
+
101
+ def initialize(event_ptr)
102
+ @matching_acls=[]
103
+ @result_error = Rdkafka::Bindings.rd_kafka_event_error(event_ptr)
104
+ @error_string = Rdkafka::Bindings.rd_kafka_event_error_string(event_ptr)
105
+ if @result_error == 0
106
+ acl_describe_result = Rdkafka::Bindings.rd_kafka_event_DescribeAcls_result(event_ptr)
107
+ # Get the number of matching acls
108
+ pointer_to_size_t = FFI::MemoryPointer.new(:int32)
109
+ @matching_acls = Rdkafka::Bindings.rd_kafka_DescribeAcls_result_acls(acl_describe_result, pointer_to_size_t)
110
+ @matching_acls_count = pointer_to_size_t.read_int
111
+ end
112
+ end
113
+ end
114
+
115
+ class DescribeConfigsResult
116
+ attr_reader :result_error, :error_string, :results, :results_count
117
+
118
+ def initialize(event_ptr)
119
+ @results=[]
120
+ @result_error = Rdkafka::Bindings.rd_kafka_event_error(event_ptr)
121
+ @error_string = Rdkafka::Bindings.rd_kafka_event_error_string(event_ptr)
122
+
123
+ if @result_error == 0
124
+ configs_describe_result = Rdkafka::Bindings.rd_kafka_event_DescribeConfigs_result(event_ptr)
125
+ # Get the number of matching acls
126
+ pointer_to_size_t = FFI::MemoryPointer.new(:int32)
127
+ @results = Rdkafka::Bindings.rd_kafka_DescribeConfigs_result_resources(configs_describe_result, pointer_to_size_t)
128
+ @results_count = pointer_to_size_t.read_int
129
+ end
130
+ end
131
+ end
132
+
133
+ class IncrementalAlterConfigsResult
134
+ attr_reader :result_error, :error_string, :results, :results_count
135
+
136
+ def initialize(event_ptr)
137
+ @results=[]
138
+ @result_error = Rdkafka::Bindings.rd_kafka_event_error(event_ptr)
139
+ @error_string = Rdkafka::Bindings.rd_kafka_event_error_string(event_ptr)
140
+
141
+ if @result_error == 0
142
+ incremental_alter_result = Rdkafka::Bindings.rd_kafka_event_IncrementalAlterConfigs_result(event_ptr)
143
+ # Get the number of matching acls
144
+ pointer_to_size_t = FFI::MemoryPointer.new(:int32)
145
+ @results = Rdkafka::Bindings.rd_kafka_IncrementalAlterConfigs_result_resources(incremental_alter_result, pointer_to_size_t)
146
+ @results_count = pointer_to_size_t.read_int
147
+ end
148
+ end
149
+ end
150
+
151
+ # @private
152
+ class BackgroundEventCallback
153
+ def self.call(_, event_ptr, _)
154
+ case Rdkafka::Bindings.rd_kafka_event_type(event_ptr)
155
+ when Rdkafka::Bindings::RD_KAFKA_EVENT_CREATETOPICS_RESULT
156
+ process_create_topic(event_ptr)
157
+ when Rdkafka::Bindings::RD_KAFKA_EVENT_DESCRIBECONFIGS_RESULT
158
+ process_describe_configs(event_ptr)
159
+ when Rdkafka::Bindings::RD_KAFKA_EVENT_INCREMENTALALTERCONFIGS_RESULT
160
+ process_incremental_alter_configs(event_ptr)
161
+ when Rdkafka::Bindings::RD_KAFKA_EVENT_DELETETOPICS_RESULT
162
+ process_delete_topic(event_ptr)
163
+ when Rdkafka::Bindings::RD_KAFKA_ADMIN_OP_CREATEPARTITIONS_RESULT
164
+ process_create_partitions(event_ptr)
165
+ when Rdkafka::Bindings::RD_KAFKA_EVENT_CREATEACLS_RESULT
166
+ process_create_acl(event_ptr)
167
+ when Rdkafka::Bindings::RD_KAFKA_EVENT_DELETEACLS_RESULT
168
+ process_delete_acl(event_ptr)
169
+ when Rdkafka::Bindings::RD_KAFKA_EVENT_DESCRIBEACLS_RESULT
170
+ process_describe_acl(event_ptr)
171
+ when Rdkafka::Bindings::RD_KAFKA_EVENT_DELETEGROUPS_RESULT
172
+ process_delete_groups(event_ptr)
173
+ end
174
+ end
175
+
176
+ private
177
+
178
+ def self.process_create_topic(event_ptr)
179
+ create_topics_result = Rdkafka::Bindings.rd_kafka_event_CreateTopics_result(event_ptr)
180
+
181
+ # Get the number of create topic results
182
+ pointer_to_size_t = FFI::MemoryPointer.new(:int32)
183
+ create_topic_result_array = Rdkafka::Bindings.rd_kafka_CreateTopics_result_topics(create_topics_result, pointer_to_size_t)
184
+ create_topic_results = TopicResult.create_topic_results_from_array(pointer_to_size_t.read_int, create_topic_result_array)
185
+ create_topic_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
186
+
187
+ if create_topic_handle = Rdkafka::Admin::CreateTopicHandle.remove(create_topic_handle_ptr.address)
188
+ create_topic_handle[:response] = create_topic_results[0].result_error
189
+ create_topic_handle[:error_string] = create_topic_results[0].error_string
190
+ create_topic_handle[:result_name] = create_topic_results[0].result_name
191
+
192
+ create_topic_handle.unlock
193
+ end
194
+ end
195
+
196
+ def self.process_describe_configs(event_ptr)
197
+ describe_configs = DescribeConfigsResult.new(event_ptr)
198
+ describe_configs_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
199
+
200
+ if describe_configs_handle = Rdkafka::Admin::DescribeConfigsHandle.remove(describe_configs_handle_ptr.address)
201
+ describe_configs_handle[:response] = describe_configs.result_error
202
+ describe_configs_handle[:response_string] = describe_configs.error_string
203
+ describe_configs_handle[:pending] = false
204
+
205
+ if describe_configs.result_error == 0
206
+ describe_configs_handle[:config_entries] = describe_configs.results
207
+ describe_configs_handle[:entry_count] = describe_configs.results_count
208
+ end
209
+
210
+ describe_configs_handle.unlock
211
+ end
212
+ end
213
+
214
+ def self.process_incremental_alter_configs(event_ptr)
215
+ incremental_alter = IncrementalAlterConfigsResult.new(event_ptr)
216
+ incremental_alter_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
217
+
218
+ if incremental_alter_handle = Rdkafka::Admin::IncrementalAlterConfigsHandle.remove(incremental_alter_handle_ptr.address)
219
+ incremental_alter_handle[:response] = incremental_alter.result_error
220
+ incremental_alter_handle[:response_string] = incremental_alter.error_string
221
+ incremental_alter_handle[:pending] = false
222
+
223
+ if incremental_alter.result_error == 0
224
+ incremental_alter_handle[:config_entries] = incremental_alter.results
225
+ incremental_alter_handle[:entry_count] = incremental_alter.results_count
226
+ end
227
+
228
+ incremental_alter_handle.unlock
229
+ end
230
+ end
231
+
232
+ def self.process_delete_groups(event_ptr)
233
+ delete_groups_result = Rdkafka::Bindings.rd_kafka_event_DeleteGroups_result(event_ptr)
234
+
235
+ # Get the number of delete group results
236
+ pointer_to_size_t = FFI::MemoryPointer.new(:size_t)
237
+ delete_group_result_array = Rdkafka::Bindings.rd_kafka_DeleteGroups_result_groups(delete_groups_result, pointer_to_size_t)
238
+ delete_group_results = GroupResult.create_group_results_from_array(pointer_to_size_t.read_int, delete_group_result_array) # TODO fix this
239
+ delete_group_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
240
+
241
+ if (delete_group_handle = Rdkafka::Admin::DeleteGroupsHandle.remove(delete_group_handle_ptr.address))
242
+ delete_group_handle[:response] = delete_group_results[0].result_error
243
+ delete_group_handle[:error_string] = delete_group_results[0].error_string
244
+ delete_group_handle[:result_name] = delete_group_results[0].result_name
245
+
246
+ delete_group_handle.unlock
247
+ end
248
+ end
249
+
250
+ def self.process_delete_topic(event_ptr)
251
+ delete_topics_result = Rdkafka::Bindings.rd_kafka_event_DeleteTopics_result(event_ptr)
252
+
253
+ # Get the number of topic results
254
+ pointer_to_size_t = FFI::MemoryPointer.new(:int32)
255
+ delete_topic_result_array = Rdkafka::Bindings.rd_kafka_DeleteTopics_result_topics(delete_topics_result, pointer_to_size_t)
256
+ delete_topic_results = TopicResult.create_topic_results_from_array(pointer_to_size_t.read_int, delete_topic_result_array)
257
+ delete_topic_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
258
+
259
+ if delete_topic_handle = Rdkafka::Admin::DeleteTopicHandle.remove(delete_topic_handle_ptr.address)
260
+ delete_topic_handle[:response] = delete_topic_results[0].result_error
261
+ delete_topic_handle[:error_string] = delete_topic_results[0].error_string
262
+ delete_topic_handle[:result_name] = delete_topic_results[0].result_name
263
+
264
+ delete_topic_handle.unlock
265
+ end
266
+ end
267
+
268
+ def self.process_create_partitions(event_ptr)
269
+ create_partitionss_result = Rdkafka::Bindings.rd_kafka_event_CreatePartitions_result(event_ptr)
270
+
271
+ # Get the number of create topic results
272
+ pointer_to_size_t = FFI::MemoryPointer.new(:int32)
273
+ create_partitions_result_array = Rdkafka::Bindings.rd_kafka_CreatePartitions_result_topics(create_partitionss_result, pointer_to_size_t)
274
+ create_partitions_results = TopicResult.create_topic_results_from_array(pointer_to_size_t.read_int, create_partitions_result_array)
275
+ create_partitions_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
276
+
277
+ if create_partitions_handle = Rdkafka::Admin::CreatePartitionsHandle.remove(create_partitions_handle_ptr.address)
278
+ create_partitions_handle[:response] = create_partitions_results[0].result_error
279
+ create_partitions_handle[:error_string] = create_partitions_results[0].error_string
280
+ create_partitions_handle[:result_name] = create_partitions_results[0].result_name
281
+
282
+ create_partitions_handle.unlock
283
+ end
284
+ end
285
+
286
+ def self.process_create_acl(event_ptr)
287
+ create_acls_result = Rdkafka::Bindings.rd_kafka_event_CreateAcls_result(event_ptr)
288
+
289
+ # Get the number of acl results
290
+ pointer_to_size_t = FFI::MemoryPointer.new(:int32)
291
+ create_acl_result_array = Rdkafka::Bindings.rd_kafka_CreateAcls_result_acls(create_acls_result, pointer_to_size_t)
292
+ create_acl_results = CreateAclResult.create_acl_results_from_array(pointer_to_size_t.read_int, create_acl_result_array)
293
+ create_acl_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
294
+
295
+ if create_acl_handle = Rdkafka::Admin::CreateAclHandle.remove(create_acl_handle_ptr.address)
296
+ create_acl_handle[:response] = create_acl_results[0].result_error
297
+ create_acl_handle[:response_string] = create_acl_results[0].error_string
298
+
299
+ create_acl_handle.unlock
300
+ end
301
+ end
302
+
303
+ def self.process_delete_acl(event_ptr)
304
+ delete_acls_result = Rdkafka::Bindings.rd_kafka_event_DeleteAcls_result(event_ptr)
305
+
306
+ # Get the number of acl results
307
+ pointer_to_size_t = FFI::MemoryPointer.new(:int32)
308
+ delete_acl_result_responses = Rdkafka::Bindings.rd_kafka_DeleteAcls_result_responses(delete_acls_result, pointer_to_size_t)
309
+ delete_acl_results = DeleteAclResult.delete_acl_results_from_array(pointer_to_size_t.read_int, delete_acl_result_responses)
310
+ delete_acl_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
311
+
312
+ if delete_acl_handle = Rdkafka::Admin::DeleteAclHandle.remove(delete_acl_handle_ptr.address)
313
+ delete_acl_handle[:response] = delete_acl_results[0].result_error
314
+ delete_acl_handle[:response_string] = delete_acl_results[0].error_string
315
+
316
+ if delete_acl_results[0].result_error == 0
317
+ delete_acl_handle[:matching_acls] = delete_acl_results[0].matching_acls
318
+ delete_acl_handle[:matching_acls_count] = delete_acl_results[0].matching_acls_count
319
+ end
320
+
321
+ delete_acl_handle.unlock
322
+ end
323
+ end
324
+
325
+ def self.process_describe_acl(event_ptr)
326
+ describe_acl = DescribeAclResult.new(event_ptr)
327
+ describe_acl_handle_ptr = Rdkafka::Bindings.rd_kafka_event_opaque(event_ptr)
328
+
329
+ if describe_acl_handle = Rdkafka::Admin::DescribeAclHandle.remove(describe_acl_handle_ptr.address)
330
+ describe_acl_handle[:response] = describe_acl.result_error
331
+ describe_acl_handle[:response_string] = describe_acl.error_string
332
+
333
+ if describe_acl.result_error == 0
334
+ describe_acl_handle[:acls] = describe_acl.matching_acls
335
+ describe_acl_handle[:acls_count] = describe_acl.matching_acls_count
336
+ end
337
+
338
+ describe_acl_handle.unlock
339
+ end
340
+ end
341
+ end
342
+
343
+ # @private
344
+ class DeliveryCallback
345
+ def self.call(_, message_ptr, opaque_ptr)
346
+ message = Rdkafka::Bindings::Message.new(message_ptr)
347
+ delivery_handle_ptr_address = message[:_private].address
348
+ if delivery_handle = Rdkafka::Producer::DeliveryHandle.remove(delivery_handle_ptr_address)
349
+ topic_name = Rdkafka::Bindings.rd_kafka_topic_name(message[:rkt])
350
+
351
+ # Update delivery handle
352
+ delivery_handle[:response] = message[:err]
353
+ delivery_handle[:partition] = message[:partition]
354
+ delivery_handle[:offset] = message[:offset]
355
+ delivery_handle[:topic_name] = FFI::MemoryPointer.from_string(topic_name)
356
+
357
+ # Call delivery callback on opaque
358
+ if opaque = Rdkafka::Config.opaques[opaque_ptr.to_i]
359
+ opaque.call_delivery_callback(
360
+ Rdkafka::Producer::DeliveryReport.new(
361
+ message[:partition],
362
+ message[:offset],
363
+ topic_name,
364
+ message[:err],
365
+ delivery_handle.label
366
+ ),
367
+ delivery_handle
368
+ )
369
+ end
370
+
371
+ delivery_handle.unlock
372
+ end
373
+ end
374
+ end
375
+
376
+ @@mutex = Mutex.new
377
+ @@current_pid = nil
378
+
379
+ class << self
380
+ # Defines or recreates after fork callbacks that require FFI thread so the callback thread
381
+ # is always correctly initialized
382
+ #
383
+ # @see https://github.com/ffi/ffi/issues/1114
384
+ def ensure_ffi_running
385
+ @@mutex.synchronize do
386
+ return if @@current_pid == ::Process.pid
387
+
388
+ if const_defined?(:BackgroundEventCallbackFunction, false)
389
+ send(:remove_const, :BackgroundEventCallbackFunction)
390
+ send(:remove_const, :DeliveryCallbackFunction)
391
+ end
392
+
393
+ # FFI Function used for Create Topic and Delete Topic callbacks
394
+ background_event_callback_function = FFI::Function.new(
395
+ :void, [:pointer, :pointer, :pointer]
396
+ ) do |client_ptr, event_ptr, opaque_ptr|
397
+ BackgroundEventCallback.call(client_ptr, event_ptr, opaque_ptr)
398
+ end
399
+
400
+ # FFI Function used for Message Delivery callbacks
401
+ delivery_callback_function = FFI::Function.new(
402
+ :void, [:pointer, :pointer, :pointer]
403
+ ) do |client_ptr, message_ptr, opaque_ptr|
404
+ DeliveryCallback.call(client_ptr, message_ptr, opaque_ptr)
405
+ end
406
+
407
+ const_set(:BackgroundEventCallbackFunction, background_event_callback_function)
408
+ const_set(:DeliveryCallbackFunction, delivery_callback_function)
409
+
410
+ @@current_pid = ::Process.pid
411
+ end
412
+ end
413
+ end
414
+ end
415
+ end