(core) ensure randomness works when sandbox is cloned from a checkpoint

Summary:
This calls a new `initialize` method on the sandbox before we start
doing calculations with it, to make sure that `random.seed()` has
been called. Otherwise, if the sandbox is cloned from a checkpoint,
the seed will have been reset.

The `initialize` method includes the functionality previously done
by `set_doc_url` since it is also initialization/personalization and
this way we avoid introducing another round trip to the sandbox.

Test Plan: tested with grist-core configured to use gvisor

Reviewers: georgegevoian, dsagal

Reviewed By: georgegevoian, dsagal

Subscribers: alexmojaki

Differential Revision: https://phab.getgrist.com/D3549
This commit is contained in:
Paul Fitzpatrick 2022-07-27 14:19:41 -04:00
parent 364715eba3
commit 7078922a65
3 changed files with 10 additions and 9 deletions

View File

@ -2059,9 +2059,7 @@ export class ActiveDoc extends EventEmitter {
num_on_demand_tables: onDemandNames.length, num_on_demand_tables: onDemandNames.length,
}); });
if (this._options?.docUrl) { await this._pyCall('initialize', this._options?.docUrl);
await this._pyCall('set_doc_url', this._options.docUrl);
}
// Calculations are not associated specifically with the user opening the document. // Calculations are not associated specifically with the user opening the document.
// TODO: be careful with which users can create formulas. // TODO: be careful with which users can create formulas.

View File

@ -15,10 +15,6 @@ from functions.info import ISNUMBER, ISLOGICAL
from functions.unimplemented import unimplemented from functions.unimplemented import unimplemented
import roman import roman
if os.environ.get("DETERMINISTIC_MODE"):
random.seed(1)
# Iterates through elements of iterable arguments, or through individual args when not iterable. # Iterates through elements of iterable arguments, or through individual args when not iterable.
def _chain(*values_or_iterables): def _chain(*values_or_iterables):
for v in values_or_iterables: for v in values_or_iterables:

View File

@ -3,6 +3,7 @@ This module defines what sandbox functions are made available to the Node contro
and starts the grist sandbox. See engine.py for the API documentation. and starts the grist sandbox. See engine.py for the API documentation.
""" """
import os import os
import random
import sys import sys
sys.path.append('thirdparty') sys.path.append('thirdparty')
# pylint: disable=wrong-import-position # pylint: disable=wrong-import-position
@ -121,7 +122,13 @@ def run(sandbox):
return schema.SCHEMA_VERSION return schema.SCHEMA_VERSION
@export @export
def set_doc_url(doc_url): def initialize(doc_url):
if os.environ.get("DETERMINISTIC_MODE"):
random.seed(1)
else:
# Make sure we have randomness, even if we are being cloned from a checkpoint
random.seed()
if doc_url:
os.environ['DOC_URL'] = doc_url os.environ['DOC_URL'] = doc_url
@export @export