public void CouldOpenStateTable() { var path = TestUtils.GetPath(); var stateTable = new StreamLogStateStorage(path); stateTable.Dispose(); }
public void CouldAcquirePackerLock() { var path = TestUtils.GetPath(); ProcessConfig.Init(path); var streamId = 42; StartupConfig.PackerTimeoutSeconds = 0.1; var stateTable = new StreamLogStateStorage(path); var state = stateTable.GetState((StreamLogId)streamId); var pl = state.AcquirePackerLock(); var pl1 = state.AcquirePackerLock(); Assert.IsTrue(pl > 0); Assert.IsTrue(pl1 == 0); var pl2 = state.AcquirePackerLock(pl); Assert.IsTrue(pl2 > pl); Thread.Sleep(200); var pl3 = state.AcquirePackerLock(); var pl4 = state.AcquirePackerLock(); Assert.IsTrue(pl3 > 0); Assert.IsTrue(pl4 == 0); stateTable.Dispose(); }
public void CouldOpenSharedState() { var path = TestUtils.GetPath(); var stateTable = new StreamLogStateStorage(path); stateTable.SharedState.SetWalPosition(123); var position = stateTable.SharedState.GetWalPosition(); Assert.AreEqual(123, position); stateTable.Dispose(); }
/// <summary> /// If <paramref name="disablePacking"/> is set to true Packer only releases /// unused memory pages back to OS and does not perform compression. /// TODO This setting per stream /// </summary> /// <param name="streamLogManager"></param> /// <param name="stateStorage"></param> /// <param name="disablePacking"></param> public Packer(StreamLogManager streamLogManager, StreamLogStateStorage stateStorage, bool disablePacking = false) { _streamLogManager = streamLogManager; _stateStorage = stateStorage; _disablePacking = disablePacking; Pool = new SpreadsThreadPool( new ThreadPoolSettings(1 + Math.Max(Environment.ProcessorCount / 2 - 1, 0), ThreadType.Background, "Packer_pool", ApartmentState.Unknown, ex => { ThrowHelper.FailFast("Unhandled exception in Packer thread pool: \n" + ex); }, 0, ThreadPriority.BelowNormal)); }
public void CouldCreateStreamStateView() { var path = TestUtils.GetPath(); var stateTable = new StreamLogStateStorage(path); Console.WriteLine($"Used size before 1: {stateTable.UsedSize}"); var view0 = stateTable.GetState((StreamLogId)1); Console.WriteLine($"Used size after 1: {stateTable.UsedSize}"); var view1 = stateTable.GetState((StreamLogId)2); Console.WriteLine($"Used size after 2: {stateTable.UsedSize}"); Console.WriteLine($"0 - 1 Pointer diff: {view1.StatePointer.ToInt64() - view0.StatePointer.ToInt64()}"); var view1023 = stateTable.GetState((StreamLogId)1023); Console.WriteLine($"Used size after 1023: {stateTable.UsedSize}"); Console.WriteLine($"1 - 1024 Pointer diff: {view1023.StatePointer.ToInt64() - view0.StatePointer.ToInt64()}"); var view1024 = stateTable.GetState((StreamLogId)1024); Console.WriteLine($"Used size after 1024: {stateTable.UsedSize}"); Console.WriteLine($"1 - 1024 Pointer diff: {view1024.StatePointer.ToInt64() - view0.StatePointer.ToInt64()}"); var viewN1 = stateTable.GetState((StreamLogId)(-1)); Console.WriteLine($"Used size after -1: {stateTable.UsedSize}"); var viewN2 = stateTable.GetState((StreamLogId)(-2)); Console.WriteLine($"Used size after -2: {stateTable.UsedSize}"); Console.WriteLine($"-2 - -1 Pointer diff: {viewN2.StatePointer.ToInt64() - viewN1.StatePointer.ToInt64()}"); stateTable.Dispose(); }
// TODO (low) quick lookup //private readonly string _metadataDirectory; //private readonly LMDBEnvironment _env; //private readonly Database _quickLookupDb; // TODO metadataStorage interface public MetadataManager(string dataStorePath, SQLiteStorage metadataStorage = null, StreamLogStateStorage streamStateStorage = null) { if (metadataStorage == null) { var dataStoragePath = Path.Combine(dataStorePath, "storage"); Directory.CreateDirectory(dataStoragePath); var path = Path.GetFullPath(Path.Combine(dataStoragePath, "data.db")); var uri = new Uri(path); var absoluteUri = uri.AbsoluteUri; metadataStorage = new SQLiteStorage($@"Data Source={absoluteUri}?cache=shared"); _ownMetadataStorage = true; } _metadataStorage = metadataStorage; if (streamStateStorage == null) { var logStateStoragePath = Path.Combine(dataStorePath, "log", "logstate"); streamStateStorage = new StreamLogStateStorage(logStateStoragePath); _ownstreamStateStorage = true; } _streamStateStorage = streamStateStorage; var zeroRepo = new MetadataRecord { PK = MetadataTableStoreRootPk, Metadata = new Metadata("Virtual root repo, keeps counter for all other repos and nothing else."), Counter = 1 }; _metadataStorage.InsertMetadataRow(zeroRepo); #region Init account repo var accountRepo = new MetadataRecord() { PK = DataPathPrefix + AccountRepo, RepoId = 1, SchemaType = 0, Metadata = new Metadata("Current account root repo") }; _metadataStorage.InsertMetadataRow(accountRepo); accountRepo = _metadataStorage.GetExactMetadata(accountRepo.PK); if (accountRepo.RepoId != 1) { ThrowHelper.FailFast("Account repo must be initialized with RepoId = 1"); } RepoPathCache[DataPath.CurrentAccountPrefix] = accountRepo; #endregion Init account repo #region Init local repo var localRepo = new MetadataRecord() { PK = DataPathPrefix + LocalRepo, RepoId = -1, SchemaType = 0, Metadata = new Metadata("Local root repo") }; _metadataStorage.InsertMetadataRow(localRepo); localRepo = _metadataStorage.GetExactMetadata(localRepo.PK); if (localRepo.RepoId != -1) { ThrowHelper.FailFast("Local repo must be initialized with RepoId = 2"); } RepoPathCache[DataPath.LocalPrefix] = localRepo; #endregion Init local repo // TODO Implement later. Need to compare with default lookup. //_metadataDirectory = Path.Combine(dataStorePath, "metadata"); //Directory.CreateDirectory(_metadataDirectory); //_env = OpenEnv(_metadataDirectory); //_quickLookupDb = OpenQuickLookupDb(_env); }