Skip to content

Commit 3b3f4f1

Browse files
authored
Add a new subcommand to workerd for making a Python snapshot (#3368)
For now this only makes baseline snapshots but we can extend it to make package snapshots when we need it.
1 parent dd3effd commit 3b3f4f1

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

src/workerd/server/workerd.c++

+33
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,9 @@ class CliMain final: public SchemaFileImpl::ErrorReporter {
703703
.addSubCommand("test", KJ_BIND_METHOD(*this, getTest), "run unit tests")
704704
.addSubCommand("pyodide-lock", KJ_BIND_METHOD(*this, getPyodideLock),
705705
"outputs the package lock file used by Pyodide")
706+
.addSubCommand("make-pyodide-baseline-snapshot",
707+
KJ_BIND_METHOD(*this, getMakePyodideBaselineSnapshot),
708+
"Make a Pyodide baseline memory snapshot")
706709
.build();
707710
// TODO(someday):
708711
// "validate": Loads the config and parses all the code to report errors, but then exits
@@ -899,6 +902,18 @@ class CliMain final: public SchemaFileImpl::ErrorReporter {
899902
.build();
900903
}
901904

905+
kj::MainFunc getMakePyodideBaselineSnapshot() {
906+
server->allowExperimental();
907+
server->setPythonCreateBaselineSnapshot();
908+
auto builder =
909+
kj::MainBuilder(context, getVersionString(), "Make a Pyodide baseline memory snapshot", "");
910+
setPyodideDiskCacheDir(".");
911+
return builder.expectArg("<python-version>", CLI_METHOD(parsePythonCompatFlag))
912+
.expectArg("<output-directory>", CLI_METHOD(setPackageDiskCacheDir))
913+
.callAfterParsing(CLI_METHOD(test))
914+
.build();
915+
}
916+
902917
void addImportPath(kj::StringPtr pathStr) {
903918
auto path = fs->getCurrentPath().evalNative(pathStr);
904919
if (fs->getRoot().tryOpenSubdir(path) != kj::none) {
@@ -1023,6 +1038,24 @@ class CliMain final: public SchemaFileImpl::ErrorReporter {
10231038
server->setPyodideDiskCacheRoot(kj::mv(dir));
10241039
}
10251040

1041+
void parsePythonCompatFlag(kj::StringPtr compatFlagStr) {
1042+
auto builder = kj::heap<capnp::MallocMessageBuilder>();
1043+
auto configBuilder = builder->initRoot<config::Config>();
1044+
auto service = configBuilder.initServices(1)[0];
1045+
service.setName("main");
1046+
auto worker = service.initWorker();
1047+
worker.setCompatibilityDate("2023-12-18");
1048+
auto flags = worker.initCompatibilityFlags(2);
1049+
flags.set(0, compatFlagStr);
1050+
flags.set(1, "python_workers");
1051+
auto mod = worker.initModules(1)[0];
1052+
mod.setName("main.py");
1053+
mod.setPythonModule("def test():\n pass");
1054+
config = configBuilder.asReader();
1055+
configOwner = kj::mv(builder);
1056+
util::Autogate::initAutogate(getConfig().getAutogates());
1057+
}
1058+
10261059
void watch() {
10271060
#if _WIN32
10281061
auto& w = watcher.emplace(io.win32EventPort);

0 commit comments

Comments
 (0)