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); }
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"); } }