/ToMigrate/Raven.Tests/Storage/Voron/StalenessStorageActionsTests.cs

https://github.com/fitzchak/ravendb · C# · 366 lines · 292 code · 69 blank · 5 comment · 0 complexity · ecaf4b7f7881a2d9f8791f4bd54934e2 MD5 · raw file

  1. // -----------------------------------------------------------------------
  2. // <copyright file="StalenessStorageActionsTests.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. // -----------------------------------------------------------------------
  6. using Raven.Tests.Common;
  7. namespace Raven.Tests.Storage.Voron
  8. {
  9. using System;
  10. using System.Collections.Generic;
  11. using System.IO;
  12. using System.Text;
  13. using Raven.Abstractions.Data;
  14. using Raven.Abstractions.Exceptions;
  15. using Raven.Database.Storage;
  16. using Raven.Database.Tasks;
  17. using Raven.Json.Linq;
  18. using Xunit;
  19. using Xunit.Extensions;
  20. public class StalenessStorageActionsTests : TransactionalStorageTestBase
  21. {
  22. [Theory]
  23. [PropertyData("Storages")]
  24. public void GetIndexTouchCount(string requestedStorage)
  25. {
  26. using (var storage = NewTransactionalStorage(requestedStorage))
  27. {
  28. storage.Batch(accessor =>
  29. {
  30. var count = accessor.Staleness.GetIndexTouchCount(101);
  31. Assert.Equal(-1, count);
  32. });
  33. storage.Batch(accessor => accessor.Indexing.AddIndex(101, true));
  34. storage.Batch(accessor =>
  35. {
  36. var count = accessor.Staleness.GetIndexTouchCount(101);
  37. Assert.Equal(0, count);
  38. });
  39. storage.Batch(accessor => accessor.Indexing.TouchIndexEtag(101));
  40. storage.Batch(accessor => accessor.Indexing.TouchIndexEtag(101));
  41. storage.Batch(accessor =>
  42. {
  43. var count = accessor.Staleness.GetIndexTouchCount(101);
  44. Assert.Equal(2, count);
  45. });
  46. }
  47. }
  48. [Theory]
  49. [PropertyData("Storages")]
  50. public void GetMostRecentAttachmentEtag(string requestedStorage)
  51. {
  52. using (var storage = NewTransactionalStorage(requestedStorage))
  53. {
  54. storage.Batch(accessor => Assert.Equal(Etag.Empty, accessor.Staleness.GetMostRecentAttachmentEtag()));
  55. var etag1 = Etag.Parse("02000000-0000-0000-0000-000000000001");
  56. var etag2 = Etag.Parse("02000000-0000-0000-0000-000000000002");
  57. var etag3 = Etag.Parse("02000000-0000-0000-0000-000000000003");
  58. storage.Batch(accessor => accessor.Attachments.AddAttachment("key1", etag1, StreamFor("123"), new RavenJObject()));
  59. storage.Batch(accessor => Assert.Equal(etag1, accessor.Staleness.GetMostRecentAttachmentEtag()));
  60. storage.Batch(accessor =>
  61. {
  62. accessor.Attachments.AddAttachment("key2", etag2, StreamFor("123"), new RavenJObject());
  63. accessor.Attachments.AddAttachment("key3", etag3, StreamFor("123"), new RavenJObject());
  64. });
  65. storage.Batch(accessor => Assert.Equal(etag3, accessor.Staleness.GetMostRecentAttachmentEtag()));
  66. }
  67. }
  68. [Theory]
  69. [PropertyData("Storages")]
  70. public void GetMostRecentDocumentEtag(string requestedStorage)
  71. {
  72. using (var storage = NewTransactionalStorage(requestedStorage))
  73. {
  74. storage.Batch(accessor => Assert.Equal(Etag.Empty, accessor.Staleness.GetMostRecentDocumentEtag()));
  75. var etag1 = Etag.Parse("01000000-0000-0000-0000-000000000001");
  76. var etag2 = Etag.Parse("01000000-0000-0000-0000-000000000002");
  77. var etag3 = Etag.Parse("01000000-0000-0000-0000-000000000003");
  78. storage.Batch(accessor => accessor.Documents.AddDocument("key1", Etag.Empty, new RavenJObject(), new RavenJObject()));
  79. storage.Batch(accessor => Assert.Equal(etag1, accessor.Staleness.GetMostRecentDocumentEtag()));
  80. storage.Batch(accessor =>
  81. {
  82. accessor.Documents.AddDocument("key2", Etag.Empty, new RavenJObject(), new RavenJObject());
  83. accessor.Documents.AddDocument("key3", Etag.Empty, new RavenJObject(), new RavenJObject());
  84. });
  85. storage.Batch(accessor => Assert.Equal(etag3, accessor.Staleness.GetMostRecentDocumentEtag()));
  86. }
  87. }
  88. [Theory]
  89. [PropertyData("Storages")]
  90. public void IndexLastUpdatedAt(string requestedStorage)
  91. {
  92. using (var storage = NewTransactionalStorage(requestedStorage))
  93. {
  94. var etag1 = Etag.Parse("00000000-0000-0000-0000-000000000001");
  95. var etag2 = Etag.Parse("00000000-0000-0000-0000-000000000002");
  96. var etag3 = Etag.Parse("00000000-0000-0000-0000-000000000003");
  97. var date1 = DateTime.Now;
  98. var date2 = DateTime.Now.AddSeconds(100);
  99. var date3 = DateTime.Now.AddSeconds(1000);
  100. storage.Batch(accessor => Assert.Throws<IndexDoesNotExistsException>(() => accessor.Staleness.IndexLastUpdatedAt(101)));
  101. storage.Batch(accessor =>
  102. {
  103. accessor.Indexing.AddIndex(101, false);
  104. accessor.Indexing.AddIndex(202, true);
  105. });
  106. storage.Batch(accessor =>
  107. {
  108. var r1 = accessor.Staleness.IndexLastUpdatedAt(101);
  109. var r2 = accessor.Staleness.IndexLastUpdatedAt(202);
  110. Assert.Equal(DateTime.MinValue, r1.Item1);
  111. Assert.Equal(Etag.Empty, r1.Item2);
  112. Assert.Equal(DateTime.MinValue, r2.Item1);
  113. Assert.Equal(Etag.Empty, r2.Item2);
  114. });
  115. storage.Batch(accessor =>
  116. {
  117. accessor.Indexing.UpdateLastIndexed(101, etag1, date1);
  118. accessor.Indexing.UpdateLastIndexed(202, etag2, date2);
  119. });
  120. storage.Batch(accessor =>
  121. {
  122. var r1 = accessor.Staleness.IndexLastUpdatedAt(101);
  123. var r2 = accessor.Staleness.IndexLastUpdatedAt(202);
  124. Assert.Equal(date1, r1.Item1);
  125. Assert.Equal(etag1, r1.Item2);
  126. Assert.Equal(DateTime.MinValue, r2.Item1);
  127. Assert.Equal(Etag.Empty, r2.Item2);
  128. });
  129. storage.Batch(accessor => accessor.Indexing.UpdateLastReduced(202, etag3, date3));
  130. storage.Batch(accessor =>
  131. {
  132. var r2 = accessor.Staleness.IndexLastUpdatedAt(202);
  133. Assert.Equal(date3, r2.Item1);
  134. Assert.Equal(etag3, r2.Item2);
  135. });
  136. }
  137. }
  138. [Theory]
  139. [PropertyData("Storages")]
  140. public void IsMapStale(string requestedStorage)
  141. {
  142. using (var storage = NewTransactionalStorage(requestedStorage))
  143. {
  144. storage.Batch(accessor => Assert.False(accessor.Staleness.IsMapStale(101)));
  145. var etag1 = Etag.Parse("01000000-0000-0000-0000-000000000001");
  146. var etag2 = Etag.Parse("01000000-0000-0000-0000-000000000002");
  147. var etag3 = Etag.Parse("01000000-0000-0000-0000-000000000003");
  148. var date1 = DateTime.Now;
  149. var date2 = DateTime.Now.AddSeconds(100);
  150. var date3 = DateTime.Now.AddSeconds(1000);
  151. storage.Batch(accessor =>
  152. {
  153. accessor.Indexing.AddIndex(101, false);
  154. accessor.Indexing.AddIndex(202, true);
  155. });
  156. storage.Batch(accessor =>
  157. {
  158. Assert.False(accessor.Staleness.IsMapStale(101));
  159. Assert.False(accessor.Staleness.IsMapStale(202));
  160. });
  161. storage.Batch(accessor => accessor.Documents.AddDocument("key1", Etag.Empty, new RavenJObject(), new RavenJObject()));
  162. storage.Batch(accessor =>
  163. {
  164. Assert.True(accessor.Staleness.IsMapStale(101));
  165. Assert.True(accessor.Staleness.IsMapStale(202));
  166. });
  167. storage.Batch(accessor =>
  168. {
  169. accessor.Indexing.UpdateLastIndexed(101, etag1, date1);
  170. accessor.Indexing.UpdateLastIndexed(202, etag1, date1);
  171. });
  172. storage.Batch(accessor =>
  173. {
  174. Assert.False(accessor.Staleness.IsMapStale(101));
  175. Assert.False(accessor.Staleness.IsMapStale(202));
  176. });
  177. storage.Batch(accessor => accessor.Documents.AddDocument("key2", Etag.Empty, new RavenJObject(), new RavenJObject()));
  178. storage.Batch(accessor =>
  179. {
  180. Assert.True(accessor.Staleness.IsMapStale(101));
  181. Assert.True(accessor.Staleness.IsMapStale(202));
  182. });
  183. }
  184. }
  185. [Theory]
  186. [PropertyData("Storages")]
  187. public void IsReduceStale(string requestedStorage)
  188. {
  189. using (var storage = NewTransactionalStorage(requestedStorage))
  190. {
  191. storage.Batch(accessor => Assert.False(accessor.Staleness.IsReduceStale(101)));
  192. storage.Batch(accessor => accessor.MapReduce.ScheduleReductions(101, 0, new ReduceKeyAndBucket(1, "reduceKey1")));
  193. storage.Batch(accessor => Assert.True(accessor.Staleness.IsReduceStale(101)));
  194. storage.Batch(accessor => accessor.MapReduce.DeleteScheduledReduction(101, 0, "reduceKey1"));
  195. storage.Batch(accessor => Assert.False(accessor.Staleness.IsReduceStale(101)));
  196. }
  197. }
  198. [Theory]
  199. [PropertyData("Storages")]
  200. public void IsIndexStale1(string requestedStorage)
  201. {
  202. using (var storage = NewTransactionalStorage(requestedStorage))
  203. {
  204. var etag1 = Etag.Parse("00000000-0000-0000-0000-000000000001");
  205. var etag2 = Etag.Parse("00000000-0000-0000-0000-000000000002");
  206. var etag3 = Etag.Parse("00000000-0000-0000-0000-000000000003");
  207. storage.Batch(accessor => Assert.False(accessor.Staleness.IsIndexStale(101, null, null)));
  208. storage.Batch(accessor =>
  209. {
  210. accessor.Indexing.AddIndex(101, false);
  211. accessor.Documents.AddDocument("key1", Etag.Empty, new RavenJObject(), new RavenJObject());
  212. accessor.Documents.AddDocument("key2", Etag.Empty, new RavenJObject(), new RavenJObject());
  213. accessor.Documents.AddDocument("key3", Etag.Empty, new RavenJObject(), new RavenJObject());
  214. });
  215. var date0 = DateTime.Now.AddSeconds(-10);
  216. var date1 = DateTime.Now;
  217. var date2 = DateTime.Now.AddSeconds(100);
  218. var date3 = DateTime.Now.AddSeconds(1000);
  219. storage.Batch(accessor => Assert.True(accessor.Staleness.IsIndexStale(101, null, null)));
  220. storage.Batch(accessor => accessor.Indexing.UpdateLastIndexed(101, etag2, date2));
  221. storage.Batch(accessor =>
  222. {
  223. Assert.False(accessor.Staleness.IsIndexStale(101, date0, null));
  224. Assert.False(accessor.Staleness.IsIndexStale(101, date1, null));
  225. Assert.True(accessor.Staleness.IsIndexStale(101, date2, null));
  226. Assert.False(accessor.Staleness.IsIndexStale(101, null, etag1));
  227. Assert.False(accessor.Staleness.IsIndexStale(101, null, etag2));
  228. Assert.True(accessor.Staleness.IsIndexStale(101, null, etag3));
  229. });
  230. storage.Batch(accessor =>
  231. {
  232. accessor.Indexing.UpdateLastIndexed(101, etag3, date3);
  233. accessor.Tasks.AddTask(new RemoveFromIndexTask(101), date1);
  234. });
  235. storage.Batch(accessor =>
  236. {
  237. Assert.True(accessor.Staleness.IsIndexStale(101, null, null));
  238. Assert.False(accessor.Staleness.IsIndexStale(101, date0, null));
  239. Assert.True(accessor.Staleness.IsIndexStale(101, date1, null));
  240. Assert.True(accessor.Staleness.IsIndexStale(101, date2, null));
  241. });
  242. }
  243. }
  244. [Theory]
  245. [PropertyData("Storages")]
  246. public void IsIndexStale2(string requestedStorage)
  247. {
  248. using (var storage = NewTransactionalStorage(requestedStorage))
  249. {
  250. var etag1 = Etag.Parse("00000000-0000-0000-0000-000000000001");
  251. var etag2 = Etag.Parse("00000000-0000-0000-0000-000000000002");
  252. var etag3 = Etag.Parse("00000000-0000-0000-0000-000000000003");
  253. storage.Batch(accessor => Assert.False(accessor.Staleness.IsIndexStale(101, null, null)));
  254. storage.Batch(accessor =>
  255. {
  256. accessor.Indexing.AddIndex(101, true);
  257. accessor.MapReduce.ScheduleReductions(101, 0, new ReduceKeyAndBucket(1, "reduceKey1"));
  258. });
  259. var date0 = DateTime.Now.AddSeconds(-10);
  260. var date1 = DateTime.Now;
  261. var date2 = DateTime.Now.AddSeconds(100);
  262. var date3 = DateTime.Now.AddSeconds(1000);
  263. storage.Batch(accessor => Assert.True(accessor.Staleness.IsIndexStale(101, null, null)));
  264. storage.Batch(accessor =>
  265. {
  266. accessor.Indexing.UpdateLastIndexed(101, etag2, date2);
  267. accessor.Indexing.UpdateLastReduced(101, etag2, date2);
  268. });
  269. storage.Batch(accessor =>
  270. {
  271. Assert.False(accessor.Staleness.IsIndexStale(101, date0, null));
  272. Assert.False(accessor.Staleness.IsIndexStale(101, date1, null));
  273. Assert.True(accessor.Staleness.IsIndexStale(101, date2, null));
  274. Assert.False(accessor.Staleness.IsIndexStale(101, null, etag1));
  275. Assert.False(accessor.Staleness.IsIndexStale(101, null, etag2));
  276. Assert.True(accessor.Staleness.IsIndexStale(101, null, etag3));
  277. });
  278. storage.Batch(accessor =>
  279. {
  280. accessor.MapReduce.DeleteScheduledReduction(101, 0, "reduceKey1");
  281. accessor.Tasks.AddTask(new RemoveFromIndexTask(101), date1);
  282. });
  283. storage.Batch(accessor =>
  284. {
  285. Assert.True(accessor.Staleness.IsIndexStale(101, null, null));
  286. Assert.False(accessor.Staleness.IsIndexStale(101, date0, null));
  287. Assert.True(accessor.Staleness.IsIndexStale(101, date1, null));
  288. Assert.True(accessor.Staleness.IsIndexStale(101, date2, null));
  289. });
  290. }
  291. }
  292. private Stream StreamFor(string val)
  293. {
  294. return new MemoryStream(Encoding.UTF8.GetBytes(val));
  295. }
  296. }
  297. }