PageRenderTime 48ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/Raven.Database/Server/RavenFS/RavenFileSystem.cs

https://github.com/nwendel/ravendb
C# | 239 lines | 208 code | 31 blank | 0 comment | 4 complexity | edc130133dc1a38680279755c36a8371 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, BSD-3-Clause, CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using Raven.Abstractions.Data;
  4. using System.Collections.Specialized;
  5. using System.Diagnostics;
  6. using System.IO;
  7. using System.Linq;
  8. using Raven.Abstractions.Util.Streams;
  9. using Raven.Database.Config;
  10. using Raven.Database.Server.Connections;
  11. using Raven.Database.Server.RavenFS.Extensions;
  12. using Raven.Database.Server.RavenFS.Infrastructure;
  13. using Raven.Database.Server.RavenFS.Notifications;
  14. using Raven.Database.Util;
  15. using Raven.Database.Server.RavenFS.Search;
  16. using Raven.Database.Server.RavenFS.Storage;
  17. using Raven.Database.Server.RavenFS.Synchronization;
  18. using Raven.Database.Server.RavenFS.Synchronization.Conflictuality;
  19. using Raven.Database.Server.RavenFS.Synchronization.Rdc.Wrapper;
  20. using Raven.Json.Linq;
  21. using Raven.Abstractions.FileSystem;
  22. namespace Raven.Database.Server.RavenFS
  23. {
  24. public class RavenFileSystem : IDisposable
  25. {
  26. private readonly ConflictArtifactManager conflictArtifactManager;
  27. private readonly ConflictDetector conflictDetector;
  28. private readonly ConflictResolver conflictResolver;
  29. private readonly FileLockManager fileLockManager;
  30. private readonly Historian historian;
  31. private readonly NotificationPublisher notificationPublisher;
  32. private readonly IndexStorage search;
  33. private readonly SigGenerator sigGenerator;
  34. private readonly ITransactionalStorage storage;
  35. private readonly StorageOperationsTask storageOperationsTask;
  36. private readonly SynchronizationTask synchronizationTask;
  37. private readonly InMemoryRavenConfiguration systemConfiguration;
  38. private readonly TransportState transportState;
  39. private readonly MetricsCountersManager metricsCounters;
  40. public string Name { get; private set; }
  41. public RavenFileSystem(InMemoryRavenConfiguration systemConfiguration, string name, TransportState recievedTransportState = null)
  42. {
  43. this.Name = name;
  44. this.systemConfiguration = systemConfiguration;
  45. var storageType = systemConfiguration.DefaultFileSystemStorageTypeName;
  46. if (string.Equals(InMemoryRavenConfiguration.VoronTypeName, storageType, StringComparison.OrdinalIgnoreCase) == false)
  47. {
  48. if (Directory.Exists(systemConfiguration.FileSystemDataDirectory) &&
  49. Directory.EnumerateFileSystemEntries(systemConfiguration.FileSystemDataDirectory).Any())
  50. throw new InvalidOperationException(
  51. string.Format(
  52. "We do not allow to run on a storage engine other then Voron, while we are in the early pre-release phase of RavenDB 3.0. You are currently running on {0}",
  53. storageType));
  54. Trace.WriteLine("Forcing filesystem to run on Voron - pre release behavior only, mind " + Path.GetFileName(Path.GetDirectoryName(systemConfiguration.FileSystemDataDirectory)));
  55. storageType = InMemoryRavenConfiguration.VoronTypeName;
  56. }
  57. storage = CreateTransactionalStorage(storageType, systemConfiguration);
  58. search = new IndexStorage(systemConfiguration.FileSystemIndexStoragePath, systemConfiguration.Settings);
  59. sigGenerator = new SigGenerator();
  60. var replicationHiLo = new SynchronizationHiLo(storage);
  61. var sequenceActions = new SequenceActions(storage);
  62. transportState = recievedTransportState ?? new TransportState();
  63. notificationPublisher = new NotificationPublisher(transportState);
  64. fileLockManager = new FileLockManager();
  65. storage.Initialize();
  66. search.Initialize();
  67. var uuidGenerator = new UuidGenerator(sequenceActions);
  68. historian = new Historian(storage, replicationHiLo, uuidGenerator);
  69. BufferPool = new BufferPool(1024 * 1024 * 1024, 65 * 1024);
  70. conflictArtifactManager = new ConflictArtifactManager(storage, search);
  71. conflictDetector = new ConflictDetector();
  72. conflictResolver = new ConflictResolver();
  73. synchronizationTask = new SynchronizationTask(storage, sigGenerator, notificationPublisher, systemConfiguration);
  74. storageOperationsTask = new StorageOperationsTask(storage, search, notificationPublisher);
  75. metricsCounters = new MetricsCountersManager();
  76. AppDomain.CurrentDomain.ProcessExit += ShouldDispose;
  77. AppDomain.CurrentDomain.DomainUnload += ShouldDispose;
  78. }
  79. private static ITransactionalStorage CreateTransactionalStorage(string storageType, InMemoryRavenConfiguration configuration)
  80. {
  81. switch (storageType)
  82. {
  83. case InMemoryRavenConfiguration.VoronTypeName:
  84. return new Storage.Voron.TransactionalStorage(configuration);
  85. default:
  86. return new Storage.Esent.TransactionalStorage(configuration);
  87. }
  88. }
  89. public ITransactionalStorage Storage
  90. {
  91. get { return storage; }
  92. }
  93. public IndexStorage Search
  94. {
  95. get { return search; }
  96. }
  97. public BufferPool BufferPool { get; private set; }
  98. public InMemoryRavenConfiguration Configuration
  99. {
  100. get { return systemConfiguration; }
  101. }
  102. public SigGenerator SigGenerator
  103. {
  104. get { return sigGenerator; }
  105. }
  106. public NotificationPublisher Publisher
  107. {
  108. get { return notificationPublisher; }
  109. }
  110. public Historian Historian
  111. {
  112. get { return historian; }
  113. }
  114. public FileLockManager FileLockManager
  115. {
  116. get { return fileLockManager; }
  117. }
  118. public SynchronizationTask SynchronizationTask
  119. {
  120. get { return synchronizationTask; }
  121. }
  122. public StorageOperationsTask StorageOperationsTask
  123. {
  124. get { return storageOperationsTask; }
  125. }
  126. public ConflictArtifactManager ConflictArtifactManager
  127. {
  128. get { return conflictArtifactManager; }
  129. }
  130. public ConflictDetector ConflictDetector
  131. {
  132. get { return conflictDetector; }
  133. }
  134. public ConflictResolver ConflictResolver
  135. {
  136. get { return conflictResolver; }
  137. }
  138. public MetricsCountersManager MetricsCounters
  139. {
  140. get { return metricsCounters; }
  141. }
  142. public TransportState TransportState
  143. {
  144. get { return transportState; }
  145. }
  146. public void Dispose()
  147. {
  148. AppDomain.CurrentDomain.ProcessExit -= ShouldDispose;
  149. AppDomain.CurrentDomain.DomainUnload -= ShouldDispose;
  150. storage.Dispose();
  151. search.Dispose();
  152. sigGenerator.Dispose();
  153. BufferPool.Dispose();
  154. metricsCounters.Dispose();
  155. }
  156. public FileSystemMetrics CreateMetrics()
  157. {
  158. var metrics = metricsCounters;
  159. var percentiles = metrics.RequestDuationMetric.Percentiles(0.5, 0.75, 0.95, 0.99, 0.999, 0.9999);
  160. return new FileSystemMetrics
  161. {
  162. RequestsPerSecond = Math.Round(metrics.RequestsPerSecondCounter.CurrentValue, 3),
  163. FilesWritesPerSecond = Math.Round(metrics.FilesPerSecond.CurrentValue, 3),
  164. RequestsDuration = new HistogramData
  165. {
  166. Counter = metrics.RequestDuationMetric.Count,
  167. Max = metrics.RequestDuationMetric.Max,
  168. Mean = metrics.RequestDuationMetric.Mean,
  169. Min = metrics.RequestDuationMetric.Min,
  170. Stdev = metrics.RequestDuationMetric.StdDev,
  171. Percentiles = new Dictionary<string, double>
  172. {
  173. {"50%", percentiles[0]},
  174. {"75%", percentiles[1]},
  175. {"95%", percentiles[2]},
  176. {"99%", percentiles[3]},
  177. {"99.9%", percentiles[4]},
  178. {"99.99%", percentiles[5]},
  179. }
  180. },
  181. Requests = new MeterData
  182. {
  183. Count = metrics.ConcurrentRequests.Count,
  184. FifteenMinuteRate = Math.Round(metrics.ConcurrentRequests.FifteenMinuteRate, 3),
  185. FiveMinuteRate = Math.Round(metrics.ConcurrentRequests.FiveMinuteRate, 3),
  186. MeanRate = Math.Round(metrics.ConcurrentRequests.MeanRate, 3),
  187. OneMinuteRate = Math.Round(metrics.ConcurrentRequests.OneMinuteRate, 3),
  188. }
  189. };
  190. }
  191. private void ShouldDispose(object sender, EventArgs eventArgs)
  192. {
  193. Dispose();
  194. }
  195. public FileSystemStats GetFileSystemStats()
  196. {
  197. var fsStats = new FileSystemStats
  198. {
  199. Name = Name,
  200. Metrics = CreateMetrics(),
  201. ActiveSyncs = SynchronizationTask.Queue.Active.ToList(),
  202. PendingSyncs = SynchronizationTask.Queue.Pending.ToList(),
  203. };
  204. Storage.Batch(accessor => { fsStats.FileCount = accessor.GetFileCount(); });
  205. return fsStats;
  206. }
  207. }
  208. }