Skip to content

[Emulator] Using runTransaction with Firestore Enterprise results in UNKNOWN error on Admin SDK #10687

@mandalornl

Description

@mandalornl

[REQUIRED] Environment info

firebase-tools: 15.20.0
firebase-admin: 14.0.0

Platform: Linux (Ubuntu 26.04) and macOS (Tahoe 26.5.1)

[REQUIRED] Test case

Make sure to set edition: "enterprise" in firebase.json.

{
  "emulators": {
    "firestore": {
      "port": 8080,
      "edition": "enterprise"
    },
    "singleProjectMode": true
  },
  "firestore": {
    "database": "enterprise",
    "edition": "enterprise",
    "location": "eur3",
    "rules": "firestore.rules",
    "indexes": "firestore.indexes.json"
  }
}

[REQUIRED] Steps to reproduce

Simply run example below in the Admin SDK environment. It doesn't have to be an aggregate query, any query will do.

import { initializeApp } from 'firebase-admin/app';
import { getFirestore } from 'firebase-admin/firestore';

const app = initializeApp();
const firestore = getFirestore(app);

await firestore.runTransaction(async (transaction) => {
  const querySnapshot = await transaction.get(
    firestore.collection('test').count()
  );

  console.log(querySnapshot.data().count);
});

[REQUIRED] Expected behavior

Transaction to execute and return the result.

[REQUIRED] Actual behavior

Instead it results in an UNKNOWN error.

{"severity":"ERROR","message":"Unhandled error Error: 2 UNKNOWN: \n    at callErrorFromStatus (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/call.js:32:19)\n    at Object.onReceiveStatus (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/client.js:359:73)\n    at Object.onReceiveStatus (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:327:181)\n    at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/resolving-call.js:135:78\n    at process.processTicksAndRejections (node:internal/process/task_queues:85:11)\nfor call at\n    at ServiceClientImpl.makeServerStreamRequest (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/client.js:342:32)\n    at ServiceClientImpl.<anonymous> (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@grpc+grpc-js@1.14.4/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19)\n    at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:257:29\n    at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/google-gax@5.0.7/node_modules/google-gax/build/src/streamingCalls/streamingApiCaller.js:39:28\n    at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/google-gax@5.0.7/node_modules/google-gax/build/src/normalCalls/timeout.js:44:16\n    at Object.request (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/google-gax@5.0.7/node_modules/google-gax/build/src/streamingCalls/streaming.js:248:40)\n    at Timeout.makeRequest [as _onTimeout] (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/retry-request@8.0.3/node_modules/retry-request/index.js:159:28)\n    at listOnTimeout (node:internal/timers:605:17)\n    at process.processTimers (node:internal/timers:541:7)\nCaused by: Error\n    at QueryUtil._getResponse (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/reference/query-util.js:47:23)\n    at Query._getResponse (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/reference/query.js:905:32)\n    at Query._get (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/reference/query.js:898:35)\n    at Transaction.getQueryFn (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/transaction.js:579:22)\n    at Transaction.withLazyStartedTransaction (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/transaction.js:551:48)\n    at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/transaction.js:125:29\n    at /Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@google-cloud+firestore@8.6.0/node_modules/@google-cloud/firestore/build/src/telemetry/enabled-trace-util.js:125:30\n    at NoopContextManager.with (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/src/context/NoopContextManager.js:14:19)\n    at ContextAPI.with (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/src/api/context.js:51:46)\n    at NoopTracer.startActiveSpan (/Users/someuser/Sites/someproject/functions/node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/src/trace/NoopTracer.js:54:31) {\n  code: 2,\n  details: '',\n  metadata: Metadata {\n    internalRepr: Map(1) { 'content-type' => [Array] },\n    opaqueData: Map(0) {},\n    options: {}\n  }\n}"}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions