worker: cover legacy sub-worker restore cleanup
This commit is contained in:
@@ -0,0 +1,67 @@
|
|||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use manifest::{Permission, Scope, ScopeConfig, ScopeRule, SharedScope};
|
||||||
|
use session_store::{
|
||||||
|
CombinedStore, FsStore, FsWorkerStore, WorkerMetadata, WorkerMetadataStore, WorkerSpawnedChild,
|
||||||
|
WorkerSpawnedScopeRule,
|
||||||
|
};
|
||||||
|
use tempfile::TempDir;
|
||||||
|
use worker::runtime::dir::RuntimeDir;
|
||||||
|
use worker::spawn::registry::SpawnedWorkerRegistry;
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn restore_reclaims_and_clears_legacy_process_children() {
|
||||||
|
let runtime = TempDir::new().unwrap();
|
||||||
|
let sessions = TempDir::new().unwrap();
|
||||||
|
let scope_root = TempDir::new().unwrap();
|
||||||
|
let store = CombinedStore::new(
|
||||||
|
FsStore::new(sessions.path()).unwrap(),
|
||||||
|
FsWorkerStore::new(sessions.path().join("workers")).unwrap(),
|
||||||
|
);
|
||||||
|
let mut metadata = WorkerMetadata::new("parent", None);
|
||||||
|
metadata.spawned_children.push(WorkerSpawnedChild {
|
||||||
|
worker_name: "legacy-child".into(),
|
||||||
|
socket_path: runtime.path().join("legacy.sock"),
|
||||||
|
callback_address: runtime.path().join("parent.sock"),
|
||||||
|
scope_delegated: vec![WorkerSpawnedScopeRule {
|
||||||
|
target: scope_root.path().to_path_buf(),
|
||||||
|
permission: "write".into(),
|
||||||
|
recursive: true,
|
||||||
|
}],
|
||||||
|
});
|
||||||
|
store.write(&metadata).unwrap();
|
||||||
|
|
||||||
|
let write_rule = ScopeRule {
|
||||||
|
target: scope_root.path().to_path_buf(),
|
||||||
|
permission: Permission::Write,
|
||||||
|
recursive: true,
|
||||||
|
};
|
||||||
|
let parent_scope = SharedScope::new(
|
||||||
|
Scope::from_config(&ScopeConfig {
|
||||||
|
allow: vec![write_rule.clone()],
|
||||||
|
deny: vec![write_rule],
|
||||||
|
})
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
assert!(!parent_scope.snapshot().is_writable(scope_root.path()));
|
||||||
|
let runtime_dir = Arc::new(RuntimeDir::create(runtime.path(), "parent").await.unwrap());
|
||||||
|
|
||||||
|
let loaded = SpawnedWorkerRegistry::load_from_worker_state_with_reclaim(
|
||||||
|
runtime_dir.clone(),
|
||||||
|
store.clone(),
|
||||||
|
"parent".into(),
|
||||||
|
Some(parent_scope.clone()),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert!(loaded.reclaimed_unreachable);
|
||||||
|
assert!(parent_scope.snapshot().is_writable(scope_root.path()));
|
||||||
|
let metadata = store.read_by_name("parent").unwrap().unwrap();
|
||||||
|
assert!(metadata.spawned_children.is_empty());
|
||||||
|
assert_eq!(metadata.reclaimed_children.len(), 1);
|
||||||
|
assert_eq!(metadata.reclaimed_children[0].worker_name, "legacy-child");
|
||||||
|
let runtime_projection =
|
||||||
|
std::fs::read_to_string(runtime_dir.path().join("spawned_workers.json")).unwrap();
|
||||||
|
assert_eq!(runtime_projection.trim(), "[]");
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user