riak-client 2.3.0 → 2.3.1

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.
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