{"record":{"id":"c989ff11496d7f44","repo":"apache/seatunnel","slug":"write-failed","errorCode":"WRITE_FAILED","errorMessage":"Failed to mutate row in table ","messagePattern":"Failed to mutate row in table ","errorType":"error_code","errorClass":"BigtableConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-google-bigtable/src/main/java/org/apache/seatunnel/connectors/seatunnel/bigtable/client/BigtableClient.java","lineNumber":102,"sourceCode":"                    BigtableConnectorErrorCode.CONNECTION_FAILED,\n                    \"Failed to create Bigtable client for project=\"\n                            + parameters.getProjectId()\n                            + \", instance=\"\n                            + parameters.getInstanceId(),\n                    e);\n        }\n    }\n\n    /**\n     * Applies a single row mutation to Bigtable.\n     *\n     * @param rowMutation the row mutation to apply\n     */\n    public void mutateRow(RowMutation rowMutation) {\n        try {\n            dataClient.mutateRow(rowMutation);\n        } catch (Exception e) {\n            throw new BigtableConnectorException(\n                    BigtableConnectorErrorCode.WRITE_FAILED,\n                    \"Failed to mutate row in table \" + parameters.getTable(),\n                    e);\n        }\n    }\n\n    /**\n     * Applies a batch of row mutations to Bigtable using BulkMutation for efficiency.\n     *\n     * @param mutations list of (rowKey, Mutation) pairs to apply\n     */\n    public void bulkMutate(List<RowKeyMutation> mutations) {\n        if (mutations.isEmpty()) {\n            return;\n        }\n        try {\n            BulkMutation bulk = BulkMutation.create(parameters.getTable());\n            for (RowKeyMutation entry : mutations) {","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-google-bigtable/src/main/java/org/apache/seatunnel/connectors/seatunnel/bigtable/client/BigtableClient.java#L84-L120","documentation":"BigtableClient.mutateRow wraps any exception from dataClient.mutateRow into BigtableConnectorException with WRITE_FAILED. A single-row write (RowMutation) failed at the Bigtable service or client level.","triggerScenarios":"mutateRow(RowMutation) is called and the underlying RPC fails: nonexistent column family, row key or cell size limits exceeded, deadline/timeout, permission denied on the table, or transient server error.","commonSituations":"Writing to a column family that was never created; rows larger than Bigtable limits (256MB); IAM role lacking bigtable.tables.mutateRows; network blips or throttling on busy instances.","solutions":["Confirm the target column family exists in the Bigtable table and matches the sink mapping","Check IAM permissions (Bigtable User role) for the service account","Inspect the cause exception; retry on transient errors (DEADLINE_EXCEEDED, UNAVAILABLE) with backoff","Validate row sizes and cell counts against Bigtable limits"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// ensure column families exist before writing\nfor (String cf : requiredColumnFamilies) {\n  assert existingFamilies.contains(cf) : \"Missing column family: \" + cf;\n}","typeGuard":null,"tryCatchPattern":"try {\n  client.mutateRow(rowMutation);\n} catch (BigtableConnectorException e) {\n  if (isTransient(e.getCause())) retryWithBackoff(rowMutation);\n  else throw e;\n}","preventionTips":["Create all column families before running the sink","Grant the service account Bigtable User role","Keep row sizes under Bigtable limits","Retry on DEADLINE_EXCEEDED/UNAVAILABLE causes"],"tags":["gcp","bigtable","write-failed","rpc"],"backgroundTag":"database-write-failed","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}