firebase / firebase/firebase-tools

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

Open
#10,687 3 comments 1 reaction 0 assignees View on GitHub
emulators: firestore reproducible type: bug
Dominant language
TypeScript
Stars
4.5k
Forks
1.3k
Avg merge
1d 12h
Merged PRs (30d)
84

Description

### [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`.

```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.

```typescript
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.

```json
{"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. (/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}"}
```

Contributor guide

Open the contributing guide

Research direction

Start with the firebase.json emulator configuration and run the provided TypeScript Admin SDK reproduction using Firestore Enterprise and runTransaction. Trace the emulator's transaction query handling for the count query, then verify that the transaction completes and returns the query result instead of an UNKNOWN error.

Written by the indexing model from the issue text.

Assessment

Tech stack
firebase, typescript
Domain
cli, databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.