/// <summary> /// Reads the checkpoint information from the file for partition id /// </summary> /// <param name="partitionId">The partition id the checkpoint data is for</param> /// <returns>A checkpoint instance populated from the file</returns> private async Task <CheckpointEntry> ReadCheckpointFromFileAsync(string partitionId) { CheckpointEntry result = null; using (_logger.BeginScope("Read Checkpoint")) { _checkpointReadCounter.Increment(); _logger.LogDebug("Reading checkpoint partition {partitionId}", partitionId); var fileName = GetFileName(partitionId); if (File.Exists(fileName)) { _logger.LogDebug("File {fileName} exists", fileName); try { var json = await File.ReadAllTextAsync(fileName, ContainerLifecycle.CancellationToken).ConfigureAwait(false); if (string.IsNullOrWhiteSpace(json)) { _logger.LogInformation("File {fileName} was empty", fileName); } else { _logger.LogInformation("File {fileName} had the following content: {content}", fileName, json); try { result = CheckpointEntry.FromJson(json); } catch (Exception e) { _logger.LogError(e, "Error deserializing checkpoint contents"); _checkpointErrorCounter.Increment(); } } } catch (Exception e) { _logger.LogError(e, "Error reading checkpoint file {fileName}", fileName); _checkpointErrorCounter.Increment(); } } else { _logger.LogInformation("File {fileName} does not exists", fileName); } } return(result); }