class Google::Cloud::Bigtable::RowsMutator

@private # RowsMutator

Retryable mutate rows helper

Constants

RETRYABLE_CODES

@private Retryable status codes

RETRY_LIMIT

@private

Public Class Methods

new(table, entries) click to toggle source

@private

Creates a mutate rows instance.

@param table [Google::Cloud::Bigtable::TableDataOperations] @param entries [Array<Google::Cloud::Bigtable::MutationEntry>]

# File lib/google/cloud/bigtable/rows_mutator.rb, line 48
def initialize table, entries
  @table = table
  @entries = entries
end

Public Instance Methods

apply_mutations() click to toggle source

Applies mutations.

@return [Array<Google::Cloud::Bigtable::V2::MutateRowsResponse::Entry>]

# File lib/google/cloud/bigtable/rows_mutator.rb, line 58
def apply_mutations
  @req_entries = @entries.map(&:to_grpc)
  statuses = mutate_rows @req_entries

  # Collects retryable mutations indices.
  indices = statuses.each_with_object [] do |e, r|
    r << e.index if @entries[e.index].retryable? && RETRYABLE_CODES[e.status.code]
  end

  return statuses if indices.empty?

  (RETRY_LIMIT - 1).times do
    break if indices.empty?
    indices = retry_entries statuses, indices
  end

  statuses
end

Private Instance Methods

mutate_rows(entries) click to toggle source

Mutates rows.

@param entries [Array<Google::Cloud::Bigtable::MutationEntry>] @return [Array<Google::Cloud::Bigtable::V2::MutateRowsResponse::Entry>]

# File lib/google/cloud/bigtable/rows_mutator.rb, line 85
def mutate_rows entries
  response = @table.service.mutate_rows @table.path, entries, app_profile_id: @table.app_profile_id
  response.each_with_object [] do |res, statuses|
    statuses.concat res.entries
  end
end
retry_entries(statuses, indices) click to toggle source

Collects failed entries, retries mutation, and updates status.

@param statuses [Array<Google::Cloud::Bigtable::V2::MutateRowsResponse::Entry>] @param indices [Array<Integer>]

Retry entries position mapping list

@return [Array<Integer>]

New list of failed entries positions
# File lib/google/cloud/bigtable/rows_mutator.rb, line 101
def retry_entries statuses, indices
  entries = indices.map { |i| @req_entries[i] }
  retry_statuses = mutate_rows entries

  retry_statuses.each_with_object [] do |e, next_indices|
    next_indices << indices[e.index] if RETRYABLE_CODES[e.status.code]
    statuses[indices[e.index]].status = e.status
  end
end