code: public ProcessingStatus onOK() {
      // Sanity check to make sure that every mutation received a response.
      if (!messageIsInvalid) {
        for (int i = 0; i < results.length; i++) {
          if (results[i] == null) {
            messageIsInvalid = true;
            break;
          }
        }
      }
  
      // There was a problem in the data found in onMessage(), so fail the RPC.
      if (messageIsInvalid) {
        return ProcessingStatus.INVALID;
      }
  
      List<Integer> toRetry = new ArrayList<>();
      ProcessingStatus processingStatus = ProcessingStatus.SUCCESS;
  
      // Check the current state to determine the state of the results.
      // There are three states: OK, Fail, or Partial Retry.
      for (int i = 0; i < results.length; i++) {
        Status status = results[i];
        if (status.getCode() == io.grpc.Status.Code.OK.value()) {
          continue;
        } else if (retryOptions.isRetryable(getGrpcCode(status))) {
          // An individual mutation failed with a retryable code, usually DEADLINE_EXCEEDED.
          toRetry.add(i);
          if (processingStatus == ProcessingStatus.SUCCESS) {
            processingStatus = ProcessingStatus.RETRYABLE;
          }
        } else {
          // Don't retry if even a single response is not retryable.
          processingStatus = ProcessingStatus.NOT_RETRYABLE;
          break;
        }
      }
  
      if (!toRetry.isEmpty()) {
        currentRequest = createRetryRequest(toRetry);
      }
  
      return processingStatus;
    }
docs: This is called when all calls to {@link #onMessage(MutateRowsResponse)} are complete.
  
  @return {@link ProcessingStatus} of the accumulated responses - success, invalid, retrable,
  non-retryable.