flydata 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/ext/flydata/json/json_ext.cpp +7 -6
- data/flydata-core/lib/flydata-core/event/event_dictionary.rb +10 -0
- data/flydata-core/lib/flydata-core/event/event_handler_base.rb +2 -0
- data/flydata-core/lib/flydata-core/event/flydata_event.rb +29 -8
- data/flydata-core/lib/flydata-core/event/flydata_event_processor.rb +0 -2
- data/flydata-core/lib/flydata-core/event/flydata_event_sender.rb +7 -3
- data/flydata-core/lib/flydata-core/logger.rb +6 -23
- data/flydata-core/spec/event/flydata_event_processor_spec.rb +2 -2
- data/flydata-core/spec/event/flydata_event_sender_spec.rb +1 -1
- data/flydata-core/spec/event/flydata_event_spec.rb +30 -21
- data/flydata.gemspec +0 -0
- data/lib/flydata/command/restart.rb +4 -4
- data/lib/flydata/command/sender.rb +3 -1
- data/lib/flydata/command/sync.rb +12 -6
- data/lib/flydata/fluent-plugins/mysql/binlog_record_handler.rb +5 -4
- data/lib/flydata/fluent-plugins/mysql/ddl_query_handler.rb +1 -3
- data/lib/flydata/fluent-plugins/mysql/drop_database_query_handler.rb +2 -2
- data/spec/flydata/command/sync_spec.rb +1 -0
- data/spec/flydata/fluent-plugins/mysql/drop_database_query_handler_spec.rb +4 -2
- data/spec/flydata/json/json_ext_spec.rb +24 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ab029d2a33bb77838fe20cf625de7f473efdb30
|
4
|
+
data.tar.gz: 8313b3c85c3f98201194fd33b68b60cab15c9417
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b2b0a184db03ca9d157ee044b349cdf7ab1c94e5338d536ad51c3be474c8cc6363809646c48406578363901917ac9bb453f0426e461f143b7685d51c95edbde
|
7
|
+
data.tar.gz: b7adf39c00e853819265dfc598b4873aef9e469afadd457dc729fce00f682fe1924321f1bd2a361707db7099a96c040300df9b31d2f4ae2a04840151681ed579
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.1
|
@@ -247,23 +247,24 @@ static VALUE rb_json_generate_kv_pairs(VALUE self, VALUE key_ary, VALUE value_ar
|
|
247
247
|
rb_raise(rb_eArgError, "length of arrays must match");
|
248
248
|
}
|
249
249
|
|
250
|
-
std::stringstream ss;
|
250
|
+
std::stringstream* ss = new std::stringstream();
|
251
251
|
|
252
|
-
ss << "{";
|
252
|
+
*ss << "{";
|
253
253
|
|
254
254
|
for (long i = 0; i < key_len; i++)
|
255
255
|
{
|
256
|
-
if (i > 0) { ss << ","; }
|
256
|
+
if (i > 0) { *ss << ","; }
|
257
257
|
|
258
258
|
VALUE key = rb_ary_entry(key_ary, i);
|
259
259
|
VALUE value = rb_ary_entry(value_ary, i);
|
260
260
|
|
261
|
-
add_kv_pair(key, value, ss);
|
261
|
+
add_kv_pair(key, value, *ss);
|
262
262
|
}
|
263
|
-
ss << "}";
|
263
|
+
*ss << "}";
|
264
264
|
|
265
|
-
const std::string& str = ss
|
265
|
+
const std::string& str = ss->str();
|
266
266
|
VALUE json = rb_str_new(str.data(), str.size());
|
267
|
+
delete ss; ss = 0;
|
267
268
|
int enc = rb_enc_find_index("UTF-8");
|
268
269
|
rb_enc_associate_index(json, enc);
|
269
270
|
|
@@ -11,6 +11,7 @@ module FlydataCore
|
|
11
11
|
end
|
12
12
|
|
13
13
|
protected
|
14
|
+
|
14
15
|
def self.register_handler(opts)
|
15
16
|
@noun = opts[:noun]
|
16
17
|
@verb = opts[:verb] || EVENT_VERB_ANY
|
@@ -21,6 +22,7 @@ module FlydataCore
|
|
21
22
|
end
|
22
23
|
|
23
24
|
private
|
25
|
+
|
24
26
|
def self.handlers(noun, verb)
|
25
27
|
handlers = (@@handlers_hash[key(noun, verb)] || []).clone
|
26
28
|
|
@@ -6,23 +6,44 @@ module FlydataCore
|
|
6
6
|
class FlydataEvent
|
7
7
|
attr_accessor :noun
|
8
8
|
attr_accessor :verb
|
9
|
-
attr_accessor :data
|
9
|
+
attr_accessor :data #recommended that it be a hash
|
10
10
|
attr_accessor :id
|
11
11
|
attr_accessor :created
|
12
12
|
attr_accessor :data_entry_id
|
13
13
|
attr_accessor :data_port_id
|
14
14
|
|
15
|
-
|
15
|
+
# params:
|
16
|
+
# data_port_id: nil,
|
17
|
+
# data_entry_id: nil,
|
18
|
+
# id: nil,
|
19
|
+
# data: nil,
|
20
|
+
# timestamp: nil
|
21
|
+
def initialize (noun, verb, params = {})
|
22
|
+
params ||= {}
|
23
|
+
|
16
24
|
@noun = noun
|
17
25
|
@verb = verb
|
18
|
-
@data_entry_id =
|
19
|
-
@data_port_id =
|
20
|
-
@data = data
|
21
|
-
@id = id.nil? ? SecureRandom.uuid: id
|
22
|
-
@created = timestamp.nil? ? Time.now : timestamp
|
26
|
+
@data_entry_id = params[:data_entry_id] ? params[:data_entry_id].to_i : nil
|
27
|
+
@data_port_id = params[:data_port_id] ? params[:data_port_id].to_i : nil
|
28
|
+
@data = params[:data]
|
29
|
+
@id = params[:id].nil? ? SecureRandom.uuid : params[:id]
|
30
|
+
@created = params[:timestamp].nil? ? Time.now : params[:timestamp]
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_h
|
34
|
+
{
|
35
|
+
noun: @noun,
|
36
|
+
verb: @verb,
|
37
|
+
data_entry_id: @data_entry_id,
|
38
|
+
data_port_id: @data_port_id,
|
39
|
+
id: @id,
|
40
|
+
created: @created,
|
41
|
+
data: @data,
|
42
|
+
}
|
23
43
|
end
|
44
|
+
|
24
45
|
def to_json
|
25
|
-
|
46
|
+
to_h.to_json
|
26
47
|
end
|
27
48
|
end
|
28
49
|
end
|
@@ -3,7 +3,6 @@ require 'flydata-core/event/flydata_event_handler_registry'
|
|
3
3
|
module FlydataCore
|
4
4
|
module Event
|
5
5
|
class FlydataEventProcessor
|
6
|
-
|
7
6
|
def self.process(event)
|
8
7
|
handlers = FlydataEventHandlerRegistry.handlers(event.noun, event.verb)
|
9
8
|
if handlers.nil? || handlers.empty?
|
@@ -14,6 +13,5 @@ module FlydataCore
|
|
14
13
|
end
|
15
14
|
end
|
16
15
|
end
|
17
|
-
|
18
16
|
end
|
19
17
|
end
|
@@ -4,20 +4,24 @@ module FlydataCore
|
|
4
4
|
module Event
|
5
5
|
|
6
6
|
class FlydataEventSender
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
def send_event(noun, verb, params = {})
|
8
|
+
params ||= {}
|
9
|
+
routing_key = params[:routing_key] || 'default'
|
10
|
+
event = FlydataEvent.new(noun, verb, params)
|
10
11
|
send(event, routing_key)
|
11
12
|
end
|
12
13
|
|
13
14
|
protected
|
15
|
+
|
14
16
|
def send(event, routing_key)
|
15
17
|
raise "send method not implemented"
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
21
|
class SimpleEventSender <FlydataEventSender
|
22
|
+
|
20
23
|
protected
|
24
|
+
|
21
25
|
def send(event, routing_key)
|
22
26
|
FlydataEventProcessor.process(event)
|
23
27
|
end
|
@@ -109,19 +109,13 @@ module FlydataCore
|
|
109
109
|
msg = build_log_message(level, message, log_params, options)
|
110
110
|
before_logging(level, message, msg, log_params, options)
|
111
111
|
logger = get_logger(options)
|
112
|
-
|
113
|
-
logger.
|
114
|
-
|
115
|
-
if
|
116
|
-
|
117
|
-
|
118
|
-
depth_offset += options[:depth_offset] if options.has_key?(:depth_offset)
|
119
|
-
logger.instance_variable_set(:@depth_offset, original_depth_offset + depth_offset)
|
120
|
-
end
|
112
|
+
# For patched Fluent::Log
|
113
|
+
if logger.respond_to? :flydata_patched
|
114
|
+
depth_offset = 2 # original_depth_offset + log_common
|
115
|
+
depth_offset += options[:depth_offset] if options.has_key?(:depth_offset)
|
116
|
+
logger.send(level, msg, depth_offset: depth_offset)
|
117
|
+
else
|
121
118
|
logger.send(level, msg)
|
122
|
-
if original_depth_offset
|
123
|
-
logger.instance_variable_set(:@depth_offset, original_depth_offset)
|
124
|
-
end
|
125
119
|
end
|
126
120
|
end
|
127
121
|
|
@@ -154,17 +148,6 @@ module FlydataCore
|
|
154
148
|
options[:logger] || logger || log_context_logger || $log
|
155
149
|
end
|
156
150
|
|
157
|
-
# set mutex if logger doesn't have one
|
158
|
-
def set_mutex(logger)
|
159
|
-
return if logger.respond_to?(:mutex)
|
160
|
-
|
161
|
-
mtx = Mutex.new
|
162
|
-
logger.instance_variable_set(:@mutex, mtx)
|
163
|
-
class << logger
|
164
|
-
attr_reader :mutex
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
151
|
def build_log_message(level, raw_message, log_params = {}, options = {})
|
169
152
|
message = raw_message.dup
|
170
153
|
# check keys
|
@@ -9,7 +9,7 @@ module FlydataCore
|
|
9
9
|
describe "#process" do
|
10
10
|
|
11
11
|
context "when event has one verb handler and one any verb handler," do
|
12
|
-
let(:event) {FlydataEvent.new("test2","testing",
|
12
|
+
let(:event) {FlydataEvent.new("test2", "testing", id: 1)}
|
13
13
|
it "should call both handlers" do
|
14
14
|
expect(AnyHandler).to receive(:handle).with(event)
|
15
15
|
expect(Handler3).to receive(:handle).with(event)
|
@@ -18,7 +18,7 @@ module FlydataCore
|
|
18
18
|
end
|
19
19
|
|
20
20
|
context "when event has two handlers," do
|
21
|
-
let(:event) {FlydataEvent.new("test","testing",
|
21
|
+
let(:event) {FlydataEvent.new("test","testing", id: 1)}
|
22
22
|
it "should call both handlers" do
|
23
23
|
expect(Handler1).to receive(:handle).with(event)
|
24
24
|
expect(Handler2).to receive(:handle).with(event)
|
@@ -5,34 +5,43 @@ module FlydataCore
|
|
5
5
|
module Event
|
6
6
|
describe FlydataEvent do
|
7
7
|
describe "#initialize" do
|
8
|
-
let(:noun){"test"}
|
9
|
-
let(:verb){"testing"}
|
10
|
-
let(:data){{
|
8
|
+
let(:noun) { "test" }
|
9
|
+
let(:verb) { "testing" }
|
10
|
+
let(:data) { { 'tables' => %w(table_a table_b) } }
|
11
11
|
|
12
|
-
context
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
context 'when all parameters are given' do
|
13
|
+
let(:parameters) do
|
14
|
+
{ data_entry_id: 1,
|
15
|
+
data_port_id: 2,
|
16
|
+
data: data,
|
17
|
+
id: 12,
|
18
|
+
created: Time.now + 60, }
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'sets given data to instance variables' do
|
22
|
+
event = FlydataEvent.new(noun, verb, parameters)
|
23
|
+
expect(event.noun).to eq(noun)
|
24
|
+
expect(event.verb).to eq(verb)
|
25
|
+
expect(event.data).to eq(data)
|
26
|
+
expect(event.id).to eq(12)
|
19
27
|
expect(event.data_entry_id).to eql(1)
|
20
|
-
expect(event.
|
21
|
-
|
28
|
+
expect(event.data_port_id).to eql(2)
|
29
|
+
expect(event.created).to be_kind_of(Time)
|
30
|
+
end
|
22
31
|
end
|
23
32
|
|
24
|
-
context
|
25
|
-
it
|
26
|
-
event = FlydataEvent.new(noun,verb
|
27
|
-
expect(event.noun).to
|
28
|
-
expect(event.verb).to
|
29
|
-
expect(event.data).to
|
30
|
-
expect(event.data_entry_id).to eql(1)
|
33
|
+
context 'when parameters are empty' do
|
34
|
+
it 'sets default or nil to instance variables' do
|
35
|
+
event = FlydataEvent.new(noun, verb)
|
36
|
+
expect(event.noun).to eq(noun)
|
37
|
+
expect(event.verb).to eq(verb)
|
38
|
+
expect(event.data).to be_nil
|
31
39
|
expect(event.id).not_to be_nil
|
40
|
+
expect(event.data_entry_id).to be_nil
|
41
|
+
expect(event.data_port_id).to be_nil
|
32
42
|
expect(event.created).not_to be_nil
|
33
|
-
|
43
|
+
end
|
34
44
|
end
|
35
|
-
|
36
45
|
end
|
37
46
|
end
|
38
47
|
end
|
data/flydata.gemspec
CHANGED
Binary file
|
@@ -6,13 +6,13 @@ module Flydata
|
|
6
6
|
module Command
|
7
7
|
class Restart < Base
|
8
8
|
def self.slop
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
sender_opts = Flydata::Command::Sender.slop_start # Needs options for Sender#start
|
10
|
+
sender_opts.on 'skip-helper', 'Skip starting the Helper'
|
11
|
+
sender_opts
|
12
12
|
end
|
13
13
|
|
14
14
|
def run
|
15
|
-
sender = Flydata::Command::Sender.new
|
15
|
+
sender = Flydata::Command::Sender.new(opts)
|
16
16
|
sender.restart
|
17
17
|
unless opts.skip_helper?
|
18
18
|
helper = Flydata::Command::Helper.new
|
@@ -8,6 +8,7 @@ module Flydata
|
|
8
8
|
def self.slop_start
|
9
9
|
Slop.new do
|
10
10
|
on 'n', 'no-daemon', 'Start FlyData agent as a regular program'
|
11
|
+
on 'e', 'no-email', 'Skip sending init-sync-start notification email'
|
11
12
|
end
|
12
13
|
end
|
13
14
|
def start(options_or_show_final_message = {show_final_message: true}) # For backward compatibility. Use only as options going forward
|
@@ -58,7 +59,8 @@ module Flydata
|
|
58
59
|
# surpress messages if fluentd is started in #try_mysql_sync
|
59
60
|
options[:quiet] = true
|
60
61
|
Flydata::Command::Sync.new.try_mysql_sync(
|
61
|
-
|
62
|
+
binlog_ready_callback: start_fluentd,
|
63
|
+
no_email: opts.no_email?)
|
62
64
|
options[:quiet] = quiet_option
|
63
65
|
start_fluentd.call unless fluentd_started
|
64
66
|
if options[:show_final_message] && !options[:quiet]
|
data/lib/flydata/command/sync.rb
CHANGED
@@ -20,6 +20,7 @@ require 'flydata-core/mysql/binlog_pos'
|
|
20
20
|
require 'flydata/mysql/table_ddl'
|
21
21
|
require 'flydata-core/mysql/command_generator'
|
22
22
|
require 'flydata/event/api_event_sender'
|
23
|
+
require 'flydata-core/event/event_dictionary'
|
23
24
|
require 'sigdump/setup'
|
24
25
|
#require 'ruby-prof' # to enable profiling, also set the class' RUN_PROFILE
|
25
26
|
|
@@ -150,7 +151,7 @@ EOS
|
|
150
151
|
log_info_stdout <<EOS
|
151
152
|
ERROR! You cannot reset tables because the previous initial sync has not been completed. Reset the unfinished initial sync first with the following command:
|
152
153
|
|
153
|
-
|
154
|
+
flydata sync:reset --init
|
154
155
|
EOS
|
155
156
|
return
|
156
157
|
end
|
@@ -672,9 +673,14 @@ EOM
|
|
672
673
|
log_info_stdout("This process can take hours depending on data size and load on your database. Please be patient...")
|
673
674
|
sync_fm.save_sync_info(@full_initial_sync, target_tables)
|
674
675
|
# This notification will be uncommented after init_sync_finish email integration is released
|
675
|
-
|
676
|
-
|
677
|
-
|
676
|
+
unless options[:sync_resumed]
|
677
|
+
FlydataCore::Event::ApiEventSender.instance.send_event(
|
678
|
+
FlydataCore::Event::INIT_SYNC,
|
679
|
+
FlydataCore::Event::STARTED,
|
680
|
+
data: {"tables" => target_tables, 'no_email' => options[:no_email]},
|
681
|
+
data_entry_id: de['id'],
|
682
|
+
data_port_id: de['data_port_id'])
|
683
|
+
end
|
678
684
|
dump_generator = Flydata::Parser::Mysql::MysqlDumpGeneratorNoMasterData.new(de['mysql_data_entry_preference'].merge('tables' => target_tables))
|
679
685
|
if file_dump
|
680
686
|
binlog_pos = nil
|
@@ -877,10 +883,10 @@ EOM
|
|
877
883
|
sync_fm.save_dump_pos(STATUS_PARSING, table_name, last_pos, binlog_pos, state, substate)
|
878
884
|
|
879
885
|
# send record count for the table
|
880
|
-
if
|
886
|
+
if table_name.to_s != '' &&
|
881
887
|
state == Flydata::Parser::Mysql::MysqlDumpParser::State::CREATE_TABLE
|
882
888
|
# all records for `mysql_table` have been sent
|
883
|
-
send_record_counts(de, sync_fm,
|
889
|
+
send_record_counts(de, sync_fm, table_name,
|
884
890
|
send_record_counts_threads)
|
885
891
|
log_info_stdout(" -> Finished sending data for table '#{table_name}'...")
|
886
892
|
end
|
@@ -29,6 +29,9 @@ module Mysql
|
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
32
|
+
def binlog_pos(record)
|
33
|
+
"#{@context.current_binlog_file}\t#{record['next_position'] - record['event_length']}"
|
34
|
+
end
|
32
35
|
|
33
36
|
def supported_database
|
34
37
|
@context.database
|
@@ -42,8 +45,7 @@ module Mysql
|
|
42
45
|
acceptable = @context.tables.include?(table)
|
43
46
|
|
44
47
|
if acceptable and @table_binlog_pos[record['table_name']]
|
45
|
-
if @table_binlog_pos[record['table_name']] >= Flydata::Mysql::BinLogPosition.new(
|
46
|
-
"#{@context.current_binlog_file}\t#{record['next_position'] - record['event_length']}")
|
48
|
+
if @table_binlog_pos[record['table_name']] >= Flydata::Mysql::BinLogPosition.new(binlog_pos(record))
|
47
49
|
acceptable = false
|
48
50
|
else
|
49
51
|
@context.sync_fm.delete_table_binlog_pos(record['table_name'])
|
@@ -73,7 +75,6 @@ module Mysql
|
|
73
75
|
return unless acceptable_table?(record, table) && acceptable_event?(type, table)
|
74
76
|
|
75
77
|
table_rev = @context.table_revs[table]
|
76
|
-
position = record['next_position'] - record['event_length']
|
77
78
|
|
78
79
|
# Add common information to each record
|
79
80
|
records.each do |r|
|
@@ -84,7 +85,7 @@ module Mysql
|
|
84
85
|
r[TYPE] = type
|
85
86
|
r[RESPECT_ORDER] = true
|
86
87
|
r[TABLE_NAME] = table
|
87
|
-
r[SRC_POS] =
|
88
|
+
r[SRC_POS] = binlog_pos(record)
|
88
89
|
r[TABLE_REV] = table_rev
|
89
90
|
r[V] = FlydataCore::Record::V2
|
90
91
|
end
|
@@ -51,13 +51,11 @@ class DatabaseDdlQueryHandler < DdlQueryHandler
|
|
51
51
|
|
52
52
|
return unless acceptable_event?(type)
|
53
53
|
|
54
|
-
position = record['next_position'] - record['event_length']
|
55
|
-
|
56
54
|
# Add common information to each record
|
57
55
|
records.each do |r|
|
58
56
|
r[TYPE] = type
|
59
57
|
r[RESPECT_ORDER] = true
|
60
|
-
r[SRC_POS] =
|
58
|
+
r[SRC_POS] = binlog_pos(record)
|
61
59
|
r[V] = FlydataCore::Record::V2
|
62
60
|
end
|
63
61
|
|
@@ -15,8 +15,8 @@ module Mysql
|
|
15
15
|
|
16
16
|
def process(record)
|
17
17
|
#Issuing warning message only for the current database.
|
18
|
-
if record["db_name"] == @context.database
|
19
|
-
$log.warn("DROP DATABASE detected. A full re-sync is required to provide sync consistency. db_name:
|
18
|
+
if acceptable_db?(record) #record["db_name"] == @context.database
|
19
|
+
$log.warn("DROP DATABASE detected. A full re-sync is required to provide sync consistency. - db_name:'#{record["db_name"]}' query:'#{record["query"]}' normalized query:'#{record['normalized_query']}' binlog_pos:'#{binlog_pos(record)}'")
|
20
20
|
end
|
21
21
|
#NOTE: No emit_record here because this record should not be sent to data servers for now
|
22
22
|
end
|
@@ -108,6 +108,7 @@ module Flydata
|
|
108
108
|
expect(subject).to receive(:ask_yes_no).and_return(true).at_least(:once)
|
109
109
|
Flydata::Parser::Mysql::DatabaseSizeCheck.any_instance.should_receive(:get_db_bytesize).and_return(db_byte)
|
110
110
|
Flydata::MysqlCompatibilityCheck.any_instance.should_receive(:check)
|
111
|
+
expect_any_instance_of(FlydataCore::Event::ApiEventSender).to receive(:send_event).once
|
111
112
|
end
|
112
113
|
context 'with no stream option' do
|
113
114
|
before do
|
@@ -19,9 +19,11 @@ module Mysql
|
|
19
19
|
shared_examples "test different dbs" do
|
20
20
|
context "for the target db" do
|
21
21
|
let(:database) { target_database }
|
22
|
-
|
22
|
+
let(:binlog_pos) { "#{context.current_binlog_file}\t#{record['next_position'] - record['event_length']}" }
|
23
|
+
|
23
24
|
it "shows a warning message" do
|
24
|
-
expect($log).to receive(:warn).with("DROP DATABASE detected. A full re-sync is required to provide sync consistency. db_name:
|
25
|
+
expect($log).to receive(:warn).with("DROP DATABASE detected. A full re-sync is required to provide sync consistency. - db_name:'#{record["db_name"]}' query:'#{record["query"]}' normalized query:'#{record["normalized_query"]}' binlog_pos:'#{binlog_pos}'")
|
26
|
+
|
25
27
|
subject
|
26
28
|
end
|
27
29
|
end
|
@@ -65,5 +65,29 @@ describe JSON do
|
|
65
65
|
it_behaves_like "producing the expected result"
|
66
66
|
end
|
67
67
|
end
|
68
|
+
|
69
|
+
context 'testing memory' do
|
70
|
+
let(:keys) { ['id', 'user_id', 'name', 'timestamp'] }
|
71
|
+
let(:values) { ['29388381012', '192938439', 'Muy Fiel y Reconquistadora Ciudad de San Felipe y Santiago de Montevideo', '2015-12-01 12:34:56' ] }
|
72
|
+
let(:expected_result) { %Q|{"id":"29388381012","user_id":"192938439","name":"Muy Fiel y Reconquistadora Ciudad de San Felipe y Santiago de Montevideo","timestamp":"2015-12-01 12:34:56"}| }
|
73
|
+
xcontext 'when run many many times' do
|
74
|
+
thread = nil
|
75
|
+
before do
|
76
|
+
GC.stress = true
|
77
|
+
thread = Thread.new { loop {rand(9).to_s * rand(9)} }
|
78
|
+
end
|
79
|
+
it do
|
80
|
+
6000.times do
|
81
|
+
result = described_class.generate_kv_pairs(keys, values)
|
82
|
+
rand(9).to_s * rand(9)
|
83
|
+
expect(result).to eq expected_result
|
84
|
+
end
|
85
|
+
end
|
86
|
+
after do
|
87
|
+
GC.stress = false
|
88
|
+
thread.kill
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
68
92
|
end
|
69
93
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flydata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koichi Fujikawa
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2015-12-
|
15
|
+
date: 2015-12-07 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rest-client
|
@@ -513,6 +513,7 @@ files:
|
|
513
513
|
- flydata-core/lib/flydata-core/core_ext/object.rb
|
514
514
|
- flydata-core/lib/flydata-core/core_ext/object/prepend.rb
|
515
515
|
- flydata-core/lib/flydata-core/errors.rb
|
516
|
+
- flydata-core/lib/flydata-core/event/event_dictionary.rb
|
516
517
|
- flydata-core/lib/flydata-core/event/event_handler_base.rb
|
517
518
|
- flydata-core/lib/flydata-core/event/flydata_event.rb
|
518
519
|
- flydata-core/lib/flydata-core/event/flydata_event_handler_registry.rb
|
@@ -744,7 +745,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
744
745
|
version: '0'
|
745
746
|
requirements: []
|
746
747
|
rubyforge_project:
|
747
|
-
rubygems_version: 2.
|
748
|
+
rubygems_version: 2.0.14.1
|
748
749
|
signing_key:
|
749
750
|
specification_version: 4
|
750
751
|
summary: FlyData Agent
|