Skip to content
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

fix(compartment-mapper): fix #2407 include symbol-named properties #2408

Merged
merged 2 commits into from
Aug 22, 2024

Conversation

erights
Copy link
Contributor

@erights erights commented Aug 12, 2024

Closes: #2407
Refs: Agoric/agoric-sdk#9874 Agoric/agoric-sdk#9431 Agoric/agoric-sdk#9781 #2377

Description

While working on Agoric/agoric-sdk#9874 , I found that it still failed to endow passStyleOf via a symbol-named property as recently agree.

Turns out there was still a lurking Object.keys on the compartment endowment pathway that needs to be changed to enumerate all enumerable own properties, whether string-named or symbol-named.

Security Considerations

None

Scaling Considerations

For this PR, none. But it enables liveslots to endow its passStyleOf to the compartments it makes, which has the scaling benefits explained at Agoric/agoric-sdk#9781

Documentation Considerations

For the normal developer, none. Once endowed, passStyleOf will have performance that is less surprising.

Testing Considerations

Agoric/agoric-sdk#9874 both patches in the equivalent of this PR, uses it to endow passStyleOf, and test that it has done so, across both node and XS.

However, after this fix, Agoric/agoric-sdk#9874 works on the Node host. But it still fails on the XS host for undiagnosed reasons, so there may be another bug like #2407 still lurking somewhere. Until diagnosed, it isn't clear if that remaining problem is an endo problem or an agoric-sdk problem.

Compatibility and Upgrade Considerations

Except for code meant only to test this, passStyleOf should not have any observable difference. We have not attempted to make an other use of symbol-named global properties, so there should be no compat or upgrade issues.

@erights erights self-assigned this Aug 12, 2024
@erights erights marked this pull request as ready for review August 12, 2024 21:37
@erights erights requested a review from naugtur August 12, 2024 23:17
@erights erights force-pushed the markm-2407-fix-include-symbol-named-props branch 2 times, most recently from 3efb14f to 15e7a91 Compare August 14, 2024 22:19
@erights erights requested a review from gibson042 August 16, 2024 19:27
@erights erights force-pushed the markm-2407-fix-include-symbol-named-props branch from 15e7a91 to e740fbc Compare August 16, 2024 19:28
mergify bot pushed a commit to Agoric/agoric-sdk that referenced this pull request Aug 17, 2024
…tment (#9874)

A variant of #9431 . @warner , feel free to just adopt these changes into #9431 rather than reviewing this alternate.

closes: #9781
refs: #9431 endojs/endo#2377 endojs/endo#2408

## Description

The code running under liveslots, i.e., user-level vat code such as contracts, must not be able to sense gc. Thus, liveslots endows them with virtual-storage-aware WeakMap and WeakSet, which treats the virtual object as the weakly held key, whereas the builtin WeakMap and WeakSet would treat the momentary representative as the weakly held key. To achieve this, the virtual-storage-aware WeakMap and WeakSet must impose a comparative storage leak.

However, some WeakMaps and WeakSets are used purely as an encapsulated unobservable memo, in the sense that the clients of encapsulating abstraction cannot sense whether the memo hit or missed (modulo timing of course, which we can also deny). `passStyleOf` is such an abstraction. Measurements show that the storage leak it causes is significant. The judgement of `passStyleOf` is only to report the pass-style of its arguments, and all virtual objects that have representative have a pass-style of `'remotable'` every time any of its representatives are tested.

To avoid this storage leak, endojs/endo#2377 (merged, released, and synced with agoric-sdk) and endojs/endo#2408 (still in review) together enable liveslots to endow the compartment it unbundles with its own efficient `passStyleOf`, built from the primitive WeakMap which it encapsulates.

This PR does two things:
- makes the change to liveslots to do this endowing, according to the conventions supported by endojs/endo#2377 and endojs/endo#2408
- because endojs/endo#2408 is not yet synced with agoric-sdk, this PR adds an "equivalent" patch, so that we can depend on it before the next endo sync.

### Security Considerations

This design *assumes* that the endowed `passStyleOf` makes the memo hits vs misses unobservable, so its dependence on these does not enable the code using it to observe gc. If there is some way to trick it into exposing the difference between a hit and miss, that would be a security concern.

### Scaling Considerations

The point.

With this PR, the storage leak caused by the `passStyleOf` memo should go away. For some vats, this should be a big improvement.

### Documentation Considerations

For the normal developer, none.

### Testing Considerations

Adapts the tests originally written by @warner in #9431 , which seem to demonstrate that this works both for node-based and for XS-based vats.

### Upgrade Considerations

I don't believe there are any. When linked with an endo preceding even endojs/endo#2377 , the only consequence should be that the storage leak remains unfixed. Likewise, if an endo with endojs/endo#2377 and even endojs/endo#2408 is linked with an agoric-sdk prior to the PR, the only consequence should be that the storage leak remains unfixed.
key =>
// @ts-expect-error TypeScript still confused about a symbol as index
descs[key].enumerable,
);
}
for (let index = 0; index < list.length; index += 1) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@naugtur Might be worth you time to investigate how a policy would name a symbol to be preserved.

