rdkafka 0.1.2 → 0.1.8
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 +4 -4
- data/.gitignore +1 -0
- data/ext/Rakefile +19 -3
- data/lib/rdkafka/config.rb +26 -15
- data/lib/rdkafka/ffi.rb +37 -3
- data/lib/rdkafka/producer.rb +12 -2
- data/lib/rdkafka/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9b016b16ea543f75f53572f0a16e89aae152000
|
4
|
+
data.tar.gz: ea73ee4d951be90743901a7b9e2fe75708823ebb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75f6817837f86d3b136a98fe87850bb63275bc389a5bdb7abfb8dd3dfd14633a73ac0073a26cd98d596b63901bf3796e4ec87f6e4c2c25320328f250fd960308
|
7
|
+
data.tar.gz: 7cac0e27475bd2571e6eb104fcaf977efed4e306b04cd8c735b2c390d119eff0f2538eced0a06f66c90c36d60ecc5e569b8bd77fe7f01e4c38ca40eaba960fda
|
data/.gitignore
CHANGED
data/ext/Rakefile
CHANGED
@@ -2,14 +2,30 @@ require File.expand_path('../../lib/rdkafka/version', __FILE__)
|
|
2
2
|
require "mini_portile2"
|
3
3
|
require "fileutils"
|
4
4
|
|
5
|
-
task :default do
|
5
|
+
task :default => :clean do
|
6
|
+
# Download and compile librdkafka
|
6
7
|
recipe = MiniPortile.new("librdkafka", Rdkafka::LIBRDKAFKA_VERSION)
|
7
8
|
recipe.files = ["https://github.com/edenhill/librdkafka/archive/v#{Rdkafka::LIBRDKAFKA_VERSION}.tar.gz"]
|
8
9
|
recipe.configure_options = ["--host=#{recipe.host}"]
|
9
10
|
recipe.cook
|
11
|
+
# Move dynamic library we're interested in
|
12
|
+
if recipe.host.include?('darwin')
|
13
|
+
from_extension = '1.dylib'
|
14
|
+
to_extension = 'dylib'
|
15
|
+
else
|
16
|
+
from_extension = 'so.1'
|
17
|
+
to_extension = 'so'
|
18
|
+
end
|
19
|
+
lib_path = File.join(File.dirname(__FILE__), "ports/#{recipe.host}/librdkafka/#{Rdkafka::LIBRDKAFKA_VERSION}/lib/librdkafka.#{from_extension}")
|
20
|
+
FileUtils.mv(lib_path, File.join(File.dirname(__FILE__), "librdkafka.#{to_extension}"))
|
21
|
+
# Cleanup files created by miniportile we don't need in the gem
|
22
|
+
FileUtils.rm_rf File.join(File.dirname(__FILE__), "tmp")
|
23
|
+
FileUtils.rm_rf File.join(File.dirname(__FILE__), "ports")
|
10
24
|
end
|
11
25
|
|
12
26
|
task :clean do
|
13
|
-
FileUtils.
|
14
|
-
FileUtils.
|
27
|
+
FileUtils.rm_f File.join(File.dirname(__FILE__), "librdkafka.dylib")
|
28
|
+
FileUtils.rm_f File.join(File.dirname(__FILE__), "librdkafka.so")
|
29
|
+
FileUtils.rm_rf File.join(File.dirname(__FILE__), "ports")
|
30
|
+
FileUtils.rm_rf File.join(File.dirname(__FILE__), "tmp")
|
15
31
|
end
|
data/lib/rdkafka/config.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
|
+
require "logger"
|
2
|
+
|
1
3
|
module Rdkafka
|
2
4
|
class Config
|
5
|
+
@@logger = Logger.new(STDOUT)
|
6
|
+
|
7
|
+
def self.logger
|
8
|
+
@@logger
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.logger=(logger)
|
12
|
+
@@logger=logger
|
13
|
+
end
|
14
|
+
|
3
15
|
DEFAULT_CONFIG = {
|
4
16
|
:"api.version.request" => true
|
5
17
|
}
|
@@ -39,23 +51,22 @@ module Rdkafka
|
|
39
51
|
# This method is only intented to be used to create a client,
|
40
52
|
# using it in another way will leak memory.
|
41
53
|
def native_config
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
54
|
+
Rdkafka::FFI.rd_kafka_conf_new.tap do |config|
|
55
|
+
@config_hash.each do |key, value|
|
56
|
+
error_buffer = ::FFI::MemoryPointer.from_string(" " * 256)
|
57
|
+
result = Rdkafka::FFI.rd_kafka_conf_set(
|
58
|
+
config,
|
59
|
+
key.to_s,
|
60
|
+
value.to_s,
|
61
|
+
error_buffer,
|
62
|
+
256
|
63
|
+
)
|
64
|
+
unless result == :config_ok
|
65
|
+
raise ConfigError.new(error_buffer.read_string)
|
66
|
+
end
|
55
67
|
end
|
68
|
+
Rdkafka::FFI.rd_kafka_conf_set_log_cb(config, Rdkafka::FFI::LogCallback)
|
56
69
|
end
|
57
|
-
|
58
|
-
config
|
59
70
|
end
|
60
71
|
|
61
72
|
def native_kafka(config, type)
|
data/lib/rdkafka/ffi.rb
CHANGED
@@ -1,10 +1,19 @@
|
|
1
1
|
require "ffi"
|
2
|
-
require "
|
2
|
+
require "logger"
|
3
3
|
|
4
4
|
module Rdkafka
|
5
5
|
module FFI
|
6
6
|
extend ::FFI::Library
|
7
|
-
|
7
|
+
|
8
|
+
def self.lib_extension
|
9
|
+
if Gem::Platform.local.os.include?("darwin")
|
10
|
+
'dylib'
|
11
|
+
else
|
12
|
+
'so'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
ffi_lib File.join(File.dirname(__FILE__), "../../ext/librdkafka.#{lib_extension}")
|
8
17
|
|
9
18
|
# Polling
|
10
19
|
|
@@ -27,6 +36,10 @@ module Rdkafka
|
|
27
36
|
self[:err]
|
28
37
|
end
|
29
38
|
|
39
|
+
def topic
|
40
|
+
FFI.rd_kafka_topic_name(self[:rkt])
|
41
|
+
end
|
42
|
+
|
30
43
|
def partition
|
31
44
|
self[:partition]
|
32
45
|
end
|
@@ -52,7 +65,7 @@ module Rdkafka
|
|
52
65
|
end
|
53
66
|
|
54
67
|
def to_s
|
55
|
-
"Message with key '#{key}', payload '#{payload}', partition '#{partition}', offset '#{offset}'"
|
68
|
+
"Message in '#{topic}' with key '#{key}', payload '#{payload}', partition '#{partition}', offset '#{offset}'"
|
56
69
|
end
|
57
70
|
|
58
71
|
def self.release(ptr)
|
@@ -61,6 +74,7 @@ module Rdkafka
|
|
61
74
|
end
|
62
75
|
|
63
76
|
attach_function :rd_kafka_message_destroy, [:pointer], :void
|
77
|
+
attach_function :rd_kafka_topic_name, [:pointer], :string
|
64
78
|
|
65
79
|
# TopicPartition ad TopicPartitionList structs
|
66
80
|
|
@@ -100,6 +114,26 @@ module Rdkafka
|
|
100
114
|
|
101
115
|
attach_function :rd_kafka_conf_new, [], :pointer
|
102
116
|
attach_function :rd_kafka_conf_set, [:pointer, :string, :string, :pointer, :int], :kafka_config_response
|
117
|
+
callback :log_cb, [:pointer, :int, :string, :string], :void
|
118
|
+
attach_function :rd_kafka_conf_set_log_cb, [:pointer, :log_cb], :void
|
119
|
+
|
120
|
+
LogCallback = Proc.new do |client_ptr, level, level_string, line|
|
121
|
+
severity = case level
|
122
|
+
when 0 || 1 || 2
|
123
|
+
Logger::FATAL
|
124
|
+
when 3
|
125
|
+
Logger::ERROR
|
126
|
+
when 4
|
127
|
+
Logger::WARN
|
128
|
+
when 5 || 6
|
129
|
+
Logger::INFO
|
130
|
+
when 7
|
131
|
+
Logger::DEBUG
|
132
|
+
else
|
133
|
+
Logger::UNKNOWN
|
134
|
+
end
|
135
|
+
Rdkafka::Config.logger.add(severity) { line }
|
136
|
+
end
|
103
137
|
|
104
138
|
# Handle
|
105
139
|
|
data/lib/rdkafka/producer.rb
CHANGED
@@ -62,6 +62,8 @@ module Rdkafka
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
+
class WaitTimeoutError < RuntimeError; end
|
66
|
+
|
65
67
|
class DeliveryHandle < ::FFI::Struct
|
66
68
|
layout :pending, :bool,
|
67
69
|
:response, :int,
|
@@ -73,10 +75,18 @@ module Rdkafka
|
|
73
75
|
end
|
74
76
|
|
75
77
|
# Wait for the delivery report
|
76
|
-
def wait
|
78
|
+
def wait(timeout_in_seconds=10)
|
79
|
+
timeout = if timeout_in_seconds
|
80
|
+
Time.now.to_i + timeout_in_seconds
|
81
|
+
else
|
82
|
+
nil
|
83
|
+
end
|
77
84
|
loop do
|
78
85
|
if pending?
|
79
|
-
|
86
|
+
if timeout && timeout <= Time.now.to_i
|
87
|
+
raise WaitTimeoutError.new("Waiting for delivery timed out after #{timeout_in_seconds} seconds")
|
88
|
+
end
|
89
|
+
sleep 0.1
|
80
90
|
next
|
81
91
|
elsif self[:response] != 0
|
82
92
|
raise RdkafkaError.new(self[:response])
|
data/lib/rdkafka/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdkafka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thijs Cadier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|