Class: Tarantool::EMDB::OneShardWrite

Inherits:
Object
  • Object
show all
Includes:
ParseIProto
Defined in:
lib/tarantool/em_db.rb

Constant Summary

Constants included from Util::Packer

Util::Packer::INT16, Util::Packer::INT32, Util::Packer::INT64, Util::Packer::INT8, Util::Packer::MAX_INT16, Util::Packer::MAX_INT32, Util::Packer::MAX_INT64, Util::Packer::MAX_INT8, Util::Packer::MAX_SINT16, Util::Packer::MAX_SINT32, Util::Packer::MAX_SINT64, Util::Packer::MAX_SINT8, Util::Packer::MIN_INT, Util::Packer::MIN_SINT16, Util::Packer::MIN_SINT32, Util::Packer::MIN_SINT64, Util::Packer::MIN_SINT8, Util::Packer::SINT16, Util::Packer::SINT32, Util::Packer::SINT64, Util::Packer::SINT8

Instance Method Summary collapse

Methods included from ParseIProto

#_parse_iproto

Constructor Details

#initialize(replicas, response, feed) ⇒ OneShardWrite

Returns a new instance of OneShardWrite.



120
121
122
123
124
125
126
# File 'lib/tarantool/em_db.rb', line 120

def initialize(replicas, response, feed)
  @replicas_origin = replicas
  @replicas = replicas.dup
  @i = replicas.size
  @response = response
  @feed = feed
end

Instance Method Details

#call(result = INITIAL) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/tarantool/em_db.rb', line 135

def call(result=INITIAL)
  result = _parse_iproto(result)  unless result == INITIAL
  case result
  when INITIAL, ::IProto::ConnectionError, ::Tarantool::NonMaster
    rotate!  if Exception === result
    rotate!  until @i <= 0 || (repl = @replicas[0]).could_be_connected?
    if @i <= 0
      EM.next_tick Curry1.new(@feed, NoMasterError.new("no available master connections"))
      return
    end
    repl.send_request(@response.request_type, @response.body, self)
  when Exception
    @feed.call result
  else
    @replicas_origin.replace @replicas
    @feed.call @response.parse_response_for_cb(result)
  end
end

#rotate!Object



128
129
130
131
132
133
# File 'lib/tarantool/em_db.rb', line 128

def rotate!
  if @i > 0
    @i -= 1
    @replicas.rotate!
  end
end