packages/compartment-mapper/src/policy.js Show resolved Hide resolved
@erights erights force-pushed the markm-2407-fix-include-symbol-named-props branch from e740fbc to c67b6ee Compare August 22, 2024 00:46
@erights erights force-pushed the markm-2407-fix-include-symbol-named-props branch from c67b6ee to 9a54ce5 Compare August 22, 2024 00:48
@erights erights merged commit 2b799f8 into master Aug 22, 2024
17 checks passed
@erights erights deleted the markm-2407-fix-include-symbol-named-props branch August 22, 2024 01:03
kriskowal pushed a commit to Agoric/agoric-sdk that referenced this pull request Aug 27, 2024
…tment (#9874)

A variant of #9431 . @warner , feel free to just adopt these changes into #9431 rather than reviewing this alternate.

closes: #9781
refs: #9431 endojs/endo#2377 endojs/endo#2408

## Description

The code running under liveslots, i.e., user-level vat code such as contracts, must not be able to sense gc. Thus, liveslots endows them with virtual-storage-aware WeakMap and WeakSet, which treats the virtual object as the weakly held key, whereas the builtin WeakMap and WeakSet would treat the momentary representative as the weakly held key. To achieve this, the virtual-storage-aware WeakMap and WeakSet must impose a comparative storage leak.

However, some WeakMaps and WeakSets are used purely as an encapsulated unobservable memo, in the sense that the clients of encapsulating abstraction cannot sense whether the memo hit or missed (modulo timing of course, which we can also deny). `passStyleOf` is such an abstraction. Measurements show that the storage leak it causes is significant. The judgement of `passStyleOf` is only to report the pass-style of its arguments, and all virtual objects that have representative have a pass-style of `'remotable'` every time any of its representatives are tested.

To avoid this storage leak, endojs/endo#2377 (merged, released, and synced with agoric-sdk) and endojs/endo#2408 (still in review) together enable liveslots to endow the compartment it unbundles with its own efficient `passStyleOf`, built from the primitive WeakMap which it encapsulates.

This PR does two things:
- makes the change to liveslots to do this endowing, according to the conventions supported by endojs/endo#2377 and endojs/endo#2408
- because endojs/endo#2408 is not yet synced with agoric-sdk, this PR adds an "equivalent" patch, so that we can depend on it before the next endo sync.

### Security Considerations

This design *assumes* that the endowed `passStyleOf` makes the memo hits vs misses unobservable, so its dependence on these does not enable the code using it to observe gc. If there is some way to trick it into exposing the difference between a hit and miss, that would be a security concern.

### Scaling Considerations

The point.

With this PR, the storage leak caused by the `passStyleOf` memo should go away. For some vats, this should be a big improvement.

### Documentation Considerations

For the normal developer, none.

### Testing Considerations

Adapts the tests originally written by @warner in #9431 , which seem to demonstrate that this works both for node-based and for XS-based vats.

### Upgrade Considerations

I don't believe there are any. When linked with an endo preceding even endojs/endo#2377 , the only consequence should be that the storage leak remains unfixed. Likewise, if an endo with endojs/endo#2377 and even endojs/endo#2408 is linked with an agoric-sdk prior to the PR, the only consequence should be that the storage leak remains unfixed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Why we still fail to endow liveSlots
2 participants