コード例 #1
0
        public async Task ExecuteOperationThreadTopicSynchronizedAsync(string topicId, MessagePageId pageId, IMessageContentPage messageContentPage)
        {
            var logContext = "Page: " + pageId.Value;

            if (await _compressedMessagesStorage.HasCompressedPageAsync(topicId, pageId))
            {
                _appLogger.AddLog(LogProcess.PagesCompressor, topicId, logContext, "Has compressed page. Skipping compressing procedure");
                return;
            }


            if (messageContentPage.Count == 0)
            {
                _appLogger.AddLog(LogProcess.PagesCompressor, topicId, logContext, "No messages to compress. Skipping compressing procedure");
                return;
            }

            var compressedPage = messageContentPage.GetCompressedPage();

            if (_appGlobalFlags.DebugTopic == topicId)
            {
                _appLogger.AddLog(LogProcess.PagesCompressor, topicId, logContext, $"Writing Compressed data for page {pageId}.");
            }

            await _compressedMessagesStorage.WriteCompressedPageAsync(topicId, pageId, compressedPage, _appLogger);

            if (_appGlobalFlags.DebugTopic == topicId)
            {
                _appLogger.AddLog(LogProcess.PagesCompressor, topicId, logContext, $"Verifying compressed data for page {pageId}");
            }

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

            var messages = compressedPageToVerify.Messages;

            if (_appGlobalFlags.DebugTopic == topicId)
            {
                _appLogger.AddLog(LogProcess.PagesCompressor, topicId, logContext, $"Verified compressed data for page {pageId}. Messages: " + messages.Count);
            }

            if (_appGlobalFlags.DebugTopic == topicId)
            {
                _appLogger.AddLog(LogProcess.PagesCompressor, topicId, logContext, $"Deleting Uncompressed page {pageId}");
            }

            await _persistentStorage.DeleteNonCompressedPageAsync(topicId, pageId);

            if (_appGlobalFlags.DebugTopic == topicId)
            {
                _appLogger.AddLog(LogProcess.PagesCompressor, topicId, logContext, "Written Compressed Page: " + pageId + ". Messages in the page:" + messageContentPage.Count);
            }
        }
        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);
        }