PageRenderTime 45ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/RavenFS.Tests/Shard/SimpleSharding.cs

https://github.com/mdavis/ravendb
C# | 254 lines | 214 code | 40 blank | 0 comment | 0 complexity | a1ccbb0c951c30ed175e3d82af56298f MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using Xunit;
  8. using Raven.Json.Linq;
  9. using Raven.Client.FileSystem.Shard;
  10. using Raven.Client.FileSystem;
  11. namespace RavenFS.Tests.Shard
  12. {
  13. public class SimpleSharding : RavenFsTestBase
  14. {
  15. readonly AsyncShardedFilesServerClient shardedClient;
  16. public SimpleSharding()
  17. {
  18. var client1 = NewAsyncClient(0, fileSystemName: "shard1");
  19. var client2 = NewAsyncClient(1, fileSystemName: "shard2");
  20. shardedClient = new AsyncShardedFilesServerClient(new ShardStrategy(new Dictionary<string, IAsyncFilesCommands>
  21. {
  22. {"1", client1},
  23. {"2", client2},
  24. }));
  25. }
  26. [Fact]
  27. public void CanGetSharding()
  28. {
  29. var shards = shardedClient.GetShardsToOperateOn(new ShardRequestData{Keys = new List<string>{"test.bin"}});
  30. Assert.Equal(shards.Count, 2);
  31. }
  32. [Fact]
  33. public async Task CanGetFileFromSharding()
  34. {
  35. var ms = new MemoryStream();
  36. var streamWriter = new StreamWriter(ms);
  37. var expected = new string('a', 1024);
  38. streamWriter.Write(expected);
  39. streamWriter.Flush();
  40. ms.Position = 0;
  41. var newFileName = await shardedClient.UploadAsync("abc.txt", ms);
  42. var ms2 = await shardedClient.DownloadAsync(newFileName);
  43. var actual = new StreamReader(ms2).ReadToEnd();
  44. Assert.Equal(expected, actual);
  45. }
  46. [Fact]
  47. public async Task CanBrowseWithSharding()
  48. {
  49. var ms = new MemoryStream();
  50. var streamWriter = new StreamWriter(ms);
  51. var expected = new string('a', 1024);
  52. streamWriter.Write(expected);
  53. streamWriter.Flush();
  54. ms.Position = 0;
  55. await shardedClient.UploadAsync("a.txt", ms);
  56. await shardedClient.UploadAsync("b.txt", ms);
  57. await shardedClient.UploadAsync("c.txt", ms);
  58. await shardedClient.UploadAsync("d.txt", ms);
  59. await shardedClient.UploadAsync("e.txt", ms);
  60. var pagingInfo = new ShardPagingInfo(shardedClient.NumberOfShards);
  61. var result = await shardedClient.BrowseAsync(2, pagingInfo);
  62. Assert.Equal(2, result.Length);
  63. pagingInfo.CurrentPage++;
  64. result = await shardedClient.BrowseAsync(2, pagingInfo);
  65. Assert.Equal(2, result.Length);
  66. pagingInfo.CurrentPage++;
  67. result = await shardedClient.BrowseAsync(2, pagingInfo);
  68. Assert.Equal(1, result.Length);
  69. pagingInfo.CurrentPage++;
  70. result = await shardedClient.BrowseAsync(2, pagingInfo);
  71. Assert.Equal(0, result.Length);
  72. }
  73. [Fact]
  74. public async Task CanBrowseToAdvancedPageWithSharding()
  75. {
  76. var ms = new MemoryStream();
  77. var streamWriter = new StreamWriter(ms);
  78. var expected = new string('a', 1024);
  79. streamWriter.Write(expected);
  80. streamWriter.Flush();
  81. ms.Position = 0;
  82. await shardedClient.UploadAsync("a.txt", ms);
  83. await shardedClient.UploadAsync("b.txt", ms);
  84. await shardedClient.UploadAsync("c.txt", ms);
  85. await shardedClient.UploadAsync("d.txt", ms);
  86. await shardedClient.UploadAsync("e.txt", ms);
  87. var pagingInfo = new ShardPagingInfo(shardedClient.NumberOfShards) { CurrentPage = 2 };
  88. var result = await shardedClient.BrowseAsync(2, pagingInfo);
  89. Assert.Equal(1, result.Length);
  90. pagingInfo.CurrentPage++;
  91. result = await shardedClient.BrowseAsync(2, pagingInfo);
  92. Assert.Equal(0, result.Length);
  93. }
  94. [Fact]
  95. public async Task CanNotBrowseToPageFarAway()
  96. {
  97. var ms = new MemoryStream();
  98. var streamWriter = new StreamWriter(ms);
  99. var expected = new string('a', 1024);
  100. streamWriter.Write(expected);
  101. streamWriter.Flush();
  102. ms.Position = 0;
  103. await shardedClient.UploadAsync("a.txt", ms);
  104. await shardedClient.UploadAsync("b.txt", ms);
  105. await shardedClient.UploadAsync("c.txt", ms);
  106. await shardedClient.UploadAsync("d.txt", ms);
  107. await shardedClient.UploadAsync("e.txt", ms);
  108. var pagingInfo = new ShardPagingInfo(shardedClient.NumberOfShards) { CurrentPage = 20 };
  109. try
  110. {
  111. await shardedClient.BrowseAsync(2, pagingInfo);
  112. Assert.Equal(true, false);//Should not get here
  113. }
  114. catch (Exception exception)
  115. {
  116. Assert.IsType<InvalidOperationException>(exception);
  117. }
  118. }
  119. private Stream StreamOfLength(int length)
  120. {
  121. var memoryStream = new MemoryStream(Enumerable.Range(0, length).Select(i => (byte)i).ToArray());
  122. return memoryStream;
  123. }
  124. [Fact]
  125. public async Task CanSearchForFilesBySizeWithSharding()
  126. {
  127. var name1 = await shardedClient.UploadAsync("1", StreamOfLength(1));
  128. var name2 = await shardedClient.UploadAsync("2", StreamOfLength(2));
  129. var name3 = await shardedClient.UploadAsync("3", StreamOfLength(3));
  130. var name4 = await shardedClient.UploadAsync("4", StreamOfLength(4));
  131. var name5 = await shardedClient.UploadAsync("5", StreamOfLength(5));
  132. var result = await shardedClient.SearchAsync("__size_numeric:[2 TO 4]");
  133. var files = result.Files;
  134. var fileNames = files.Select(f => f.FullPath).ToArray();
  135. Assert.Equal(3, result.FileCount);
  136. Assert.Contains(name2, fileNames);
  137. Assert.Contains(name3, fileNames);
  138. Assert.Contains(name4, fileNames);
  139. }
  140. [Fact]
  141. public async Task CanSearchForFilesBySizeWithShardingWithFields()
  142. {
  143. var name1 = await shardedClient.UploadAsync("111", StreamOfLength(100));
  144. var name2 = await shardedClient.UploadAsync("2", StreamOfLength(2));
  145. var name3 = await shardedClient.UploadAsync("33", StreamOfLength(3));
  146. var name4 = await shardedClient.UploadAsync("4", StreamOfLength(4));
  147. var name5 = await shardedClient.UploadAsync("55555", StreamOfLength(5));
  148. var result = await shardedClient.SearchAsync("", new []{"__size"});
  149. var files = result.Files;
  150. var fileNames = files.Select(f => f.FullPath).ToArray();
  151. Assert.Equal(new[] {name2, name3, name4, name5, name1 }, fileNames);
  152. }
  153. [Fact]
  154. public async Task CanSearchForFilesBySizeWithShardingWithFieldsDecending()
  155. {
  156. var name1 = await shardedClient.UploadAsync("111", StreamOfLength(100));
  157. var name2 = await shardedClient.UploadAsync("2", StreamOfLength(2));
  158. var name3 = await shardedClient.UploadAsync("33", StreamOfLength(3));
  159. var name4 = await shardedClient.UploadAsync("4", StreamOfLength(4));
  160. var name5 = await shardedClient.UploadAsync("55555", StreamOfLength(5));
  161. var result = await shardedClient.SearchAsync("", new[] { "-__size" });
  162. var files = result.Files;
  163. var fileNames = files.Select(f => f.FullPath).ToArray();
  164. Assert.Equal(new[] { name2, name3, name4, name5, name1 }.Reverse(), fileNames);
  165. }
  166. [Fact]
  167. public async Task CanSearchForFilesByMetadataWithShardingWithFields()
  168. {
  169. await shardedClient.UploadAsync("111", new RavenJObject { { "Active", "true" } }, StreamOfLength(100));
  170. await shardedClient.UploadAsync("2", new RavenJObject { { "Active", "false" } }, StreamOfLength(2));
  171. await shardedClient.UploadAsync("33", new RavenJObject { { "Active", "false" } }, StreamOfLength(3));
  172. await shardedClient.UploadAsync("4", new RavenJObject { { "Active", "false" } }, StreamOfLength(4));
  173. await shardedClient.UploadAsync("55555", new RavenJObject { { "Active", "true" } }, StreamOfLength(5));
  174. var result = await shardedClient.SearchAsync("", new[] { "Active" });
  175. var files = result.Files;
  176. Assert.Equal("false", files[0].Metadata["Active"]);
  177. Assert.Equal("false", files[1].Metadata["Active"]);
  178. Assert.Equal("false", files[2].Metadata["Active"]);
  179. Assert.Equal("true", files[3].Metadata["Active"]);
  180. Assert.Equal("true", files[4].Metadata["Active"]);
  181. }
  182. [Fact]
  183. public async Task CanSearchForFilesByMetadataWithShardingWithFieldsDecending()
  184. {
  185. await shardedClient.UploadAsync("111", new RavenJObject { { "Active", "true" } }, StreamOfLength(100));
  186. await shardedClient.UploadAsync("2", new RavenJObject { { "Active", "false" } }, StreamOfLength(2));
  187. await shardedClient.UploadAsync("33", new RavenJObject { { "Active", "false" } }, StreamOfLength(3));
  188. await shardedClient.UploadAsync("4", new RavenJObject { { "Active", "false" } }, StreamOfLength(4));
  189. await shardedClient.UploadAsync("55555", new RavenJObject { { "Active", "true" } }, StreamOfLength(5));
  190. var result = await shardedClient.SearchAsync("", new[] { "-Active" });
  191. var files = result.Files;
  192. Assert.Equal("true", files[0].Metadata["Active"]);
  193. Assert.Equal("true", files[1].Metadata["Active"]);
  194. Assert.Equal("false", files[2].Metadata["Active"]);
  195. Assert.Equal("false", files[3].Metadata["Active"]);
  196. Assert.Equal("false", files[4].Metadata["Active"]);
  197. }
  198. [Fact]
  199. public async Task CanTakeStats()
  200. {
  201. await shardedClient.UploadAsync("111", new RavenJObject { { "Active", "true" } }, StreamOfLength(100));
  202. await shardedClient.UploadAsync("2", new RavenJObject { { "Active", "false" } }, StreamOfLength(2));
  203. await shardedClient.UploadAsync("33", new RavenJObject { { "Active", "false" } }, StreamOfLength(3));
  204. await shardedClient.UploadAsync("4", new RavenJObject { { "Active", "false" } }, StreamOfLength(4));
  205. await shardedClient.UploadAsync("55555", new RavenJObject { { "Active", "true" } }, StreamOfLength(5));
  206. var stats = await shardedClient.StatsAsync();
  207. Assert.NotNull(stats);
  208. Assert.Equal("shard1;shard2", stats.Name);
  209. Assert.NotNull(stats.Metrics);
  210. Assert.Equal(0, stats.ActiveSyncs.Count);
  211. Assert.Equal(0, stats.PendingSyncs.Count);
  212. }
  213. }
  214. }