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();
        }
Beispiel #4
0
 /// <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);
        }