right_support 2.6.3 → 2.6.4

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.
@@ -104,6 +104,7 @@ module RightSupport::DB
104
104
  # Used to access data persisted in Cassandra
105
105
  # Provides wrappers for Cassandra client methods
106
106
  class CassandraModel
107
+ include RightSupport::Log::Mixin
107
108
 
108
109
  # Default timeout for client connection to Cassandra server
109
110
  DEFAULT_TIMEOUT = 10
@@ -114,8 +115,6 @@ module RightSupport::DB
114
115
  # Wrappers for Cassandra client
115
116
  class << self
116
117
 
117
- @@logger = nil
118
-
119
118
  attr_reader :default_keyspace
120
119
  attr_accessor :column_family
121
120
 
@@ -123,6 +122,8 @@ module RightSupport::DB
123
122
 
124
123
  @@connections = {}
125
124
 
125
+ METHODS_TO_LOG = [:multi_get, :get, :get_indexed_slices, :get_columns, :insert, :remove, 'multi_get', 'get', 'get_indexed_slices', 'get_columns', 'insert', 'remove']
126
+
126
127
  # Depricate usage of CassandraModel under Ruby < 1.9
127
128
  def inherited(base)
128
129
  raise UnsupportedRubyVersion, "Support only Ruby >= 1.9" unless RUBY_VERSION >= "1.9"
@@ -143,14 +144,6 @@ module RightSupport::DB
143
144
  @@config = normalize_config(value) unless value.nil?
144
145
  end
145
146
 
146
- def logger=(l)
147
- @@logger = l
148
- end
149
-
150
- def logger
151
- @@logger
152
- end
153
-
154
147
  # Return current keyspaces name as Array of String
155
148
  #
156
149
  # === Return
@@ -321,13 +314,13 @@ module RightSupport::DB
321
314
  end
322
315
 
323
316
  # This method is an attempt to circumvent the Cassandra gem limitation of returning only 100 columns for wide rows
324
- # This method returns only columns that are within the result set specified by a secondary index equality query
325
- # This method will iterate through chunks of rows of the resultset and it will yield to the caller all of the
317
+ # This method returns only columns that are within the result set specified by a secondary index equality query
318
+ # This method will iterate through chunks of rows of the resultset and it will yield to the caller all of the
326
319
  # columns in chunks of 1,000 until all of the columns have been retrieved
327
320
  #
328
321
  # == Parameters:
329
322
  # @param [String] index column name
330
- # @param [String] index column value
323
+ # @param [String] index column value
331
324
  #
332
325
  # == Yields:
333
326
  # @yield [Array<String, Array<CassandraThrift::ColumnOrSuperColumn>>] irray containing ndex column value passed in and an array of columns matching the index query
@@ -482,12 +475,12 @@ module RightSupport::DB
482
475
  do_op(:batch, *args, &block)
483
476
  end
484
477
 
485
- # Execute Cassandra request
486
- # Automatically reconnect and retry if IOError encountered
478
+ # Perform a Cassandra operation on the connection object.
479
+ # Rescue IOError by automatically reconnecting and retrying the operation.
487
480
  #
488
481
  # === Parameters
489
482
  # meth(Symbol):: Method to be executed
490
- # args(Array):: Method arguments
483
+ # *args(Array):: Method arguments to forward to the Cassandra connection
491
484
  #
492
485
  # === Block
493
486
  # Block if any to be executed by method
@@ -495,12 +488,45 @@ module RightSupport::DB
495
488
  # === Return
496
489
  # (Object):: Value returned by executed method
497
490
  def do_op(meth, *args, &block)
498
- conn.send(meth, *args, &block)
491
+ first_started_at ||= Time.now
492
+ retries ||= 0
493
+ started_at = Time.now
494
+
495
+ # cassandra functionality
496
+ result = conn.send(meth, *args, &block)
497
+
498
+ # log functionality
499
+ do_op_log(first_started_at, started_at, retries, meth, args[0], args[1])
500
+
501
+ return result
499
502
  rescue IOError
500
503
  reconnect
504
+ retries += 1
501
505
  retry
502
506
  end
503
507
 
508
+ def do_op_log(first_started_at, started_at, retries, meth, cf, key)
509
+ now = Time.now
510
+ attempt_time = now - started_at
511
+
512
+ if METHODS_TO_LOG.include?(meth)
513
+ if key.is_a?(Array)
514
+ key_count = key.size
515
+ else
516
+ key_count = 1
517
+ end
518
+
519
+ log_string = sprintf("CassandraModel %s, cf=%s, keys=%d, time=%.1fms", meth, cf, key_count, attempt_time)
520
+
521
+ if retries && retries > 0
522
+ total_time = now - first_started_at
523
+ log_string += sprintf(", retries=%d, total_time=%.1fms", retries, total_time)
524
+ end
525
+
526
+ logger.debug(log_string)
527
+ end
528
+ end
529
+
504
530
  # Reconnect to Cassandra server
505
531
  # Use BinaryProtocolAccelerated if it available
506
532
  #
@@ -256,15 +256,16 @@ module RightSupport::Net
256
256
  return result if complete
257
257
 
258
258
  # Produce a summary message for the exception that gives a bit of detail
259
- summary = []
260
- exceptions.each_pair do |_, list|
259
+ msg = []
260
+ exceptions.each_pair do |endpoint, list|
261
+ summary = []
261
262
  list.each { |e| summary << e.class }
263
+ msg << "'#{endpoint}' => [#{summary.uniq.join(', ')}]"
262
264
  end
263
- summary = summary.uniq.join(', ')
264
- msg = "Request failed after #{n} tries to #{exceptions.keys.size} endpoints. Exceptions: #{summary}"
265
+ message = "Request failed after #{n} tries to #{exceptions.keys.size} endpoints: (#{msg.join(', ')})"
265
266
 
266
- logger.error "RequestBalancer: #{msg}"
267
- raise NoResult.new(msg, exceptions)
267
+ logger.error "RequestBalancer: #{message}"
268
+ raise NoResult.new(message, exceptions)
268
269
  end
269
270
 
270
271
  # Provide an interface so one can query the RequestBalancer for statistics on
@@ -7,8 +7,8 @@ spec = Gem::Specification.new do |s|
7
7
  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
8
8
 
9
9
  s.name = 'right_support'
10
- s.version = '2.6.3'
11
- s.date = '2012-11-08'
10
+ s.version = '2.6.4'
11
+ s.date = '2012-11-11'
12
12
 
13
13
  s.authors = ['Tony Spataro', 'Sergey Sergyenko', 'Ryan Williamson', 'Lee Kirchhoff', 'Sergey Enin', 'Alexey Karpik']
14
14
  s.email = 'support@rightscale.com'
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: 17
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
8
  - 6
9
- - 3
10
- version: 2.6.3
9
+ - 4
10
+ version: 2.6.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tony Spataro
@@ -20,7 +20,7 @@ autorequire:
20
20
  bindir: bin
21
21
  cert_chain: []
22
22
 
23
- date: 2012-11-08 00:00:00 -08:00
23
+ date: 2012-11-11 00:00:00 -08:00
24
24
  default_executable:
25
25
  dependencies: []
26
26