riak-client 2.3.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.document +5 -5
  3. data/Gemfile +17 -17
  4. data/Guardfile +20 -20
  5. data/LICENSE.md +16 -16
  6. data/README.markdown +1 -1
  7. data/RELEASE_NOTES.md +9 -0
  8. data/lib/riak/client/beefcake/crdt/counter_loader.rb +18 -18
  9. data/lib/riak/client/beefcake/crdt/map_loader.rb +64 -64
  10. data/lib/riak/client/beefcake/footer +4 -4
  11. data/lib/riak/client/beefcake/header +6 -6
  12. data/lib/riak/client/beefcake/messages.rb +0 -16
  13. data/lib/riak/client/decaying.rb +36 -36
  14. data/lib/riak/client/feature_detection.rb +120 -120
  15. data/lib/riak/client/instrumentation.rb +19 -19
  16. data/lib/riak/client/node.rb +49 -49
  17. data/lib/riak/client/search.rb +27 -27
  18. data/lib/riak/conflict.rb +13 -13
  19. data/lib/riak/core_ext.rb +7 -7
  20. data/lib/riak/core_ext/blank.rb +53 -53
  21. data/lib/riak/core_ext/extract_options.rb +7 -7
  22. data/lib/riak/core_ext/json.rb +15 -15
  23. data/lib/riak/core_ext/slice.rb +18 -18
  24. data/lib/riak/core_ext/stringify_keys.rb +10 -10
  25. data/lib/riak/core_ext/symbolize_keys.rb +10 -10
  26. data/lib/riak/core_ext/to_param.rb +31 -31
  27. data/lib/riak/crdt.rb +21 -21
  28. data/lib/riak/crdt/operation.rb +19 -19
  29. data/lib/riak/encoding.rb +6 -6
  30. data/lib/riak/errors/backend_creation.rb +9 -9
  31. data/lib/riak/errors/connection_error.rb +50 -50
  32. data/lib/riak/errors/protobuffs_error.rb +11 -11
  33. data/lib/riak/i18n.rb +7 -7
  34. data/lib/riak/instrumentation.rb +6 -6
  35. data/lib/riak/json.rb +52 -52
  36. data/lib/riak/list_buckets.rb +28 -28
  37. data/lib/riak/locale/fr.yml +51 -51
  38. data/lib/riak/map_reduce/results.rb +49 -49
  39. data/lib/riak/map_reduce_error.rb +7 -7
  40. data/lib/riak/multiget.rb +122 -122
  41. data/lib/riak/stamp.rb +77 -77
  42. data/lib/riak/util/tcp_socket_extensions.rb +58 -58
  43. data/lib/riak/version.rb +1 -1
  44. data/spec/failover/failover.rb +59 -59
  45. data/spec/fixtures/bitcask.txt +25 -25
  46. data/spec/fixtures/multipart-basic-conflict.txt +15 -15
  47. data/spec/fixtures/multipart-blank.txt +7 -7
  48. data/spec/fixtures/multipart-mapreduce.txt +10 -10
  49. data/spec/fixtures/multipart-with-body.txt +16 -16
  50. data/spec/fixtures/multipart-with-marked-tombstones.txt +17 -17
  51. data/spec/fixtures/multipart-with-unmarked-tombstone.txt +16 -16
  52. data/spec/fixtures/server.cert.crt +15 -15
  53. data/spec/fixtures/server.cert.key +15 -15
  54. data/spec/fixtures/test.pem +1 -1
  55. data/spec/integration/riak/threading_spec.rb +150 -150
  56. data/spec/integration/yokozuna/index_spec.rb +61 -61
  57. data/spec/integration/yokozuna/schema_spec.rb +49 -49
  58. data/spec/riak/core_ext/to_param_spec.rb +15 -15
  59. data/spec/riak/crdt/inner_counter_spec.rb +21 -21
  60. data/spec/riak/crdt/inner_set_spec.rb +33 -33
  61. data/spec/riak/crdt/set_spec.rb +61 -61
  62. data/spec/riak/escape_spec.rb +72 -72
  63. data/spec/riak/feature_detection_spec.rb +77 -77
  64. data/spec/riak/index_collection_spec.rb +53 -53
  65. data/spec/riak/instrumentation_spec.rb +124 -124
  66. data/spec/riak/link_spec.rb +85 -85
  67. data/spec/riak/list_buckets_spec.rb +41 -41
  68. data/spec/riak/node_spec.rb +26 -26
  69. data/spec/riak/stamp_spec.rb +54 -54
  70. data/spec/support/certs/README.md +12 -12
  71. data/spec/support/certs/ca.crt +21 -21
  72. data/spec/support/certs/client.crl +13 -13
  73. data/spec/support/certs/client.crt +94 -94
  74. data/spec/support/certs/client.csr +18 -18
  75. data/spec/support/certs/client.key +27 -27
  76. data/spec/support/certs/empty_ca.crt +21 -21
  77. data/spec/support/certs/server.crl +13 -13
  78. data/spec/support/certs/server.crt +94 -94
  79. data/spec/support/certs/server.key +27 -27
  80. data/spec/support/integration_setup.rb +10 -10
  81. data/spec/support/test_client.yml.example +9 -9
  82. metadata +3 -3
