public async Task <IMessageContentPage> TryRestoreFromCompressedPage(string topicId, MessagePageId pageId)
        {
            var resultFromCache = _messagesContentCache.TryGetPage(topicId, pageId);

            if (resultFromCache != null)
            {
                return(resultFromCache);
            }


            var logContext = "PageId: " + pageId.Value;

            _appLogger.AddLog(LogProcess.PagesLoaderOrGc, topicId, logContext,
                              $"Restoring page #{pageId} from compressed source");

            var pageCompressedContent = await _compressedMessagesStorage.GetCompressedPageAsync(topicId, pageId);

            var dt = DateTime.UtcNow;

            if (pageCompressedContent.ZippedContent.Length == 0)
            {
                _appLogger.AddLog(LogProcess.PagesLoaderOrGc, topicId, logContext,
                                  $"Can not restore page #{pageId} from compressed source. Duration: {DateTime.UtcNow - dt}");
                return(null);
            }

            var  msgs  = pageCompressedContent.Messages;
            long minId = 0;
            long maxId = 0;

            if (msgs.Count > 0)
            {
                minId = msgs.Min(itm => itm.MessageId);
                maxId = msgs.Max(itm => itm.MessageId);
            }

            _appLogger.AddLog(LogProcess.PagesLoaderOrGc, topicId, logContext,
                              $"Restored page #{pageId} from compressed source. Duration: {DateTime.UtcNow - dt}. Messages: {msgs.Count}. MinId: {minId}, MaxId: {maxId}");


            var result = new ReadOnlyContentPage(pageCompressedContent);

            _messagesContentCache.AddPage(topicId, result);
            return(result);
        }
Esempio n. 2
0
        private async Task GcThreadTopicSynchronizedAsync(string topicId, MessagePageId pageId)
        {
            var page = _messagesContentCache.TryGetPage(topicId, pageId);

            if (page == null)
            {
                return;
            }

            var gcResult = await _messagesContentPersistentStorage.TryToGcAsync(topicId, pageId);

            if (gcResult.NotFound)
            {
                _logger.AddLog(LogProcess.PagesLoaderOrGc, topicId, "PageNo:" + pageId, "Attempt to GC PageWriter which is not found. Disposing page from the Cache");
                _messagesContentCache.DisposePage(topicId, pageId);
                return;
            }


            if (gcResult.NotReadyToGc)
            {
                _logger.AddLog(LogProcess.PagesLoaderOrGc, topicId, "PageNo:" + pageId, "Attempt to GC PageWriter which has not synced messages. Trying to Sync them to the Blob and skipping for the next round");
                await _messagesContentPersistentStorage.SyncAsync(topicId, pageId);

                return;
            }



            if (gcResult.DisposedPageWriter != null)
            {
                _logger.AddLog(LogProcess.PagesLoaderOrGc, topicId, "PageNo:" + pageId, "PageWriter disposed Ok.. Disposing From Cache");

                await _compressPageBlobOperation.ExecuteOperationThreadTopicSynchronizedAsync(topicId, pageId, gcResult.DisposedPageWriter.AssignedPage);

                _messagesContentCache.DisposePage(topicId, pageId);

                _logger.AddLog(LogProcess.PagesLoaderOrGc, topicId, "PageNo:" + pageId, "Page is disposed from Cache");
            }
        }