right_support 2.8.15 → 2.8.16
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.
- data/VERSION +1 -1
- data/lib/right_support/db/cassandra_model.rb +32 -7
- data/lib/right_support/net/http_client.rb +5 -2
- data/right_support.gemspec +8 -8
- data/spec/db/cassandra_model_spec.rb +6 -21
- data/spec/net/http_client_spec.rb +13 -3
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.8.
|
1
|
+
2.8.16
|
@@ -142,13 +142,20 @@ module RightSupport::DB
|
|
142
142
|
class CassandraModel
|
143
143
|
include RightSupport::Log::Mixin
|
144
144
|
|
145
|
+
# For long-running operations, generate period log output after this many columns to help
|
146
|
+
# observers figure out how much progress has been made
|
147
|
+
LONG_OPERATION_LOG_PERIOD = 1_000_000
|
148
|
+
|
145
149
|
# Default timeout for client connection to Cassandra server
|
146
150
|
DEFAULT_TIMEOUT = 20
|
147
151
|
|
148
|
-
# Default maximum number of
|
152
|
+
# Default maximum number of columns to retrieve in one chunk
|
149
153
|
DEFAULT_COUNT = 100
|
150
154
|
|
151
|
-
|
155
|
+
# Default maximum number of rows to retrieve in one chunk
|
156
|
+
DEFAULT_ROW_COUNT = 100
|
157
|
+
|
158
|
+
# Wrappers for Cassandra client
|
152
159
|
class << self
|
153
160
|
|
154
161
|
attr_reader :default_keyspace
|
@@ -420,11 +427,11 @@ module RightSupport::DB
|
|
420
427
|
# A row key may be yielded more than once as each "chunk" of columns from that row is
|
421
428
|
# read from the ring, but each column will be yielded exactly once.
|
422
429
|
#
|
423
|
-
#
|
430
|
+
# @return [Integer] total number of columns read
|
431
|
+
#
|
424
432
|
# @param [String] index column name
|
425
433
|
# @param [String] index column value
|
426
434
|
#
|
427
|
-
# == Yields:
|
428
435
|
# @yield [row_key, columns] yields one or more times for every row that contains a matching index column, ultimately yielding EVERY column in that row
|
429
436
|
# @yieldparam [String] row_key the row key currently being processes
|
430
437
|
# @yieldparam [Array] columns an array of Cassandra CassandraThrift::ColumnOrSuperColumn objects
|
@@ -432,12 +439,18 @@ module RightSupport::DB
|
|
432
439
|
expr = do_op(:create_idx_expr, index, key, "EQ")
|
433
440
|
start_row = ''
|
434
441
|
|
442
|
+
last_report = 0
|
443
|
+
total_rows = 0
|
444
|
+
total_columns = 0
|
445
|
+
|
435
446
|
# Loop over all CF rows, with batches of X
|
436
447
|
while (start_row != nil)
|
437
448
|
# Reset these to their initial values on every iteration thru the loop, in case
|
438
449
|
# we backed off due to timeouts (see rescue clauses below)
|
439
|
-
|
440
|
-
|
450
|
+
#
|
451
|
+
# Since this method is made for wide rows, also ask for 10x the default column count.
|
452
|
+
row_count = DEFAULT_ROW_COUNT
|
453
|
+
column_count = DEFAULT_COUNT * 10
|
441
454
|
|
442
455
|
clause = do_op(:create_idx_clause, [expr], start_row, row_count)
|
443
456
|
|
@@ -460,6 +473,7 @@ module RightSupport::DB
|
|
460
473
|
# We already processed this row the previous iteration; skip it
|
461
474
|
next if row_key == start_row
|
462
475
|
|
476
|
+
total_rows += 1
|
463
477
|
start_column = ''
|
464
478
|
|
465
479
|
while start_column != nil
|
@@ -475,11 +489,20 @@ module RightSupport::DB
|
|
475
489
|
columns = self.conn.get_range(column_family, options).first.columns
|
476
490
|
|
477
491
|
if columns[0].column.name == start_column
|
492
|
+
total_columns += columns.size - 1
|
478
493
|
yield(row_key, columns[1..-1])
|
479
494
|
else
|
495
|
+
total_columns += columns.size
|
480
496
|
yield(row_key, columns)
|
481
497
|
end
|
482
498
|
|
499
|
+
# Help Ops figure out where we are
|
500
|
+
if (total_columns - last_report > LONG_OPERATION_LOG_PERIOD)
|
501
|
+
logger.info "CassandraModel#stream_all_indexed_slices got RangeSlice total_rows=%d total_columns=%d (cf='%s' row='%s' start='%s' count=%d)" %
|
502
|
+
[total_rows, total_columns, column_family, row_key, start_column, column_count]
|
503
|
+
last_report = total_columns
|
504
|
+
end
|
505
|
+
|
483
506
|
if columns.size >= column_count
|
484
507
|
start_column = columns.last.column.name
|
485
508
|
else
|
@@ -488,7 +511,7 @@ module RightSupport::DB
|
|
488
511
|
rescue Exception => e
|
489
512
|
if retryable_read_timeout?(e)
|
490
513
|
logger.error "CassandraModel#stream_all_indexed_slices retrying get_range with fewer cols due to a %s: %s @ %s (cf='%s' row='%s' start='%s' count=%d)" %
|
491
|
-
[e.class.name, e.message, e.backtrace.first, column_family, row_key,
|
514
|
+
[e.class.name, e.message, e.backtrace.first, column_family, row_key, start_column, column_count]
|
492
515
|
column_count /= 10 if column_count > 1
|
493
516
|
retry
|
494
517
|
else
|
@@ -504,6 +527,8 @@ module RightSupport::DB
|
|
504
527
|
start_row = nil
|
505
528
|
end
|
506
529
|
end
|
530
|
+
|
531
|
+
total_columns
|
507
532
|
end
|
508
533
|
|
509
534
|
# Get all rows for specified secondary key
|
@@ -124,11 +124,14 @@ module RightSupport::Net
|
|
124
124
|
class HTTPClient
|
125
125
|
# The default options for every request; can be overridden by options
|
126
126
|
# passed to #initialize or to the individual request methods (#get,
|
127
|
-
# #post, and so forth).
|
127
|
+
# #post, and so forth).
|
128
|
+
# NOTE: rest-client 1.6.7 doesn't pass down the ssl_version to Net::HTTP.
|
129
|
+
# silently discarded. 1.7.0.alpha or later does.
|
128
130
|
DEFAULT_OPTIONS = {
|
129
131
|
:timeout => 5,
|
130
132
|
:open_timeout => 2,
|
131
|
-
:headers => {}
|
133
|
+
:headers => {},
|
134
|
+
:ssl_version => 'TLSv1'
|
132
135
|
}
|
133
136
|
|
134
137
|
def initialize(defaults = {})
|
data/right_support.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "2.8.
|
7
|
+
s.name = %q{right_support}
|
8
|
+
s.version = "2.8.16"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tony Spataro", "Sergey Sergyenko", "Ryan Williamson", "Lee Kirchhoff", "Alexey Karpik", "Scott Messier"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
12
|
+
s.date = %q{2014-02-27}
|
13
|
+
s.description = %q{A toolkit of useful, reusable foundation code created by RightScale.}
|
14
|
+
s.email = %q{support@rightscale.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
17
|
"README.rdoc"
|
@@ -134,11 +134,11 @@ Gem::Specification.new do |s|
|
|
134
134
|
"spec/validation/openssl_spec.rb",
|
135
135
|
"spec/validation/ssh_spec.rb"
|
136
136
|
]
|
137
|
-
s.homepage =
|
137
|
+
s.homepage = %q{https://github.com/rightscale/right_support}
|
138
138
|
s.licenses = ["MIT"]
|
139
139
|
s.require_paths = ["lib"]
|
140
|
-
s.rubygems_version =
|
141
|
-
s.summary =
|
140
|
+
s.rubygems_version = %q{1.6.2}
|
141
|
+
s.summary = %q{Reusable foundation code.}
|
142
142
|
|
143
143
|
if s.respond_to? :specification_version then
|
144
144
|
s.specification_version = 3
|
@@ -270,27 +270,6 @@ describe RightSupport::DB::CassandraModel do
|
|
270
270
|
end
|
271
271
|
end
|
272
272
|
|
273
|
-
def real_get_indexed(index, key, columns = nil, opt = {})
|
274
|
-
rows = {}
|
275
|
-
start = ""
|
276
|
-
count = DEFAULT_COUNT
|
277
|
-
expr = do_op(:create_idx_expr, index, key, "EQ")
|
278
|
-
opt = opt[:consistency] ? {:consistency => opt[:consistency]} : {}
|
279
|
-
while true
|
280
|
-
clause = do_op(:create_idx_clause, [expr], start, count)
|
281
|
-
chunk = do_op(:get_indexed_slices, column_family, clause, columns, opt)
|
282
|
-
rows.merge!(chunk)
|
283
|
-
if chunk.size == count
|
284
|
-
# Assume there are more chunks, use last key as start of next get
|
285
|
-
start = chunk.keys.last
|
286
|
-
else
|
287
|
-
# This must be the last chunk
|
288
|
-
break
|
289
|
-
end
|
290
|
-
end
|
291
|
-
rows
|
292
|
-
end
|
293
|
-
|
294
273
|
context :get_indexed do
|
295
274
|
|
296
275
|
before(:each) do
|
@@ -347,6 +326,12 @@ describe RightSupport::DB::CassandraModel do
|
|
347
326
|
RightSupport::DB::CassandraModel.get_indexed(@index, @index_key).should == []
|
348
327
|
end
|
349
328
|
end
|
329
|
+
|
330
|
+
context :stream_all_indexed_slices do
|
331
|
+
it 'streams rows in chunks'
|
332
|
+
it 'streams columns in chunks'
|
333
|
+
it 'handles timeouts'
|
334
|
+
end
|
350
335
|
end
|
351
336
|
end
|
352
337
|
|
@@ -97,6 +97,7 @@ describe RightSupport::Net::HTTPClient do
|
|
97
97
|
it 'uses default options on every request' do
|
98
98
|
p = {:method=>:get,
|
99
99
|
:timeout=>101010,
|
100
|
+
:ssl_version=>'TLSv1',
|
100
101
|
:open_timeout=>999,
|
101
102
|
:url=>'/moo', :headers=>{:moo=>:bah}}
|
102
103
|
flexmock(RestClient::Request).should_receive(:execute).with(p)
|
@@ -106,10 +107,11 @@ describe RightSupport::Net::HTTPClient do
|
|
106
107
|
it 'allows defaults to be overridden' do
|
107
108
|
p = {:method=>:get,
|
108
109
|
:timeout=>101010,
|
110
|
+
:ssl_version=>'SSLv3',
|
109
111
|
:open_timeout=>3,
|
110
112
|
:url=>'/moo', :headers=>{:joe=>:blow}}
|
111
113
|
flexmock(RestClient::Request).should_receive(:execute).with(p)
|
112
|
-
@http_client.get('/moo', :open_timeout=>3, :headers=>{:joe=>:blow})
|
114
|
+
@http_client.get('/moo', :ssl_version => 'SSLv3', :open_timeout=>3, :headers=>{:joe=>:blow})
|
113
115
|
end
|
114
116
|
end
|
115
117
|
end
|
@@ -125,6 +127,7 @@ describe RightSupport::Net::HTTPClient do
|
|
125
127
|
it 'succeeds' do
|
126
128
|
p = {:method=>:get,
|
127
129
|
:timeout=>RightSupport::Net::HTTPClient::DEFAULT_OPTIONS[:timeout],
|
130
|
+
:ssl_version=>RightSupport::Net::HTTPClient::DEFAULT_OPTIONS[:ssl_version],
|
128
131
|
:open_timeout=>RightSupport::Net::HTTPClient::DEFAULT_OPTIONS[:open_timeout],
|
129
132
|
:url=>'/moo', :headers=>{}}
|
130
133
|
flexmock(RestClient::Request).should_receive(:execute).with(p)
|
@@ -137,6 +140,7 @@ describe RightSupport::Net::HTTPClient do
|
|
137
140
|
it 'succeeds' do
|
138
141
|
p = {:method=>:get,
|
139
142
|
:timeout=>RightSupport::Net::HTTPClient::DEFAULT_OPTIONS[:timeout],
|
143
|
+
:ssl_version=>RightSupport::Net::HTTPClient::DEFAULT_OPTIONS[:ssl_version],
|
140
144
|
:open_timeout=>RightSupport::Net::HTTPClient::DEFAULT_OPTIONS[:open_timeout],
|
141
145
|
:url=>'/moo', :headers=>{:mrm=>1, :blah=>:foo}}
|
142
146
|
flexmock(RestClient::Request).should_receive(:execute).with(p)
|
@@ -150,6 +154,7 @@ describe RightSupport::Net::HTTPClient do
|
|
150
154
|
it 'succeeds' do
|
151
155
|
p = {:method=>:get,
|
152
156
|
:timeout=>42,
|
157
|
+
:ssl_version=>RightSupport::Net::HTTPClient::DEFAULT_OPTIONS[:ssl_version],
|
153
158
|
:open_timeout => RightSupport::Net::HTTPClient::DEFAULT_OPTIONS[:open_timeout],
|
154
159
|
:url=>'/moo', :headers=>{}}
|
155
160
|
flexmock(RestClient::Request).should_receive(:execute).with(p)
|
@@ -160,8 +165,13 @@ describe RightSupport::Net::HTTPClient do
|
|
160
165
|
|
161
166
|
context 'given a URL and any other parameters' do
|
162
167
|
it 'succeeds' do
|
163
|
-
p = { :method=>:get,
|
164
|
-
:
|
168
|
+
p = { :method=>:get,
|
169
|
+
:timeout=>RightSupport::Net::HTTPClient::DEFAULT_OPTIONS[:timeout],
|
170
|
+
:ssl_version=>RightSupport::Net::HTTPClient::DEFAULT_OPTIONS[:ssl_version],
|
171
|
+
:url=>'/moo',
|
172
|
+
:headers=>{},
|
173
|
+
:open_timeout => 1,
|
174
|
+
:payload=>{:foo => :bar} }
|
165
175
|
flexmock(RestClient::Request).should_receive(:execute).with(p)
|
166
176
|
|
167
177
|
@http_client.get('/moo', :open_timeout => 1, :payload=>{:foo => :bar})
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: right_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 8
|
9
|
-
-
|
10
|
-
version: 2.8.
|
9
|
+
- 16
|
10
|
+
version: 2.8.16
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tony Spataro
|