kafka 0.5.0
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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.rubocop.yml +210 -0
- data/.travis.yml +45 -0
- data/CHANGELOG.md +3 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +182 -0
- data/Rakefile +69 -0
- data/examples/consumer.rb +55 -0
- data/examples/producer.rb +46 -0
- data/ext/Rakefile +69 -0
- data/kafka.gemspec +39 -0
- data/lib/kafka/admin.rb +141 -0
- data/lib/kafka/config.rb +145 -0
- data/lib/kafka/consumer.rb +87 -0
- data/lib/kafka/error.rb +44 -0
- data/lib/kafka/ffi/admin/admin_options.rb +121 -0
- data/lib/kafka/ffi/admin/config_entry.rb +97 -0
- data/lib/kafka/ffi/admin/config_resource.rb +101 -0
- data/lib/kafka/ffi/admin/delete_topic.rb +19 -0
- data/lib/kafka/ffi/admin/new_partitions.rb +77 -0
- data/lib/kafka/ffi/admin/new_topic.rb +91 -0
- data/lib/kafka/ffi/admin/result.rb +66 -0
- data/lib/kafka/ffi/admin/topic_result.rb +32 -0
- data/lib/kafka/ffi/admin.rb +16 -0
- data/lib/kafka/ffi/broker_metadata.rb +32 -0
- data/lib/kafka/ffi/client.rb +640 -0
- data/lib/kafka/ffi/config.rb +382 -0
- data/lib/kafka/ffi/consumer.rb +342 -0
- data/lib/kafka/ffi/error.rb +25 -0
- data/lib/kafka/ffi/event.rb +215 -0
- data/lib/kafka/ffi/group_info.rb +75 -0
- data/lib/kafka/ffi/group_list.rb +27 -0
- data/lib/kafka/ffi/group_member_info.rb +52 -0
- data/lib/kafka/ffi/message/header.rb +205 -0
- data/lib/kafka/ffi/message.rb +205 -0
- data/lib/kafka/ffi/metadata.rb +58 -0
- data/lib/kafka/ffi/opaque.rb +81 -0
- data/lib/kafka/ffi/opaque_pointer.rb +73 -0
- data/lib/kafka/ffi/partition_metadata.rb +61 -0
- data/lib/kafka/ffi/producer.rb +144 -0
- data/lib/kafka/ffi/queue.rb +65 -0
- data/lib/kafka/ffi/topic.rb +32 -0
- data/lib/kafka/ffi/topic_config.rb +126 -0
- data/lib/kafka/ffi/topic_metadata.rb +42 -0
- data/lib/kafka/ffi/topic_partition.rb +43 -0
- data/lib/kafka/ffi/topic_partition_list.rb +167 -0
- data/lib/kafka/ffi.rb +624 -0
- data/lib/kafka/poller.rb +28 -0
- data/lib/kafka/producer/delivery_report.rb +120 -0
- data/lib/kafka/producer.rb +127 -0
- data/lib/kafka/version.rb +8 -0
- data/lib/kafka.rb +11 -0
- metadata +159 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "kafka/ffi/opaque_pointer"
|
4
|
+
|
5
|
+
module Kafka::FFI::Admin
|
6
|
+
class ConfigEntry < ::Kafka::FFI::OpaquePointer
|
7
|
+
# Returns the configuration property name
|
8
|
+
#
|
9
|
+
# @return [String] Configuration property name
|
10
|
+
def name
|
11
|
+
::Kafka::FFI.rd_kafka_ConfigEntry_name(self)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns the configuration value
|
15
|
+
#
|
16
|
+
# @return [nil] Value is sensitive or unset
|
17
|
+
# @return [String] Configuration value
|
18
|
+
def value
|
19
|
+
::Kafka::FFI.rd_kafka_ConfigEntry_value(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns the source of the config
|
23
|
+
#
|
24
|
+
# @see ffi.rb config_source
|
25
|
+
#
|
26
|
+
# @return [Symbol] Source of the config
|
27
|
+
def source
|
28
|
+
::Kafka::FFI.rd_kafka_ConfigEntry_source(self)
|
29
|
+
end
|
30
|
+
|
31
|
+
# List of synonyms for the config entry
|
32
|
+
#
|
33
|
+
# @return [nil] ConfigEntry was not returned by DescribeConfigs
|
34
|
+
# @return [Array<ConfigEntry>] Set of synonyms for the config
|
35
|
+
def synonyms
|
36
|
+
count = ::FFI::MemoryPointer.new(:pointer)
|
37
|
+
|
38
|
+
entries = ::Kafka::FFI.rd_kafka_ConfigEntry_synonyms(self, count)
|
39
|
+
if entries.null?
|
40
|
+
return nil
|
41
|
+
end
|
42
|
+
|
43
|
+
entries.read_array_of_pointer(count.read(:size_t)).map do |ptr|
|
44
|
+
ConfigEntry.new(ptr)
|
45
|
+
end
|
46
|
+
ensure
|
47
|
+
count.free
|
48
|
+
end
|
49
|
+
|
50
|
+
# rubocop:disable Naming/PredicateName
|
51
|
+
|
52
|
+
# Returns true if the config property is read-only on the broker. Only
|
53
|
+
# returns a boolean when called on a ConfigEntry from a DescribeConfigs
|
54
|
+
# result.
|
55
|
+
#
|
56
|
+
# @return [nil] ConfigEntry was not returned by DescribeConfigs
|
57
|
+
# @return [Boolean] If the property is read only
|
58
|
+
def is_read_only
|
59
|
+
val = ::Kafka::FFI.rd_kafka_ConfigEntry_is_read_only(self)
|
60
|
+
val == -1 ? nil : val == 1
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns true if the config property is set to its default. Only returns a
|
64
|
+
# boolean when use on a ConfigEntry from a DescribeConfigs result.
|
65
|
+
#
|
66
|
+
# @return [nil] ConfigEntry was not returned by DescribeConfigs
|
67
|
+
# @return [Boolean] If the property is set to default
|
68
|
+
def is_default
|
69
|
+
val = ::Kafka::FFI.rd_kafka_ConfigEntry_is_default(self)
|
70
|
+
val == -1 ? nil : val == 1
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns true if the config property is sensitive. Only returns a boolean
|
74
|
+
# when use on a ConfigEntry from a DescribeConfigs result.
|
75
|
+
#
|
76
|
+
# @return [nil] ConfigEntry was not returned by DescribeConfigs
|
77
|
+
# @return [Boolean] If the property is set to default
|
78
|
+
def is_sensitive
|
79
|
+
val = ::Kafka::FFI.rd_kafka_ConfigEntry_is_sensitive(self)
|
80
|
+
val == -1 ? nil : val == 1
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns true if the entry is a synonym for another config option.
|
84
|
+
#
|
85
|
+
# @return [Boolean]
|
86
|
+
def is_synonym
|
87
|
+
::Kafka::FFI.rd_kafka_ConfigEntry_is_sensitive(self) == 1
|
88
|
+
end
|
89
|
+
|
90
|
+
# rubocop:enable Naming/PredicateName
|
91
|
+
|
92
|
+
alias read_only? is_read_only
|
93
|
+
alias default? is_default
|
94
|
+
alias sensitive? is_sensitive
|
95
|
+
alias synonym? is_synonym
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "kafka/ffi/opaque_pointer"
|
4
|
+
|
5
|
+
module Kafka::FFI::Admin
|
6
|
+
class ConfigResource < ::Kafka::FFI::OpaquePointer
|
7
|
+
# Create a new ConfigResource
|
8
|
+
#
|
9
|
+
# @example Build ConfigResource for a topic
|
10
|
+
# ConfigResource.new(:topic, "events")
|
11
|
+
#
|
12
|
+
# @example Build ConfigResource for a broker
|
13
|
+
# ConfigResource.new(:broker, broker_id)
|
14
|
+
#
|
15
|
+
# @see ffi.rb resource_type enum
|
16
|
+
#
|
17
|
+
# @param type [:broker, :topic, :group] Type of config resource
|
18
|
+
# @param name [String] Name of resource (broker_id, topic name, etc...)
|
19
|
+
def self.new(type, name)
|
20
|
+
::Kafka::FFI.rd_kafka_ConfigResource_new(type, name)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Set configuration name and value pair
|
24
|
+
#
|
25
|
+
# @note This will overwrite the current value
|
26
|
+
#
|
27
|
+
# @param name [String] Config option name
|
28
|
+
# @param value [nil] Revert config to default
|
29
|
+
# @param value [String] Value to set config option to
|
30
|
+
#
|
31
|
+
# @raise [Kafka::ResponseError] Invalid input
|
32
|
+
def set_config(name, value)
|
33
|
+
err = ::Kafka::FFI.rd_kafka_ConfigResource_set_config(self, name, value)
|
34
|
+
if err != :ok
|
35
|
+
raise ::Kafka::ResponseError, err
|
36
|
+
end
|
37
|
+
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
# Retrieve an array of ConfigEntry from the resource.
|
42
|
+
#
|
43
|
+
# @return [Array<ConfigEntry>] Config entries for the resource
|
44
|
+
def configs
|
45
|
+
count = ::FFI::MemoryPointer.new(:pointer)
|
46
|
+
|
47
|
+
configs = ::Kafka::FFI.rd_kafka_ConfigResource_configs(self, count)
|
48
|
+
if configs.null?
|
49
|
+
return nil
|
50
|
+
end
|
51
|
+
|
52
|
+
configs = configs.read_array_of_pointer(count.read(:size_t))
|
53
|
+
configs.map! { |p| ConfigEntry.from_native(p, nil) }
|
54
|
+
ensure
|
55
|
+
count.free
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns the type of the resource
|
59
|
+
#
|
60
|
+
# @see ffi.rb resource_type enum
|
61
|
+
#
|
62
|
+
# @return [Symbol] Type of config resource
|
63
|
+
def type
|
64
|
+
::Kafka::FFI.rd_kafka_ConfigResource_type(self)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns the config option name
|
68
|
+
#
|
69
|
+
# @return [String] Name of the config
|
70
|
+
def name
|
71
|
+
::Kafka::FFI.rd_kafka_ConfigResource_name(self)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Returns the response error received from an AlterConfigs request.
|
75
|
+
#
|
76
|
+
# @note Only set when ConfigResource was returned from AlterConfigs.
|
77
|
+
#
|
78
|
+
# @return [nil] No error
|
79
|
+
# @return [Kafka::ResponseError] AlterConfig request error
|
80
|
+
def error
|
81
|
+
err = ::Kafka::FFI.rd_kafka_ConfigResource_error(self)
|
82
|
+
err == :ok ? nil : ::Kafka::ResponseError.new(err)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns a string describing the error received for this resource during
|
86
|
+
# an AlterConfigs request.
|
87
|
+
#
|
88
|
+
# @note Only set when ConfigResource was returned from AlterConfigs.
|
89
|
+
#
|
90
|
+
# @return [nil] No error
|
91
|
+
# @return [String] AlterConfig request error
|
92
|
+
def error_string
|
93
|
+
::Kafka::FFI.rd_kafka_ConfigResource_error_string(self)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Destroy the ConfigResource, returning its resources back to the system.
|
97
|
+
def destroy
|
98
|
+
::Kafka::FFI.rd_kafka_ConfigResource_destroy(self)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "kafka/ffi/opaque_pointer"
|
4
|
+
|
5
|
+
module Kafka::FFI::Admin
|
6
|
+
class DeleteTopic < ::Kafka::FFI::OpaquePointer
|
7
|
+
def self.new(topic)
|
8
|
+
::Kafka::FFI.rd_kafka_DeleteTopic_new(topic)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Release the resources used by the DeleteTopic. It is the application's
|
12
|
+
# responsibility to call #destroy when it is done with the object.
|
13
|
+
def destroy
|
14
|
+
if !pointer.null?
|
15
|
+
::Kafka::FFI.rd_kafka_DeleteTopic_destroy(self)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "kafka/ffi/opaque_pointer"
|
4
|
+
|
5
|
+
module Kafka::FFI::Admin
|
6
|
+
class NewPartitions < ::Kafka::FFI::OpaquePointer
|
7
|
+
# Allocates a new NewPartitions request for passing to CreatePartitions to
|
8
|
+
# increase the number of partitions for an existing topic.
|
9
|
+
#
|
10
|
+
# @param topic [String] Name of the topic to adjust
|
11
|
+
# @param partition_count [Integer] Increase the number of partitions to
|
12
|
+
# this value.
|
13
|
+
#
|
14
|
+
# @raise [ArgumentError] Invalid topic or partition_count
|
15
|
+
def self.new(topic, partition_count)
|
16
|
+
error = ::FFI::MemoryPointer.new(:char, 512)
|
17
|
+
|
18
|
+
if topic.nil? || topic.empty?
|
19
|
+
# Check in Ruby as nil will cause a segfault as of 1.3.0
|
20
|
+
raise ArgumentError, "topic name is required"
|
21
|
+
end
|
22
|
+
|
23
|
+
req = ::Kafka::FFI.rd_kafka_NewPartitions_new(topic, partition_count, error, error.size)
|
24
|
+
if req.nil?
|
25
|
+
raise ArgumentError, error.read_string
|
26
|
+
end
|
27
|
+
|
28
|
+
req
|
29
|
+
ensure
|
30
|
+
error.free
|
31
|
+
end
|
32
|
+
|
33
|
+
# Assign the partition by index, relative to existing partition count, to
|
34
|
+
# be replicated on the set of brokers specified by broker_ids. If called,
|
35
|
+
# this method must be called consecutively for each new partition being
|
36
|
+
# created starting with an index of 0.
|
37
|
+
#
|
38
|
+
# @note This MUST either be called for all new partitions or not at all.
|
39
|
+
#
|
40
|
+
# @example Assigning broker assignments for two new partitions
|
41
|
+
# # Topic already has 3 partitions and replication factor of 2.
|
42
|
+
# request = NewPartitions("topic", 5)
|
43
|
+
# request.set_replica_assignment(0, [1001, 1003])
|
44
|
+
# request.set_replica_assignment(1, [1002, 1001])
|
45
|
+
#
|
46
|
+
# @param partition_index [Integer] Index of the new partition being
|
47
|
+
# created.
|
48
|
+
# @param broker_ids [Array<Integer>] Broker IDs to be assigned a replica of
|
49
|
+
# the topic. Number of broker ids should match the topic replication
|
50
|
+
# factor.
|
51
|
+
#
|
52
|
+
# @raise [Kafka::ResponseError] Arguments were invalid or partition_index
|
53
|
+
# was not called consecutively.
|
54
|
+
def set_replica_assignment(partition_index, broker_ids)
|
55
|
+
error = ::FFI::MemoryPointer.new(:char, 512)
|
56
|
+
|
57
|
+
broker_list = ::FFI::MemoryPointer.new(:int32, broker_ids.length)
|
58
|
+
broker_list.write_array_of_int32(broker_ids)
|
59
|
+
|
60
|
+
resp = ::Kafka::FFI.rd_kafka_NewPartitions_set_replica_assignment(self, partition_index, broker_list, broker_ids.length, error, error.size)
|
61
|
+
if resp != :ok
|
62
|
+
raise ::Kafka::ResponseError.new(resp, error.read_string)
|
63
|
+
end
|
64
|
+
|
65
|
+
nil
|
66
|
+
ensure
|
67
|
+
error.free
|
68
|
+
end
|
69
|
+
|
70
|
+
# Destroy and free the NewPartitions, releasing it's resources back to the
|
71
|
+
# system.
|
72
|
+
def destroy
|
73
|
+
::Kafka::FFI.rd_kafka_NewPartitions_destroy(self)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "kafka/ffi/error"
|
4
|
+
require "kafka/ffi/opaque_pointer"
|
5
|
+
|
6
|
+
module Kafka::FFI::Admin
|
7
|
+
class NewTopic < ::Kafka::FFI::OpaquePointer
|
8
|
+
# Create a new NewTopic for passing to Admin::Client#create_topics. It is
|
9
|
+
# the application's responsiblity to call #destroy when done with the
|
10
|
+
# object.
|
11
|
+
#
|
12
|
+
# @param name [String] Name of the topic to create
|
13
|
+
# @param partitions [Integer] Number of partitions in the topic
|
14
|
+
#
|
15
|
+
# @param replication_factor [Integer] Default replication factor for the
|
16
|
+
# topic's partitions.
|
17
|
+
# @param replication_factor [-1] Value from #set_replica_assignment will be
|
18
|
+
# used.
|
19
|
+
#
|
20
|
+
# @raise [ArgumentError] Parameters were invalid
|
21
|
+
#
|
22
|
+
# @return [NewTopic]
|
23
|
+
def self.new(name, partitions, replication_factor)
|
24
|
+
# Allocate memory for the error message
|
25
|
+
error = ::FFI::MemoryPointer.new(:char, 512)
|
26
|
+
|
27
|
+
if name.nil? || name.empty?
|
28
|
+
raise ArgumentError, " name is required and cannot be blank"
|
29
|
+
end
|
30
|
+
|
31
|
+
obj = ::Kafka::FFI.rd_kafka_NewTopic_new(name, partitions, replication_factor, error, error.size)
|
32
|
+
if obj.nil?
|
33
|
+
raise ArgumentError, error.read_string
|
34
|
+
end
|
35
|
+
|
36
|
+
obj
|
37
|
+
ensure
|
38
|
+
error.free
|
39
|
+
end
|
40
|
+
|
41
|
+
# Set the broker assignment for partition to the replica set in broker_ids.
|
42
|
+
#
|
43
|
+
# @note If called, must be call consecutively for each partition, starting
|
44
|
+
# at 0.
|
45
|
+
# @note new must have been called with replication_factor of -1
|
46
|
+
#
|
47
|
+
# @param partition [Integer] Partition to assign to the brokers
|
48
|
+
# @param broker_ids [Integer, Array<Integer>] Brokers that will be assigned
|
49
|
+
# the partition for the topic.
|
50
|
+
#
|
51
|
+
# @raise [Kafka::ResponseError] Error occurred setting config
|
52
|
+
def set_replica_assignment(partition, broker_ids)
|
53
|
+
broker_ids = Array(broker_ids)
|
54
|
+
|
55
|
+
brokers = ::FFI::MemoryPointer.new(:int32, broker_ids.size)
|
56
|
+
error = ::FFI::MemoryPointer.new(:char, 512)
|
57
|
+
|
58
|
+
brokers.write_array_of_int32(broker_ids)
|
59
|
+
|
60
|
+
err = ::Kafka::FFI.rd_kafka_NewTopic_set_replica_assignment(self, partition, brokers, broker_ids.size, error, error.size)
|
61
|
+
if err != :ok
|
62
|
+
raise ::Kafka::ResponseError, err
|
63
|
+
end
|
64
|
+
|
65
|
+
nil
|
66
|
+
ensure
|
67
|
+
error.free
|
68
|
+
brokers.free
|
69
|
+
end
|
70
|
+
|
71
|
+
# Set the broker side topic configuration name/value pair.
|
72
|
+
#
|
73
|
+
# @raise [Kafka::ResponseError] Arguments were invalid
|
74
|
+
def set_config(name, value)
|
75
|
+
err = ::Kafka::FFI.rd_kafka_NewTopic_set_config(self, name, value)
|
76
|
+
if err != :ok
|
77
|
+
raise ::Kafka::ResponseError, err
|
78
|
+
end
|
79
|
+
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
|
83
|
+
# Release the memory held by NewTopic back to the system. This must be
|
84
|
+
# called by the application when it is done with the object.
|
85
|
+
def destroy
|
86
|
+
if !pointer.null?
|
87
|
+
::Kafka::FFI.rd_kafka_NewTopic_destroy(self)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kafka::FFI::Admin
|
4
|
+
class Result < Array
|
5
|
+
def initialize(event)
|
6
|
+
@event = event
|
7
|
+
|
8
|
+
super(get_results(event))
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_results(event)
|
12
|
+
count = ::FFI::MemoryPointer.new(:size_t)
|
13
|
+
|
14
|
+
klass, results =
|
15
|
+
case event.type
|
16
|
+
when :create_topics
|
17
|
+
[
|
18
|
+
TopicResult,
|
19
|
+
::Kafka::FFI.rd_kafka_CreateTopics_result_topics(event, count),
|
20
|
+
]
|
21
|
+
when :delete_topics
|
22
|
+
[
|
23
|
+
TopicResult,
|
24
|
+
::Kafka::FFI.rd_kafka_DeleteTopics_result_topics(event, count),
|
25
|
+
]
|
26
|
+
when :create_partitions
|
27
|
+
[
|
28
|
+
TopicResult,
|
29
|
+
::Kafka::FFI.rd_kafka_CreateTopics_result_topics(event, count),
|
30
|
+
]
|
31
|
+
when :alter_configs
|
32
|
+
[
|
33
|
+
ConfigResource,
|
34
|
+
::Kafka::FFI.rd_kafka_AlterConfigs_result_resources(event, count),
|
35
|
+
]
|
36
|
+
when :describe_configs
|
37
|
+
[
|
38
|
+
ConfigResource,
|
39
|
+
::Kafka::FFI.rd_kafka_DescribeConfigs_result_resources(event, count),
|
40
|
+
]
|
41
|
+
else
|
42
|
+
raise ArgumentError, "unable to map #{event.class} to result type"
|
43
|
+
end
|
44
|
+
|
45
|
+
if results.null?
|
46
|
+
return []
|
47
|
+
end
|
48
|
+
|
49
|
+
results = results.read_array_of_pointer(count.read(:size_t))
|
50
|
+
results.map! { |p| klass.from_native(p, nil) }
|
51
|
+
ensure
|
52
|
+
count.free
|
53
|
+
end
|
54
|
+
|
55
|
+
def destroy
|
56
|
+
if @event
|
57
|
+
@event.destroy
|
58
|
+
@event = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
clear
|
62
|
+
|
63
|
+
nil
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "ffi"
|
4
|
+
require "kafka/ffi/opaque_pointer"
|
5
|
+
|
6
|
+
module Kafka::FFI::Admin
|
7
|
+
class TopicResult < ::Kafka::FFI::OpaquePointer
|
8
|
+
# Returns the name of the topic the result is for.
|
9
|
+
#
|
10
|
+
# @return [String] Topic name
|
11
|
+
def name
|
12
|
+
::Kafka::FFI.rd_kafka_topic_result_name(self)
|
13
|
+
end
|
14
|
+
alias topic name
|
15
|
+
|
16
|
+
# Returns either nil for success or an error with details about why the
|
17
|
+
# topic operation failed.
|
18
|
+
#
|
19
|
+
# @return [nil] Topic operation was successful for this topic.
|
20
|
+
# @return [Kafka::ResponseError] Error performing the operation for this
|
21
|
+
# topic.
|
22
|
+
def error
|
23
|
+
err = ::Kafka::FFI.rd_kafka_topic_result_error(self)
|
24
|
+
if err != :ok
|
25
|
+
::Kafka::ResponseError.new(
|
26
|
+
err,
|
27
|
+
::Kafka::FFI.rd_kafka_topic_result_error_string(self),
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "kafka/ffi"
|
4
|
+
|
5
|
+
module Kafka::FFI
|
6
|
+
module Admin
|
7
|
+
require "kafka/ffi/admin/result"
|
8
|
+
require "kafka/ffi/admin/new_topic"
|
9
|
+
require "kafka/ffi/admin/delete_topic"
|
10
|
+
require "kafka/ffi/admin/topic_result"
|
11
|
+
require "kafka/ffi/admin/admin_options"
|
12
|
+
require "kafka/ffi/admin/config_entry"
|
13
|
+
require "kafka/ffi/admin/new_partitions"
|
14
|
+
require "kafka/ffi/admin/config_resource"
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kafka::FFI
|
4
|
+
class BrokerMetadata < ::FFI::Struct
|
5
|
+
layout(
|
6
|
+
:id, :int32,
|
7
|
+
:host, :string,
|
8
|
+
:port, :int
|
9
|
+
)
|
10
|
+
|
11
|
+
# Returns the Broker's cluster ID
|
12
|
+
#
|
13
|
+
# @return [Integer] Broker ID
|
14
|
+
def id
|
15
|
+
self[:id]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns the hostname of the Broker
|
19
|
+
#
|
20
|
+
# @return [String] Broker hostname
|
21
|
+
def host
|
22
|
+
self[:host]
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the port used to connect to the Broker
|
26
|
+
#
|
27
|
+
# @return [Integer] Broker port
|
28
|
+
def port
|
29
|
+
self[:port]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|