public void WriteToJournal(Transaction tx, int pageCount) { var pages = CompressPages(tx, pageCount, _compressionPager, Shipper.PreviousTransactionCrc); if (CurrentFile == null || CurrentFile.AvailablePages < pages.Length) { CurrentFile = NextFile(pages.Length); } CurrentFile.Write(tx, pages); var transactionHeader = *(TransactionHeader *)pages[0]; var onTransactionCommit = OnTransactionCommit; if (onTransactionCommit != null) { var transactionToShip = new TransactionToShip(transactionHeader) { CompressedPages = pages }; onTransactionCommit(transactionToShip); } Shipper.SetPreviousTransaction(transactionHeader.TransactionId, transactionHeader.Crc); if (CurrentFile.AvailablePages == 0) { CurrentFile = null; } }
public void WriteBufferToFile(JournalFile journalFile, LowLevelTransaction tx) { if (_firstPositionInJournalFile != null) { using (var tempTx = new TempPagerTransaction()) { var numberOfPages = _lastUsed4Kbs / (Constants.Storage.PageSize / (4 * Constants.Size.Kilobyte)); if ((_lastUsed4Kbs % (Constants.Storage.PageSize / (4 * Constants.Size.Kilobyte))) != 0) { numberOfPages++; } _lazyTransactionPager.EnsureMapped(tempTx, 0, numberOfPages); var src = _lazyTransactionPager.AcquirePagePointer(tempTx, 0); var sp = Stopwatch.StartNew(); journalFile.Write(_firstPositionInJournalFile.Value, src, _lastUsed4Kbs); if (_log.IsInfoEnabled) { _log.Info($"Writing lazy transaction buffer with {_lastUsed4Kbs / 4:#,#0} kb took {sp.Elapsed}"); } ZeroLazyTransactionBufferIfNeeded(tempTx); } } if (tx != null) { tx.IsLazyTransaction = false;// so it will notify the flush thread it has work to do } _readTransaction?.Dispose(); _firstPositionInJournalFile = null; _lastUsed4Kbs = 0; _readTransaction = null; NumberOfPages = 0; }
public void WriteToJournal(Transaction tx, int pageCount) { var pages = CompressPages(tx, pageCount, _compressionPager); if (CurrentFile == null || CurrentFile.AvailablePages < pages.Length) { CurrentFile = NextFile(pages.Length); } CurrentFile.Write(tx, pages); if (CurrentFile.AvailablePages == 0) { CurrentFile = null; } }
public void WriteToJournal(Transaction tx, int pageCount) { var pages = CompressPages(tx, pageCount, _compressionPager); if (CurrentFile == null || CurrentFile.AvailablePages < pages.Length) { CurrentFile = NextFile(pages.Length); } var transactionHeader = *(TransactionHeader *)pages[0]; var writePage = CurrentFile.Write(tx, pages); var onTransactionCommit = OnTransactionCommit; if (onTransactionCommit != null) { var bufferSize = pages.Length * AbstractPager.PageSize; var buffer = new byte[bufferSize]; fixed(byte *bp = buffer) CurrentFile.JournalWriter.Read(writePage, bp, bufferSize); var stream = new MemoryStream(buffer, AbstractPager.PageSize, (pages.Length - 1) * AbstractPager.PageSize); var transactionToShip = new TransactionToShip(transactionHeader) { CompressedData = stream, PreviousTransactionCrc = _previousTransactionCrc }; _previousTransactionCrc = transactionHeader.Crc; onTransactionCommit(transactionToShip); } if (CurrentFile.AvailablePages == 0) { CurrentFile = null; } }
public void WriteToJournal(LowLevelTransaction tx, int pageCount) { var pages = CompressPages(tx, pageCount, _compressionPager); if (tx.IsLazyTransaction && _lazyTransactionBuffer == null) { _lazyTransactionBuffer = new LazyTransactionBuffer(_env.Options); } if (CurrentFile == null || CurrentFile.AvailablePages < pages.Length) { _lazyTransactionBuffer?.WriteBufferToFile(CurrentFile, tx); CurrentFile = NextFile(pages.Length); } CurrentFile.Write(tx, pages, _lazyTransactionBuffer, pageCount); if (CurrentFile.AvailablePages == 0) { _lazyTransactionBuffer?.WriteBufferToFile(CurrentFile, tx); CurrentFile = null; } }