@@ -1,7 +1,7 @@
1
-
2
- --73NmmA8dJxSB5nL2dVerpFIi8ze
3
- Content-Type: multipart/mixed; boundary=8fPXq9XfV15txMoV1IbA3hovEij
4
-
5
- --8fPXq9XfV15txMoV1IbA3hovEij--
6
-
7
- --73NmmA8dJxSB5nL2dVerpFIi8ze--
1
+
2
+ --73NmmA8dJxSB5nL2dVerpFIi8ze
3
+ Content-Type: multipart/mixed; boundary=8fPXq9XfV15txMoV1IbA3hovEij
4
+
5
+ --8fPXq9XfV15txMoV1IbA3hovEij--
6
+
7
+ --73NmmA8dJxSB5nL2dVerpFIi8ze--
@@ -1,10 +1,10 @@
1
-
2
- --NT6cqYFYCfbYZsocVt15tNWCpG9
3
- Content-Type: application/json
4
-
5
- {"phase":0,"data":["source :gemcutter\n\ngem 'i18n'\ngem 'builder'\ngem 'rspec', \"~>2.0.0\"\ngem 'fakeweb', \">=1.2\"\ngem 'rack', '>=1.0'\ngem 'rake'\ngem 'bundler'\ngem 'excon', \"~>0.3.4\"\n\nif defined? JRUBY_VERSION\n gem 'json'\n gem 'jruby-openssl'\nelse\n gem 'curb', '>=0.6'\n gem 'yajl-ruby'\nend\n\ngroup :integration do\n gem 'activesupport', '~>3.0'\nend\n"]}
6
- --NT6cqYFYCfbYZsocVt15tNWCpG9
7
- Content-Type: application/json
8
-
9
- {"phase":0,"data":["source \"http://rubygems.org\"\n\ngem 'rake'\ngem 'gollum-site'\ngem 'rdiscount'\ngem 'RedCloth'\ngem 'rspec'\n"]}
10
- --NT6cqYFYCfbYZsocVt15tNWCpG9--
1
+
2
+ --NT6cqYFYCfbYZsocVt15tNWCpG9
3
+ Content-Type: application/json
4
+
5
+ {"phase":0,"data":["source :gemcutter\n\ngem 'i18n'\ngem 'builder'\ngem 'rspec', \"~>2.0.0\"\ngem 'fakeweb', \">=1.2\"\ngem 'rack', '>=1.0'\ngem 'rake'\ngem 'bundler'\ngem 'excon', \"~>0.3.4\"\n\nif defined? JRUBY_VERSION\n gem 'json'\n gem 'jruby-openssl'\nelse\n gem 'curb', '>=0.6'\n gem 'yajl-ruby'\nend\n\ngroup :integration do\n gem 'activesupport', '~>3.0'\nend\n"]}
6
+ --NT6cqYFYCfbYZsocVt15tNWCpG9
7
+ Content-Type: application/json
8
+
9
+ {"phase":0,"data":["source \"http://rubygems.org\"\n\ngem 'rake'\ngem 'gollum-site'\ngem 'rdiscount'\ngem 'RedCloth'\ngem 'rspec'\n"]}
10
+ --NT6cqYFYCfbYZsocVt15tNWCpG9--
@@ -1,16 +1,16 @@
1
-
2
- --5EiMOjuGavQ2IbXAqsJPLLfJNlA
3
- Content-Type: multipart/mixed; boundary=7extjTzvYIKVMVHowUiTn0LfvSs
4
-
5
- --7extjTzvYIKVMVHowUiTn0LfvSs
6
- X-Riak-Vclock: a85hYGBgyWDKBVHMr9s3ZzAlMuaxMtyZcPAIH1RYyObHDqiwxIZjcOG1M98chAq3bUQIz7SSFQEKM4FUbwMKZwEA
7
- Location: /riak/foo/baz
8
- Content-Type: text/plain
9
- Link: </riak/foo>; rel="up"
10
- Etag: 6JdI51eFrvv5lDwY6un7a2
11
- Last-Modified: Sat, 16 Jan 2010 22:13:44 GMT
12
-
13
- SCP sloooow....
14
- --7extjTzvYIKVMVHowUiTn0LfvSs--
15
-
16
- --5EiMOjuGavQ2IbXAqsJPLLfJNlA--
1
+
2
+ --5EiMOjuGavQ2IbXAqsJPLLfJNlA
3
+ Content-Type: multipart/mixed; boundary=7extjTzvYIKVMVHowUiTn0LfvSs
4
+
5
+ --7extjTzvYIKVMVHowUiTn0LfvSs
6
+ X-Riak-Vclock: a85hYGBgyWDKBVHMr9s3ZzAlMuaxMtyZcPAIH1RYyObHDqiwxIZjcOG1M98chAq3bUQIz7SSFQEKM4FUbwMKZwEA
7
+ Location: /riak/foo/baz
8
+ Content-Type: text/plain
9
+ Link: </riak/foo>; rel="up"
10
+ Etag: 6JdI51eFrvv5lDwY6un7a2
11
+ Last-Modified: Sat, 16 Jan 2010 22:13:44 GMT
12
+
13
+ SCP sloooow....
14
+ --7extjTzvYIKVMVHowUiTn0LfvSs--
15
+
16
+ --5EiMOjuGavQ2IbXAqsJPLLfJNlA--
@@ -1,17 +1,17 @@
1
-
2
- --ADqgQtdmA5iQgyR5UGzX6V3HZtI
3
- Content-Type: multipart/mixed; boundary=Ljz1mP3hZzqPu6DH1Y4L8k7hfxy
4
-
5
- --Ljz1mP3hZzqPu6DH1Y4L8k7hfxy
6
- X-Riak-Vclock: a85hYGBgzGDKBVIcypz/fvrNPcuWwZTIlMfKIOotdIIvCwA=
7
- Location: /buckets/links/keys/target
8
- Content-Type: application/octet-stream
9
- Link: </buckets/links>; rel="up"
10
- Etag: 5bUNdzHJhZDdCr7KlWxXq
11
- Last-Modified: Tue, 18 Oct 2011 19:10:13 GMT
12
- X-Riak-Deleted: true
13
-
14
-
15
- --Ljz1mP3hZzqPu6DH1Y4L8k7hfxy--
16
-
17
- --ADqgQtdmA5iQgyR5UGzX6V3HZtI--
1
+
2
+ --ADqgQtdmA5iQgyR5UGzX6V3HZtI
3
+ Content-Type: multipart/mixed; boundary=Ljz1mP3hZzqPu6DH1Y4L8k7hfxy
4
+
5
+ --Ljz1mP3hZzqPu6DH1Y4L8k7hfxy
6
+ X-Riak-Vclock: a85hYGBgzGDKBVIcypz/fvrNPcuWwZTIlMfKIOotdIIvCwA=
7
+ Location: /buckets/links/keys/target
8
+ Content-Type: application/octet-stream
9
+ Link: </buckets/links>; rel="up"
10
+ Etag: 5bUNdzHJhZDdCr7KlWxXq
11
+ Last-Modified: Tue, 18 Oct 2011 19:10:13 GMT
12
+ X-Riak-Deleted: true
13
+
14
+
15
+ --Ljz1mP3hZzqPu6DH1Y4L8k7hfxy--
16
+
17
+ --ADqgQtdmA5iQgyR5UGzX6V3HZtI--
@@ -1,16 +1,16 @@
1
-
2
- --CvfrSTCWwIiwezy0Zt1B2zwKgS7
3
- Content-Type: multipart/mixed; boundary=E9n2ZOKHIazIoPHzXj9XsWYWJjJ
4
-
5
- --E9n2ZOKHIazIoPHzXj9XsWYWJjJ
6
- X-Riak-Vclock: a85hYGBgzGDKBVIcypz/fvpN53+WwZTIlMfKcNVJ6ARfFgA=
7
- Location: /buckets/links/keys/target
8
- Content-Type: application/octet-stream
9
- Link: </buckets/links>; rel="up"
10
- Etag: 50FOyLo7juvEVUO33MRJwP
11
- Last-Modified: Tue, 18 Oct 2011 18:35:01 GMT
12
-
13
-
14
- --E9n2ZOKHIazIoPHzXj9XsWYWJjJ--
15
-
16
- --CvfrSTCWwIiwezy0Zt1B2zwKgS7--
1
+
2
+ --CvfrSTCWwIiwezy0Zt1B2zwKgS7
3
+ Content-Type: multipart/mixed; boundary=E9n2ZOKHIazIoPHzXj9XsWYWJjJ
4
+
5
+ --E9n2ZOKHIazIoPHzXj9XsWYWJjJ
6
+ X-Riak-Vclock: a85hYGBgzGDKBVIcypz/fvpN53+WwZTIlMfKcNVJ6ARfFgA=
7
+ Location: /buckets/links/keys/target
8
+ Content-Type: application/octet-stream
9
+ Link: </buckets/links>; rel="up"
10
+ Etag: 50FOyLo7juvEVUO33MRJwP
11
+ Last-Modified: Tue, 18 Oct 2011 18:35:01 GMT
12
+
13
+
14
+ --E9n2ZOKHIazIoPHzXj9XsWYWJjJ--
15
+
16
+ --CvfrSTCWwIiwezy0Zt1B2zwKgS7--
@@ -1,15 +1,15 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIICPzCCAagCCQDfZhEdJjSgTDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJV
3
- UzELMAkGA1UECBMCTkMxEjAQBgNVBAcTCUNoYXJsb3R0ZTEOMAwGA1UEChMFQmFz
4
- aG8xEDAOBgNVBAsTB1N1cHBvcnQxEjAQBgNVBAMTCTEyNy4wLjAuMTAeFw0xMTAz
5
- MjYxNjMzMzNaFw0zODA4MTAxNjMzMzNaMGQxCzAJBgNVBAYTAlVTMQswCQYDVQQI
6
- EwJOQzESMBAGA1UEBxMJQ2hhcmxvdHRlMQ4wDAYDVQQKEwVCYXNobzEQMA4GA1UE
7
- CxMHU3VwcG9ydDESMBAGA1UEAxMJMTI3LjAuMC4xMIGfMA0GCSqGSIb3DQEBAQUA
8
- A4GNADCBiQKBgQCtfHMCsR86HQEAsO52/WvtFWCEigXll0rxYjXvdqeszEPEMFIy
9
- Qlg3GlRxH51YrBzp46ReF9Qv5sf0Nh6SR7HGzlWmMEVfPeuAKcz1fzVcjD+IXWHK
10
- qklAQjpxz+18dvaGxQ7ZJMPsBlq1v64siTLXI0yhjxXOuQPJWrWsvuuXkQIDAQAB
11
- MA0GCSqGSIb3DQEBBQUAA4GBAIqt1A5Ah7s2oUoYQ8YCKC83fKbXbbNCiLFLwIzy
12
- TGYXd8j7JTfeY8ettbtitlYgP+ouf23LzonuMo47GRuMgVKRWm4l+ZVMP5Qbkx9t
13
- uspx+6lHUWnMT9aRdP9/2I7dscyfuhtzs0UxddADLzL9Cif4Y06E1NhR/KK+zo46
14
- Nep8
15
- -----END CERTIFICATE-----
1
+ -----BEGIN CERTIFICATE-----
2
+ MIICPzCCAagCCQDfZhEdJjSgTDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJV
3
+ UzELMAkGA1UECBMCTkMxEjAQBgNVBAcTCUNoYXJsb3R0ZTEOMAwGA1UEChMFQmFz
4
+ aG8xEDAOBgNVBAsTB1N1cHBvcnQxEjAQBgNVBAMTCTEyNy4wLjAuMTAeFw0xMTAz
5
+ MjYxNjMzMzNaFw0zODA4MTAxNjMzMzNaMGQxCzAJBgNVBAYTAlVTMQswCQYDVQQI
6
+ EwJOQzESMBAGA1UEBxMJQ2hhcmxvdHRlMQ4wDAYDVQQKEwVCYXNobzEQMA4GA1UE
7
+ CxMHU3VwcG9ydDESMBAGA1UEAxMJMTI3LjAuMC4xMIGfMA0GCSqGSIb3DQEBAQUA
8
+ A4GNADCBiQKBgQCtfHMCsR86HQEAsO52/WvtFWCEigXll0rxYjXvdqeszEPEMFIy
9
+ Qlg3GlRxH51YrBzp46ReF9Qv5sf0Nh6SR7HGzlWmMEVfPeuAKcz1fzVcjD+IXWHK
10
+ qklAQjpxz+18dvaGxQ7ZJMPsBlq1v64siTLXI0yhjxXOuQPJWrWsvuuXkQIDAQAB
11
+ MA0GCSqGSIb3DQEBBQUAA4GBAIqt1A5Ah7s2oUoYQ8YCKC83fKbXbbNCiLFLwIzy
12
+ TGYXd8j7JTfeY8ettbtitlYgP+ouf23LzonuMo47GRuMgVKRWm4l+ZVMP5Qbkx9t
13
+ uspx+6lHUWnMT9aRdP9/2I7dscyfuhtzs0UxddADLzL9Cif4Y06E1NhR/KK+zo46
14
+ Nep8
15
+ -----END CERTIFICATE-----
@@ -1,15 +1,15 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIICXQIBAAKBgQCtfHMCsR86HQEAsO52/WvtFWCEigXll0rxYjXvdqeszEPEMFIy
3
- Qlg3GlRxH51YrBzp46ReF9Qv5sf0Nh6SR7HGzlWmMEVfPeuAKcz1fzVcjD+IXWHK
4
- qklAQjpxz+18dvaGxQ7ZJMPsBlq1v64siTLXI0yhjxXOuQPJWrWsvuuXkQIDAQAB
5
- AoGBAJIguzdPPgBTId8VKSes+lVupie9oo3qy8NaeBfGGCIixAnisbmHzIpNcUb/
6
- 3CcuggQ4LODcrWvTtiTr2QBZx1FL7E4POBJl/N7zJMaQd+pGjmrJGfv5haSSQN+H
7
- r74Ix3HCd0RPdSgt5pmlT4KfsqkfRmqsPd6Nw54zbyLFMlTpAkEA4ar3ZJi2+Y+u
8
- FH3AycXuPdDtVW0tKFtxfvKlS48gshB6gmkd06Ugss5eZkdbSY0voAp88Tr2shOJ
9
- +pXc++Zl6wJBAMTN9K9k728cVCf41pR6mDVxIaaqjJeY4DWppGQFSqw/fmYz/Quu
10
- PlTvk6pGRYiGN6y9CZFNoL2I/SWcd4ukrXMCQCyfYOHsbKn2Zka5Awki8VQZ3wQ4
11
- XWiQhGXE1ziUqbNsHL1yyaoTCd8xfWseCwgFOficek49CZD22h7JyXOqAFcCQCn2
12
- mFPFu9//NFqJjod+VHIgu0IkX3H7oOMQVwMUtcVgjH0SXMRe1N+bbesCrNTdeYWV
13
- kTKwULPZP9EDOeJGrM0CQQCsX+8VZ15yKTy6ADINrOt26PNpD4ib4552TE6T/1wG
14
- LKdjn5l0qB5K7ILc22z3LCenNBa0Uxbg5/RSdoX57aHA
15
- -----END RSA PRIVATE KEY-----
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIICXQIBAAKBgQCtfHMCsR86HQEAsO52/WvtFWCEigXll0rxYjXvdqeszEPEMFIy
3
+ Qlg3GlRxH51YrBzp46ReF9Qv5sf0Nh6SR7HGzlWmMEVfPeuAKcz1fzVcjD+IXWHK
4
+ qklAQjpxz+18dvaGxQ7ZJMPsBlq1v64siTLXI0yhjxXOuQPJWrWsvuuXkQIDAQAB
5
+ AoGBAJIguzdPPgBTId8VKSes+lVupie9oo3qy8NaeBfGGCIixAnisbmHzIpNcUb/
6
+ 3CcuggQ4LODcrWvTtiTr2QBZx1FL7E4POBJl/N7zJMaQd+pGjmrJGfv5haSSQN+H
7
+ r74Ix3HCd0RPdSgt5pmlT4KfsqkfRmqsPd6Nw54zbyLFMlTpAkEA4ar3ZJi2+Y+u
8
+ FH3AycXuPdDtVW0tKFtxfvKlS48gshB6gmkd06Ugss5eZkdbSY0voAp88Tr2shOJ
9
+ +pXc++Zl6wJBAMTN9K9k728cVCf41pR6mDVxIaaqjJeY4DWppGQFSqw/fmYz/Quu
10
+ PlTvk6pGRYiGN6y9CZFNoL2I/SWcd4ukrXMCQCyfYOHsbKn2Zka5Awki8VQZ3wQ4
11
+ XWiQhGXE1ziUqbNsHL1yyaoTCd8xfWseCwgFOficek49CZD22h7JyXOqAFcCQCn2
12
+ mFPFu9//NFqJjod+VHIgu0IkX3H7oOMQVwMUtcVgjH0SXMRe1N+bbesCrNTdeYWV
13
+ kTKwULPZP9EDOeJGrM0CQQCsX+8VZ15yKTy6ADINrOt26PNpD4ib4552TE6T/1wG
14
+ LKdjn5l0qB5K7ILc22z3LCenNBa0Uxbg5/RSdoX57aHA
15
+ -----END RSA PRIVATE KEY-----
@@ -1 +1 @@
1
- i-am-a-pem
1
+ i-am-a-pem
@@ -1,150 +1,150 @@
1
- require 'spec_helper'
2
-
3
- describe "Multithreaded client", :test_client => true do
4
- class Synchronizer
5
- def initialize(n)
6
- @mutex = Mutex.new
7
- @n = n
8
- @waiting = Set.new
9
- end
10
-
11
- def sync
12
- stop = false
13
- @mutex.synchronize do
14
- @waiting << Thread.current
15
-
16
- if @waiting.size >= @n
17
- # All threads are waiting.
18
- @waiting.each do |t|
19
- t.run
20
- end
21
- else
22
- stop = true
23
- end
24
- end
25
-
26
- if stop
27
- Thread.stop
28
- end
29
- end
30
- end
31
-
32
- def threads(n, opts = {})
33
- if opts[:synchronize]
34
- s1 = Synchronizer.new n
35
- s2 = Synchronizer.new n
36
- end
37
-
38
- threads = (0...n).map do |i|
39
- Thread.new do
40
- if opts[:synchronize]
41
- s1.sync
42
- end
43
-
44
- yield i
45
-
46
- if opts[:synchronize]
47
- s2.sync
48
- end
49
- end
50
- end
51
-
52
- threads.each do |t|
53
- t.join
54
- end
55
- end
56
-
57
- [
58
- {:protobuffs_backend => :Beefcake}
59
- ].each do |opts|
60
- describe opts.inspect do
61
- before do
62
- @bucket = random_bucket 'threading'
63
- end
64
-
65
- it 'gets in parallel' do
66
- data = "the gun is good"
67
- ro = @bucket.new('test')
68
- ro.content_type = "application/json"
69
- ro.data = [data]
70
- ro.store
71
-
72
- threads 10, :synchronize => true do
73
- x = @bucket['test']
74
- expect(x.content_type).to eq("application/json")
75
- expect(x.data).to eq([data])
76
- end
77
- end
78
-
79
- it 'puts in parallel' do
80
- data = "the tabernacle is indestructible and everlasting"
81
-
82
- n = 10
83
- threads n, :synchronize => true do |i|
84
- x = @bucket.new("test-#{i}")
85
- x.content_type = "application/json"
86
- x.data = ["#{data}-#{i}"]
87
- x.store
88
- end
89
-
90
- (0...n).each do |i|
91
- read = @bucket["test-#{i}"]
92
- expect(read.content_type).to eq("application/json")
93
- expect(read.data).to eq(["#{data}-#{i}"])
94
- end
95
- end
96
-
97
- # This is a 1.0+ spec because putting with the same client ID
98
- # will not create siblings on 0.14 in the same way. This will
99
- # also likely fail for nodes with vnode_vclocks = false.
100
- it 'puts conflicts in parallel' do
101
- @bucket.allow_mult = true
102
- expect(@bucket.allow_mult).to eq(true)
103
-
104
- init = @bucket.new('test')
105
- init.content_type = "application/json"
106
- init.data = ''
107
- init.store
108
-
109
- # Create conflicting writes
110
- n = 10
111
- s = Synchronizer.new n
112
- threads n, :synchronize => true do |i|
113
- x = @bucket["test"]
114
- s.sync
115
- x.data = [i]
116
- x.store
117
- end
118
-
119
- read = @bucket["test"]
120
- expect(read.conflict?).to eq(true)
121
- expect(read.siblings.map do |sibling|
122
- sibling.data.first
123
- end.to_set).to eq((0...n).to_set)
124
- end
125
-
126
- it 'lists-keys and gets in parallel', :slow => true do
127
- count = 100
128
- threads = 2
129
-
130
- # Create items
131
- count.times do |i|
132
- o = @bucket.new("#{i}")
133
- o.content_type = 'application/json'
134
- o.data = [i]
135
- o.store
136
- end
137
-
138
- threads(threads) do
139
- set = Set.new
140
- @bucket.keys do |stream|
141
- stream.each do |key|
142
- set.merge @bucket[key].data
143
- end
144
- end
145
- expect(set).to eq((0...count).to_set)
146
- end
147
- end
148
- end
149
- end
150
- end
1
+ require 'spec_helper'
2
+
3
+ describe "Multithreaded client", :test_client => true do
4
+ class Synchronizer
5
+ def initialize(n)
6
+ @mutex = Mutex.new
7
+ @n = n
8
+ @waiting = Set.new
9
+ end
10
+
11
+ def sync
12
+ stop = false
13
+ @mutex.synchronize do
14
+ @waiting << Thread.current
15
+
16
+ if @waiting.size >= @n
17
+ # All threads are waiting.
18
+ @waiting.each do |t|
19
+ t.run
20
+ end
21
+ else
22
+ stop = true
23
+ end
24
+ end
25
+
26
+ if stop
27
+ Thread.stop
28
+ end
29
+ end
30
+ end
31
+
32
+ def threads(n, opts = {})
33
+ if opts[:synchronize]
34
+ s1 = Synchronizer.new n
35
+ s2 = Synchronizer.new n
36
+ end
37
+
38
+ threads = (0...n).map do |i|
39
+ Thread.new do
40
+ if opts[:synchronize]
41
+ s1.sync
42
+ end
43
+
44
+ yield i
45
+
46
+ if opts[:synchronize]
47
+ s2.sync
48
+ end
49
+ end
50
+ end
51
+
52
+ threads.each do |t|
53
+ t.join
54
+ end
55
+ end
56
+
57
+ [
58
+ {:protobuffs_backend => :Beefcake}
59
+ ].each do |opts|
60
+ describe opts.inspect do
61
+ before do
62
+ @bucket = random_bucket 'threading'
63
+ end
64
+
65
+ it 'gets in parallel' do
66
+ data = "the gun is good"
67
+ ro = @bucket.new('test')
68
+ ro.content_type = "application/json"
69
+ ro.data = [data]
70
+ ro.store
71
+
72
+ threads 10, :synchronize => true do
73
+ x = @bucket['test']
74
+ expect(x.content_type).to eq("application/json")
75
+ expect(x.data).to eq([data])
76
+ end
77
+ end
78
+
79
+ it 'puts in parallel' do
80
+ data = "the tabernacle is indestructible and everlasting"
81
+
82
+ n = 10
83
+ threads n, :synchronize => true do |i|
84
+ x = @bucket.new("test-#{i}")
85
+ x.content_type = "application/json"
86
+ x.data = ["#{data}-#{i}"]
87
+ x.store
88
+ end
89
+
90
+ (0...n).each do |i|
91
+ read = @bucket["test-#{i}"]
92
+ expect(read.content_type).to eq("application/json")
93
+ expect(read.data).to eq(["#{data}-#{i}"])
94
+ end
95
+ end
96
+
97
+ # This is a 1.0+ spec because putting with the same client ID
98
+ # will not create siblings on 0.14 in the same way. This will
99
+ # also likely fail for nodes with vnode_vclocks = false.
100
+ it 'puts conflicts in parallel' do
101
+ @bucket.allow_mult = true
102
+ expect(@bucket.allow_mult).to eq(true)
103
+
104
+ init = @bucket.new('test')
105
+ init.content_type = "application/json"
106
+ init.data = ''
107
+ init.store
108
+
109
+ # Create conflicting writes
110
+ n = 10
111
+ s = Synchronizer.new n
112
+ threads n, :synchronize => true do |i|
113
+ x = @bucket["test"]
114
+ s.sync
115
+ x.data = [i]
116
+ x.store
117
+ end
118
+
119
+ read = @bucket["test"]
120
+ expect(read.conflict?).to eq(true)
121
+ expect(read.siblings.map do |sibling|
122
+ sibling.data.first
123
+ end.to_set).to eq((0...n).to_set)
124
+ end
125
+
126
+ it 'lists-keys and gets in parallel', :slow => true do
127
+ count = 100
128
+ threads = 2
129
+
130
+ # Create items
131
+ count.times do |i|
132
+ o = @bucket.new("#{i}")
133
+ o.content_type = 'application/json'
134
+ o.data = [i]
135
+ o.store
136
+ end
137
+
138
+ threads(threads) do
139
+ set = Set.new
140
+ @bucket.keys do |stream|
141
+ stream.each do |key|
142
+ set.merge @bucket[key].data
143
+ end
144
+ end
145
+ expect(set).to eq((0...count).to_set)
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end