private void dealResponse(OperationResponse response) {
        if (response.hasRowError()) {
            RowError error = response.getRowError();
            String errorMsg = error.getErrorStatus().toString();
            if (outDirtyRecords.getCount() % DIRTY_PRINT_FREQUENCY == 0) {
                LOG.error(errorMsg);
                LOG.error(String.format("Dirty data count: [%s]. Row data: [%s]",
                        outDirtyRecords.getCount() + 1, error.getOperation().getRow().toString()));
            }
            outDirtyRecords.inc();

            if (error.getErrorStatus().isNotFound()
                    || error.getErrorStatus().isIOError()
                    || error.getErrorStatus().isRuntimeError()
                    || error.getErrorStatus().isServiceUnavailable()
                    || error.getErrorStatus().isIllegalState()) {
                throw new RuntimeException(errorMsg);
            }
        }
    }
Deal response when operation apply.
At MANUAL_FLUSH mode, response returns after {@link KuduSession#flush()}.
But at AUTO_FLUSH_SYNC mode, response returns after {@link KuduSession#apply(Operation)}

@param response {@link OperationResponse} response after operation done.
kudu/kudu-sink/src/main/java/com/dtstack/flink/sql/sink/kudu/KuduOutputFormat.java