-
Notifications
You must be signed in to change notification settings - Fork 3.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ui: fix errors thrown by 0.toNumber() #108752
ui: fix errors thrown by 0.toNumber() #108752
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Looks like there was test fallout.
When generating JS protobuf bindings, protobufjs's `pbjs` CLI accepts a --strict-long (or the more modern --force-long) flag with the following description: > Enfores the use of 'Long' for s-/u-/int64 and s-/fixed64 fields. This uses the `long` package on NPM[^1], which it expects to be present when one of those clients is used at runtime. If `long` isn't available when `pbjs` is executed, it falls back to generating number-based fields where possible. Long is available in all consumers of `crdb-protobuf-client`, and `protobufjs` declares `long` as one of its few build-time and run-time dependencies, so nothing looked alarming. For each field with a type that might be represented by a Long (a heuristic influenced by --strict-long), that field is marked as "long" if and only if the protobufjs-internal util.Long is non-null[^2]. That util.Long value is set via the use of the `@protobufjs/inquire` package instead of a standard `require`[^3] though, since the former silently returns `null` instead of throwing an error[^4]. This, again, is not alarming on its own because `protobufjs` depends directly on `long`. The complication comes in with rules_js' use of the pnpm visibility rules, which are very strict when it comes to JS package dependencies. Put simply: packages only have access to the dependencies they directly declare, not transitive dependencies ("phantom dependencies")[^5]. Since `@protobufjs/inquire` is a separate package with no direct dependencies of its own[^6], Bazel lays out a node_modules tree where `@protobufjs/inquire` has no access to the `long` package. Since inaccessible packages are indistinguishable from nonexistent packages and `inquire` is intended to be silent, it returns `null`. The `pbjs` CLI then assumes Long isn't installed and falls back to number-based fields where a Long isn't strictly required. When combined with protobuf's zero-value, this caused several cases of '0.toNumber is not a function' JS errors at runtime[^7]. We requested a Long, we support Longs, but a client was silently generated without respecting --strict-long. Like with most other phantom dependencies, use pnpm.packageOverrides to declare that @protobufjs/inquire does in fact depend on Long. [^1]: https://www.npmjs.com/package/long [^2]: https://github.com/protobufjs/protobuf.js/blob/918ff014efe19f3eb43195ae3d71f7aeb3fcdd73/src/field.js#L153-L157 [^3]: https://github.com/protobufjs/protobuf.js/blob/918ff014efe19f3eb43195ae3d71f7aeb3fcdd73/src/util/minimal.js#L163-L167 [^4]: https://github.com/protobufjs/protobuf.js/blob/918ff014efe19f3eb43195ae3d71f7aeb3fcdd73/lib/inquire/index.js#L4-L17 [^5]: https://docs.aspect.build/rules/aspect_rules_js/docs/pnpm/#hoisting [^6]: https://github.com/protobufjs/protobuf.js/blob/918ff014efe19f3eb43195ae3d71f7aeb3fcdd73/lib/inquire/package.json [^7]: cockroachdb#106318 Fixes: cockroachdb#106318 Release note: Observability pages no longer crash when they encounter zeros (e.g. a session with no memory allocated).
c118c1a
to
a656a81
Compare
@maryliag can you or someone on your team gut-check the test change here? Now that |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewed 3 of 3 files at r1, all commit messages.
Reviewable status: complete! 1 of 0 LGTMs obtained (waiting on @sjbarag)
Thanks for the reviews y'all! bors r+ |
Build succeeded: |
When generating JS protobuf bindings, protobufjs's
pbjs
CLI accepts a --strict-long (or the more modern --force-long) flag with the following description:This uses the
long
package on NPM1, which it expects to be present when one of those clients is used at runtime. Iflong
isn't available whenpbjs
is executed, it falls back to generating number-based fields where possible. Long is available in all consumers ofcrdb-protobuf-client
, andprotobufjs
declareslong
as one of its few build-time and run-time dependencies, so nothing looked alarming.For each field with a type that might be represented by a Long (a heuristic influenced by --strict-long), that field is marked as "long" if and only if the protobufjs-internal util.Long is non-null2. That util.Long value is set via the use of the
@protobufjs/inquire
package instead of a standardrequire
3 though, since the former silently returnsnull
instead of throwing an error4. This, again, is not alarming on its own becauseprotobufjs
depends directly onlong
.The complication comes in with rules_js' use of the pnpm visibility rules, which are very strict when it comes to JS package dependencies. Put simply: packages only have access to the dependencies they directly declare, not transitive dependencies ("phantom dependencies")5. Since
@protobufjs/inquire
is a separate package with no direct dependencies of its own6, Bazel lays out a node_modules tree where@protobufjs/inquire
has no access to thelong
package. Since inaccessible packages are indistinguishable from nonexistent packages andinquire
is intended to be silent, it returnsnull
. Thepbjs
CLI then assumes Long isn't installed and falls back to number-based fields where a Long isn't strictly required.When combined with protobuf's zero-value, this caused several cases of '0.toNumber is not a function' JS errors at runtime7. We requested a Long, we support Longs, but a client was silently generated without respecting --strict-long.
Like with most other phantom dependencies, use pnpm.packageOverrides to declare that @protobufjs/inquire does in fact depend on Long.
Fixes: #106318
Release note: Observability pages no longer crash when they encounter zeros (e.g. a session with no memory allocated).
Footnotes
https://www.npmjs.com/package/long ↩
https://github.com/protobufjs/protobuf.js/blob/918ff014efe19f3eb43195ae3d71f7aeb3fcdd73/src/field.js#L153-L157 ↩
https://github.com/protobufjs/protobuf.js/blob/918ff014efe19f3eb43195ae3d71f7aeb3fcdd73/src/util/minimal.js#L163-L167 ↩
https://github.com/protobufjs/protobuf.js/blob/918ff014efe19f3eb43195ae3d71f7aeb3fcdd73/lib/inquire/index.js#L4-L17 ↩
https://docs.aspect.build/rules/aspect_rules_js/docs/pnpm/#hoisting ↩
https://github.com/protobufjs/protobuf.js/blob/918ff014efe19f3eb43195ae3d71f7aeb3fcdd73/lib/inquire/package.json ↩
https://github.com/cockroachdb/cockroach/issues/106318 ↩