Beispiel #1
0
        public async Task <List <Document> > ReadDocsAfter(long docId)
        {
            var batches = new List <List <Document> >();

            _file.Position = _file.Length;
            try
            {
                while (_file.Position > 0)
                {
                    var batch = await DocumentSerializer.DeserializeBatchFromRightToLeft(_file);

                    batches.Add(batch);

                    if (batch.First().Id <= docId)
                    {
                        break;
                    }
                }

                var result = new List <Document>();
                foreach (var doc in batches.SelectMany(x => x))
                {
                    if (doc.Id > docId)
                    {
                        result.Add(doc);
                    }
                }

                return(result);
            }
            finally
            {
                _file.Position = _file.Length;
            }
        }
Beispiel #2
0
        private async Task TruncateByDocId(long docId)
        {
            using (Measured.Operation("wal_truncate"))
            {
                _file.Position = _file.Length;

                while (_file.Position != 0)
                {
                    var batch = await DocumentSerializer.DeserializeBatchFromRightToLeft(_file);

                    var firstDocIdInBatch = batch[0].Id;

                    if (docId >= firstDocIdInBatch)
                    {
                        await TruncateByFileOffset(_file.Position);

                        break;
                    }
                }
            }
        }
Beispiel #3
0
        private async Task <DocIdGenerator> CreateDocIdGenerator()
        {
            if (_file.Length == 0)
            {
                return(new DocIdGenerator(0));
            }

            var initialPos = _file.Position;

            try
            {
                var lastBatch = await DocumentSerializer.DeserializeBatchFromRightToLeft(_file);

                var lastDoc = lastBatch[lastBatch.Count - 1];
                return(new DocIdGenerator(lastDoc.Id));
            }
            finally
            {
                _file.Position = initialPos;
            }
        }