riak-ripple / ripple

A rich Ruby modeling layer for Riak, Basho's distributed database
Other
621 stars 152 forks source link

Conflicts with "deleted" sibling cause error during deserialization #289

Open paukul opened 12 years ago

paukul commented 12 years ago

Example:

1.9.2p320 :003 > Activities::Activity.find('189510106')
NoMethodError: undefined method `[]' for nil:NilClass
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/serializers.rb:25:in `serializer_for'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/serializers.rb:19:in `deserialize'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/robject.rb:253:in `deserialize'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/robject.rb:143:in `data'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/bundler/gems/ripple-b6b370876d39/lib/ripple/conflict/resolver.rb:14:in `block (2 levels) in to_proc'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/bundler/gems/ripple-b6b370876d39/lib/ripple/conflict/resolver.rb:14:in `map'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/bundler/gems/ripple-b6b370876d39/lib/ripple/conflict/resolver.rb:14:in `block in to_proc'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/robject.rb:80:in `call'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/robject.rb:80:in `block in attempt_conflict_resolution'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/robject.rb:79:in `each'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/robject.rb:79:in `attempt_conflict_resolution'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/client/beefcake/object_methods.rb:42:in `load_object'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/client/beefcake_protobuffs_backend.rb:156:in `decode_response'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/client/beefcake_protobuffs_backend.rb:38:in `fetch_object'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/client.rb:278:in `block in get_object'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/client.rb:433:in `block in recover_from'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/client/pool.rb:126:in `take'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/client.rb:431:in `recover_from'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/client.rb:377:in `protobuffs'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/client.rb:131:in `backend'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/client.rb:277:in `get_object'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/gems/riak-client-1.0.3/lib/riak/bucket.rb:88:in `get'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/bundler/gems/ripple-b6b370876d39/lib/ripple/document/finders.rb:113:in `find_one'
  from /Users/stefan.kaes/.rvm/gems/ruby-1.9.2-p320@activities/bundler/gems/ripple-b6b370876d39/lib/ripple/document/finders.rb:55:in `find'

When we request the object and it's siblings via the HTTP api:

$curl "http://...../buckets/activities/keys/189510106"
Siblings:
585vMWeup4kgDaf0JsLkMS
2dpIA3DWRw4AkS0BjzYdeW

SIBLING 1:

$ curl -I "http://...../buckets/activities/keys/189510106?vtag=585vMWeup4kgDaf0JsLkMS"
HTTP/1.1 200 OK
X-Riak-Vclock: a85hYGBgymDKBVIccUmys/xXeizOYEpkzGNlEPghd5IPKqW54O5D/5WegkApJqCUM0gqCwA=
Vary: Accept-Encoding
Server: MochiWeb/1.1 WebMachine/1.9.0 (someone had painted it blue)
Link: </buckets/activities>; rel="up"
Last-Modified: Wed, 09 May 2012 14:16:35 GMT
ETag: "585vMWeup4kgDaf0JsLkMS"
Date: Wed, 09 May 2012 15:33:21 GMT
Content-Type: application/octet-stream
Content-Length: 0

SIBLING 2:

$ curl -I "http://....../buckets/activities/keys/189510106?vtag=2dpIA3DWRw4AkS0BjzYdeW"
HTTP/1.1 200 OK
X-Riak-Vclock: a85hYGBgymDKBVIccUmys/xXeizOYEpkzGNlEPghd5IPKqW54O5D/5WegkApJqCUM0gqCwA=
Vary: Accept-Encoding
Server: MochiWeb/1.1 WebMachine/1.9.0 (someone had painted it blue)
Link: </buckets/activities>; rel="up"
Last-Modified: Wed, 09 May 2012 14:16:35 GMT
ETag: "2dpIA3DWRw4AkS0BjzYdeW"
Date: Wed, 09 May 2012 15:36:10 GMT
Content-Type: application/json; charset=US-ASCII

the second sibling gets send with content type application/octet-stream and content-length 0. The serializer maps (https://github.com/seancribbs/ripple/blob/master/lib/ripple/conflict/resolver.rb#L14) over the siblings which causes riak-client to barf because there's no deserializer for application/octet-stream.

paukul commented 12 years ago

/cc @skaes