private void OnEvictionCompleted(object sender, EventArgs args) { if (_backgroundPageWriter != null) { // Flush any evicted writable pages to disk _backgroundPageWriter.Flush(); } }
public void Commit(ulong commitId, BrightstarProfiler profiler) { if (CanWrite) { foreach (var pageId in _modifiedPages.Keys) { var page = PageCache.Instance.Lookup(_partitionId, pageId) as BinaryFilePage; if (page != null && page.IsDirty) { _backgroundPageWriter.QueueWrite(page, commitId); } } _backgroundPageWriter.Flush(); lock (_restartLock) { _backgroundPageWriter.Shutdown(); _backgroundPageWriter.Dispose(); PageCache.Instance.Clear(_partitionId); UpdatePartitionId(); _readTxnId = _writeTxnId; _writeTxnId++; _backgroundPageWriter = new BackgroundPageWriter(_persistenceManager.GetOutputStream(_filePath, FileMode.Open)); } } else { throw new InvalidOperationException("Attempt to Commit on a read-only store instance"); } }
public void Commit(ulong commitId, BrightstarProfiler profiler) { using (profiler.Step("PageStore.Commit")) { if (_backgroundPageWriter != null) { foreach (var p in _newPages) { _backgroundPageWriter.QueueWrite(p, commitId); } _backgroundPageWriter.Flush(); RestartBackgroundWriter(); foreach (var p in _newPages) { PageCache.Instance.InsertOrUpdate(_path, p); } } else { using (var outputStream = _peristenceManager.GetOutputStream(_path, FileMode.Open)) { foreach (var p in _newPages) { p.Write(outputStream, commitId); PageCache.Instance.InsertOrUpdate(_path, p); } } } _newPages.Clear(); _newPageOffset = _nextPageId; } /* * using (var writeStream = _peristenceManager.GetOutputStream(_path, FileMode.Open)) * { * writeStream.Seek((long) ((_newPageOffset - 1)*(ulong) _pageSize), SeekOrigin.Begin); * foreach (var p in _newPages) * { * writeStream.Write(p.Data, 0, _pageSize); * } * writeStream.Flush(); * _newPages.Clear(); * _newPageOffset = _nextPageId; * } */ }
public void Commit(ulong commitId, BrightstarProfiler profiler) { using (profiler.Step("PageStore.Commit")) { var livePages = new List <IPage>(); if (_backgroundPageWriter != null) { foreach (var p in _newPages) { if (p.IsAlive) { _backgroundPageWriter.QueueWrite(p.Target as IPage, commitId); livePages.Add(p.Target as IPage); } } _backgroundPageWriter.Flush(); RestartBackgroundWriter(); PageCache.Instance.Clear(_path); } else { using (var outputStream = _peristenceManager.GetOutputStream(_path, FileMode.Open)) { foreach (var p in _newPages) { if (p.IsAlive) { (p.Target as IPage).Write(outputStream, commitId); } } } } _newPages.Clear(); _newPageOffset = _nextPageId; } }