/// <inheritdoc />
        public async Task <Checkpoint> CreateCheckpointIfNotExistsAsync(string partitionId)
        {
            CheckpointEntry checkpoint;

            using (_logger.BeginScope("Create checkpoint"))
            {
                _checkpointUpdateCounter.Increment();
                _logger.LogDebug("Checkpoint partition {partitionId}", partitionId);

                checkpoint = await ReadCheckpointFromFileAsync(partitionId).ConfigureAwait(false);

                if (checkpoint == null)
                {
                    _logger.LogInformation("Checkpoint not found for partition {partitionId}, creating", partitionId);

                    var fileName      = GetFileName(partitionId);
                    var newCheckpoint = new CheckpointEntry {
                        PartitionId = partitionId, Owner = _eventProcessorName
                    };
                    var json = newCheckpoint.ToJson();

                    _logger.LogTrace("Checkpoint json: ", json);

                    try
                    {
                        await File.WriteAllTextAsync(fileName, json, ContainerLifecycle.CancellationToken).ConfigureAwait(false);

                        _logger.LogDebug("Checkpoint complete for file {fileName}", fileName);
                        checkpoint = newCheckpoint;
                    }
                    catch (Exception e)
                    {
                        _logger?.LogError(e, "Error writing checkpoint file {fileName}", fileName);
                        _checkpointErrorCounter.Increment();
                    }
                }
                else
                {
                    _logger?.LogTrace("Checkpoint found for partition {partitionId}", partitionId);
                }
            }

            return(checkpoint);
        }