KinesisManagerStatus KinesisStreamManager::UpdateShardIterator()

in kinesis_manager/src/kinesis_stream_manager.cpp [368:407]


KinesisManagerStatus KinesisStreamManager::UpdateShardIterator(const std::string & stream_name)
{
  if (!rekognition_config_.at(stream_name).shard_iterator.empty()) {
    /* Already loaded */
    return KINESIS_MANAGER_STATUS_SUCCESS;
  }
  /* First ListShards, then GetShardIterator */
  Model::ListShardsRequest list_shards_request;
  list_shards_request.SetStreamName(rekognition_config_.at(stream_name).data_stream_name);
  list_shards_request.SetMaxResults(1);
  auto list_shards_outcome = kinesis_client_->ListShards(list_shards_request);
  if (!list_shards_outcome.IsSuccess()) {
    AWS_LOGSTREAM_ERROR(__func__,
                        "ListShards failed with code "
                          << static_cast<int>(list_shards_outcome.GetError().GetErrorType()) << ": "
                          << list_shards_outcome.GetError().GetMessage());
    return KINESIS_MANAGER_STATUS_LIST_SHARDS_FAILED;
  }
  if (list_shards_outcome.GetResult().GetShards().empty()) {
    AWS_LOG_ERROR(__func__, "ListShards: no shards available");
    return KINESIS_MANAGER_STATUS_LIST_SHARDS_EMPTY;
  }

  Aws::String shard_id = list_shards_outcome.GetResult().GetShards().front().GetShardId();
  Model::GetShardIteratorRequest get_shard_iterator_request;
  get_shard_iterator_request.SetStreamName(rekognition_config_.at(stream_name).data_stream_name);
  get_shard_iterator_request.SetShardId(shard_id);
  get_shard_iterator_request.SetShardIteratorType(Model::ShardIteratorType::LATEST);
  auto get_shard_iterator_outcome = kinesis_client_->GetShardIterator(get_shard_iterator_request);
  if (!get_shard_iterator_outcome.IsSuccess()) {
    AWS_LOGSTREAM_ERROR(
      __func__, "GetShardIterator failed with code "
                  << static_cast<int>(get_shard_iterator_outcome.GetError().GetErrorType()) << ": "
                  << get_shard_iterator_outcome.GetError().GetMessage());
    return KINESIS_MANAGER_STATUS_GET_SHARD_ITERATOR_FAILED;
  }
  rekognition_config_.at(stream_name).shard_iterator =
    get_shard_iterator_outcome.GetResult().GetShardIterator();
  return KINESIS_MANAGER_STATUS_SUCCESS;
}