prestodb/presto · error

ACCUMULO_TABLE_DNE

ACCUMULO_TABLE_DNE

Error message

Accumulo error when creating BatchWriter and/or Indexer, table does not exist

What it means

Thrown when creating the AccumuloPageSink's BatchWriter or Indexer fails because the target Accumulo table (or its index table) does not exist, detected via TableNotFoundException. ACCUMULO_TABLE_DNE tells the user that the Presto-facing table is registered but the backing Accumulo table is missing, distinct from the generic UNEXPECTED_ACCUMULO_ERROR for other setup failures.

Source

Thrown at presto-accumulo/src/main/java/com/facebook/presto/accumulo/io/AccumuloPageSink.java:129

            // If the table is indexed, create an instance of an Indexer, else empty
            if (table.isIndexed()) {
                indexer = Optional.of(
                        new Indexer(
                                connector,
                                connector.securityOperations().getUserAuthorizations(username),
                                table,
                                conf));
            }
            else {
                indexer = Optional.empty();
            }
        }
        catch (AccumuloException | AccumuloSecurityException e) {
            throw new PrestoException(UNEXPECTED_ACCUMULO_ERROR, "Accumulo error when creating BatchWriter and/or Indexer", e);
        }
        catch (TableNotFoundException e) {
            throw new PrestoException(ACCUMULO_TABLE_DNE, "Accumulo error when creating BatchWriter and/or Indexer, table does not exist", e);
        }
    }

    /**
     * Converts a {@link Row} to an Accumulo mutation.
     *
     * @param row Row object
     * @param rowIdOrdinal Ordinal in the list of columns that is the row ID. This isn't checked at all, so I hope you're right. Also, it is expected that the list of column handles is sorted in ordinal order. This is a very demanding function.
     * @param columns All column handles for the Row, sorted by ordinal.
     * @param serializer Instance of {@link AccumuloRowSerializer} used to encode the values of the row to the Mutation
     * @return Mutation
     */
    public static Mutation toMutation(Row row, int rowIdOrdinal, List<AccumuloColumnHandle> columns, AccumuloRowSerializer serializer)
    {
        // Set our value to the row ID
        Text value = new Text();
        Field rowField = row.getField(rowIdOrdinal);
        if (rowField.isNull()) {

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Recreate the missing Accumulo table matching the name in Presto metadata (via the Accumulo shell or the Presto Accumulo connector's create table path)
  2. Drop and re-create the table through Presto so metadata and the Accumulo table are created together
  3. Confirm the configured index table name also exists if indexing is enabled (check user_tables_mapping and the connector config)
  4. Audit ops procedures so Accumulo tables are only dropped via the Presto connector (DROP TABLE) to keep metadata in sync

Example fix

// before
// Accumulo table dropped out-of-band; Presto still has schema
// ERROR: ACCUMULO_TABLE_DNE on sink creation
// after
-- in Presto, recreate metadata and backing table together
CREATE TABLEmyschema.mytable (... ) WITH (external=false);
-- or re-register with the Accumulo connector's table-setup tool
Defensive patterns

Strategy: validation

Validate before calling

Connector conn = instance.getConnector(user, password);
if (!conn.tableOperations().exists(dataTable)) {
    throw new IllegalStateException("Accumulo table missing: " + dataTable);
}
if (!conn.tableOperations().exists(indexTable)) {
    throw new IllegalStateException("Accumulo index table missing: " + indexTable);
}

Try / catch

try {
    AccumuloPageSink sink = new AccumuloPageSink(...);
} catch (PrestoException e) {
    if (e.getErrorCode().getCode() == StandardErrorCode.ACCUMULO_TABLE_DNE.toErrorCode().getCode()) {
        // recover by recreating the backing table or re-registering via Presto
        throw new RuntimeException("Backing Accumulo table missing; run CREATE TABLE via Presto to recreate", e);
    }
    throw e;
}

Prevention

When it happens

Trigger: Constructing AccumuloPageSink for a Presto table whose underlying Accumulo table was dropped externally (accumulo shell drop table), renamed, or never created (metadata registered without create_table=true); the index table missing when indexing is enabled.

Common situations: Someone deleted the Accumulo table directly to 'clean up' while Presto still has schema metadata; a Presto/Accumulo restore from backup where the schema table entries survived but the data tables didn't; typo'd or changed table name mapping after a version migration.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/6fcbf18aaf4f2ff5. Report an issue: GitHub.