예제 #1
0
        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;
            }
        }
예제 #2
0
        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;
        }
예제 #3
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;
            }
        }
예제 #5
0
        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;
            }
        }