public DiskService(EngineSettings settings, int[] memorySegmentSizes) { _cache = new MemoryCache(memorySegmentSizes); // get new stream factory based on settings _dataFactory = settings.CreateDataFactory(); _logFactory = settings.CreateLogFactory(); // create stream pool _dataPool = new StreamPool(_dataFactory, false); _logPool = new StreamPool(_logFactory, true); var isNew = !_dataFactory.Exists() || _dataFactory.GetLength() == 0L; // create lazy async writer queue for log file _queue = new Lazy <DiskWriterQueue>(() => new DiskWriterQueue(_logPool.Writer)); // create new database if not exist yet if (isNew) { LOG($"creating new database: '{Path.GetFileName(_dataFactory.Name)}'", "DISK"); this.Initialize(_dataPool.Writer, settings.Collation, settings.InitialSize); } // if not readonly, force open writable datafile if (settings.ReadOnly == false) { var dummy = _dataPool.Writer.CanRead; } // get initial data file length _dataLength = _dataFactory.GetLength() - PAGE_SIZE; // get initial log file length if (_logFactory.Exists()) { _logLength = _logFactory.GetLength() - PAGE_SIZE; } else { _logLength = -PAGE_SIZE; } }