Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
41e8eb8
Add the filesystem snapshots configuration block with its parse refusals
kmatasfp Sep 23, 2026
e6cf655
Give the executor image the POSIX time zone UTC0
kmatasfp Sep 23, 2026
7845f9b
Classify a failed rustic operation as a snapshot store error
kmatasfp Sep 23, 2026
13f0854
Cancel, stage and write conditionally in the rustic backend, and publ…
kmatasfp Sep 23, 2026
9d167c8
Add the prune ledger of a snapshot scope and the rule that makes a pr…
kmatasfp Sep 23, 2026
a358148
Copy and delete a snapshot scope on its blobs
kmatasfp Sep 23, 2026
96d550a
Hold the delete of a dropped publish until the test reads the file
kmatasfp Sep 23, 2026
ba222da
Write the blobs of a scope copy in the reverse order of the listing
kmatasfp Sep 23, 2026
ac83e53
Separate the key constant of the configuration tests
kmatasfp Sep 23, 2026
6b3f431
Take the storage call deadline of the rustic bridge from the configur…
kmatasfp Sep 23, 2026
56157e3
Open the repository of the writer that makes the config file first
kmatasfp Sep 23, 2026
a9f8ea1
Add the rustic filesystem snapshot store
kmatasfp Sep 23, 2026
bba479a
Decide from a pure function whether a prune leaves marked packs, and …
kmatasfp Sep 23, 2026
4384f42
Test the snapshot reads, the ledger, the tree check, the tracker and …
kmatasfp Sep 23, 2026
7c832e9
Require that a refused tree leaves the scope without a blob
kmatasfp Sep 23, 2026
785cb08
Wake the waits for gateway bodies when a body starts, and let the tes…
kmatasfp Sep 23, 2026
94b2321
Try the dropped-save contract case in new scopes until a save does no…
kmatasfp Sep 23, 2026
c73a5dc
Classify a prune error as a storage error, and test the real chain of…
kmatasfp Sep 23, 2026
c0e489d
Shorten the doc of the default storage call deadline
kmatasfp Sep 23, 2026
855fd18
Pass the blobs of a scope as one value with one target label, share s…
kmatasfp Sep 23, 2026
224e1a4
Run the rule of the scripted test storage one time for each call
kmatasfp Sep 24, 2026
a49c636
Keep the tree packs of one operation in memory, with one read for eac…
kmatasfp Sep 24, 2026
ccd253e
Run saves and prunes at nice 19 on their own threads
kmatasfp Sep 24, 2026
a359a2b
Give each save and prune a rayon pool of its own, and start the globa…
kmatasfp Sep 24, 2026
f18d52a
Check that lowering the own priority gives Ok and nice 19
kmatasfp Sep 24, 2026
fb620d1
Let the caller of a save name its parent and choose the change detection
kmatasfp Sep 24, 2026
8be6236
Shorten the docs of the change detection and the save options, and re…
kmatasfp Sep 24, 2026
b5c2b09
Pass the name of low-priority work as a static str, and read the thre…
kmatasfp Sep 24, 2026
f7af20e
Check that a failed read of the snapshot files while a save finds its…
kmatasfp Sep 24, 2026
ff8047e
Check every storage call of the work of a save and of a prune at nice…
kmatasfp Sep 24, 2026
361a1d2
Set the approved defaults of the filesystem snapshot store: a 60 s de…
kmatasfp Sep 25, 2026
3f85464
Keep marked packs for 15 minutes and repack fast in a prune of the store
kmatasfp Sep 25, 2026
1fdc959
Prune a scope when its deleted snapshots free 10 percent of the size …
kmatasfp Sep 25, 2026
2eb1a16
Check the listing of the packs against the grace period alone, with a…
kmatasfp Sep 25, 2026
73bcc7a
Record the packs that no index lists as marked packs of a prune
kmatasfp Sep 25, 2026
1e8c0c6
Stop the blob calls of an operation at shut down, and let shut down w…
kmatasfp Sep 25, 2026
79fdad4
Keep one constant for the path of the config file of a repository
kmatasfp Sep 25, 2026
ad50366
Poll the shut down of the publish test again only when its first wait…
kmatasfp Sep 25, 2026
66c9ee7
Publish nothing when a save reaches its publish after shut down
kmatasfp Sep 25, 2026
2a11af9
Wrap the doc of the shut down of the store
kmatasfp Sep 25, 2026
a5a2047
Check that a cancel ends a running blob call of a copy
kmatasfp Sep 25, 2026
754f1f9
Check that a blob call of a cancelled operation does not start
kmatasfp Sep 25, 2026
f8e94e6
Give each waiting test of the rustic store a time limit
kmatasfp Sep 25, 2026
c621440
Wait for a blob call of the store and of the backend in one function
kmatasfp Sep 25, 2026
c334780
Take a claim before a prune, so concurrent deletes make one prune
kmatasfp Sep 25, 2026
9c94050
Say that the prune threshold is 10 percent of the size, rounded down
kmatasfp Sep 25, 2026
d83cd13
Check that a claim is taken one time and listed with its time
kmatasfp Sep 25, 2026
5e67f23
Prune only when the ledger did not change after the claim
kmatasfp Sep 25, 2026
bc746e2
Check that a failed prune and a failed second read each delete the claim
kmatasfp Sep 25, 2026
d9f8719
Keep the freed bytes of each delete in a record of its own, so no del…
kmatasfp Sep 25, 2026
29fb495
Keep the prune ledger as entries that are only added, and take the ne…
kmatasfp Sep 25, 2026
9358c84
Count each blob call of the store in its tracker, so shut down waits …
kmatasfp Sep 25, 2026
268be34
Add a margin for clock skew to the grace period and to the age of a c…
kmatasfp Sep 25, 2026
0501348
Check the margin for clock skew at the end of the grace period
kmatasfp Sep 25, 2026
9e8e076
Write a live claim again while its prune runs
kmatasfp Sep 25, 2026
b4ec7ca
Delete the claims of each old ledger after a prune
kmatasfp Sep 26, 2026
547deb4
Write the record of freed bytes before the forget of a delete
kmatasfp Sep 26, 2026
e69f9b5
Check that two deletes make at most one prune in each order of their …
kmatasfp Sep 26, 2026
e4b52c9
Release the claim of a prune on each error before the prune ran
kmatasfp Sep 26, 2026
012214e
Count the prune step and its refresh in the tracker, and stop the ref…
kmatasfp Sep 26, 2026
a2cd19c
Fail a copy when a prune removed a file that the copy listed
kmatasfp Sep 26, 2026
a669693
Keep the lists that a prune and a copy build one time as boxed slices
kmatasfp Sep 26, 2026
00a56a5
Count a record of freed bytes only when its snapshot files are gone
kmatasfp Sep 26, 2026
1522ca6
Run the forget and the restore of the store in rayon pools of their own
kmatasfp Sep 26, 2026
894fc7e
Sweep the orders of two deletes with the forget, late calls and the r…
kmatasfp Sep 26, 2026
beefc86
Write each record of freed bytes if absent, and count a record withou…
kmatasfp Sep 26, 2026
decf1ab
Keep the times of prune claims in marker names, and keep the claim of…
kmatasfp Sep 26, 2026
52b2352
Release a prune claim in a tracked task with a token of its own
kmatasfp Sep 26, 2026
7f65378
Find old claim directories with a listing of the directories and a li…
kmatasfp Sep 26, 2026
3d85e27
Check the tree of a save and the directory of a restore on a blocking…
kmatasfp Sep 26, 2026
9f54901
Release a prune claim by deleting the claim and its first marker by n…
kmatasfp Sep 26, 2026
81a6968
Keep snapshot ids, claim paths and listed directories in boxed forms
kmatasfp Sep 26, 2026
0527832
Plan a prune again when a concurrent forget removed a snapshot file, …
kmatasfp Sep 26, 2026
d2d7068
Sweep the marker steps of the claims, the refresh with a short grace …
kmatasfp Sep 26, 2026
acb42e6
Say in the doc of a prune that only an error before the prune started…
kmatasfp Sep 26, 2026
73190af
Open the gate of the single read test when the second thread waits fo…
kmatasfp Sep 26, 2026
28a0626
Delete after a prune only the claim directories of older ledgers, and…
kmatasfp Sep 26, 2026
31309a3
Fence a prune with a lease that each marker write moves, so a prune w…
kmatasfp Sep 26, 2026
cd28130
Hold a prune claim in a guard from its first marker until the prune s…
kmatasfp Sep 26, 2026
9b84b4a
Sweep a drop of a delete between its claim and its prune
kmatasfp Sep 26, 2026
e590b31
Read the instant of the lease and the time in the name of a marker at…
kmatasfp Sep 26, 2026
9912dc4
Cancel a held call only after the storage holds it, not after a sleep
kmatasfp Sep 26, 2026
bd36704
Say that a prune whose attempts each found a snapshot file gone relea…
kmatasfp Sep 26, 2026
5ab706c
Read the instant of a marker before its wall time, and end its lease …
kmatasfp Sep 26, 2026
e9ea7e4
Hold a claim for one more storage call deadline, for a final marker t…
kmatasfp Sep 26, 2026
b79f905
Start the lease of a prune at its first marker, and keep a lease that…
kmatasfp Sep 26, 2026
bcdf254
Check the shut down before a delete builds its claim guard
kmatasfp Sep 26, 2026
f9a3699
Write the final marker of a started prune through the claim guard, al…
kmatasfp Sep 26, 2026
2b8e7f7
Name the hold of a claim as the delay of a late marker, and add the m…
kmatasfp Sep 26, 2026
8d38f44
Limit each async storage test of the prune module to 60 s
kmatasfp Sep 26, 2026
e7729c2
Read the clock for the claim choice after the claim listing
kmatasfp Sep 26, 2026
bf3700b
Take back a step of a dropped delete whose call its cancel ended, and…
kmatasfp Sep 26, 2026
ce108bf
Fence the ledger write of a prune with its lease
kmatasfp Sep 27, 2026
0c2ca57
Say that the next prune waits a full hold from the newest claim marke…
kmatasfp Sep 27, 2026
98676eb
Name the calls that run after the cancel of a shut down, and the clai…
kmatasfp Sep 27, 2026
f701a8c
Say that a claim guard releases its claim after the cancel, not that …
kmatasfp Sep 27, 2026
c196a10
Limit each async test of the store, scope, publish and rustic modules…
kmatasfp Sep 27, 2026
45a5f1d
Treat a final marker call as the start of the prune of a dropped dele…
kmatasfp Sep 27, 2026
a2f1a1b
Leave the timeout off the three repository settings and inspect tests
kmatasfp Sep 27, 2026
d9d36e8
Open the repository of the winner when a first save loses its creatio…
kmatasfp Sep 27, 2026
7392a23
Shut the store down in the shut-down test only after the save holds i…
kmatasfp Sep 27, 2026
4c4c4ff
Wait a full hold of a claim after the last prune before the next one …
kmatasfp Sep 27, 2026
f62303c
Say how long the next prune waits in the docs of the prune grace peri…
kmatasfp Sep 27, 2026
dfbc73b
Run low-priority work on its own thread in its own pool on each platform
kmatasfp Sep 27, 2026
63f5301
Count the check of the local path of a save or a restore in the tracker
kmatasfp Sep 27, 2026
e2a377a
Share the claim directory of a guard and its tasks as one Arc path
kmatasfp Sep 27, 2026
19903c0
Give retryable Storage for an index file that a prune deleted after t…
kmatasfp Sep 27, 2026
b04e4eb
Name two prune tests by what they prove, and fix the words and the la…
kmatasfp Sep 27, 2026
0145e59
Test that a marker write that starts at the end of the lease does not…
kmatasfp Sep 27, 2026
ebdb4d3
Test that a record line parses only when it has 64 hex characters
kmatasfp Sep 27, 2026
470b831
Build the check for a lease that ran out only for tests
kmatasfp Sep 27, 2026
d85b988
Test that a restore builds its pool with the restore reader threads
kmatasfp Sep 27, 2026
9fc809b
Keep the publish guard armed until the delete after a failed write ends
kmatasfp Sep 27, 2026
af609a2
Check the cancel of a save in the first poll of its publish
kmatasfp Sep 27, 2026
c400d75
Say what the save contract lets a store do with a parent, so that bot…
kmatasfp Sep 27, 2026
7b261d2
Keep the directory and the number of a claim only in its guard, behin…
kmatasfp Sep 27, 2026
130f623
Share one check for the forget of a delete between the store tests an…
kmatasfp Sep 27, 2026
39f77f4
Test that a prune refreshes its claim with its own number
kmatasfp Sep 27, 2026
1154ab5
Test that a prune whose attempts each find a snapshot file gone after…
kmatasfp Sep 27, 2026
c212acb
Say in the marker docs that a write which starts after the end of the…
kmatasfp Sep 27, 2026
4add917
Read the records of freed bytes only when a prune can still be due
kmatasfp Sep 27, 2026
93e43d1
Read a range of a tree pack that is not kept once the kept packs fill…
kmatasfp Sep 27, 2026
c437311
Say in the fixed drop tests why they repeat the order, not how the or…
kmatasfp Sep 27, 2026
d5db897
Close the kept packs when a pack that was read whole does not fit
kmatasfp Sep 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions golem-debugging-service/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ impl DebugConfig {
public_worker_api: self.public_worker_api,
memory: self.memory,
filesystem_storage: Default::default(),
filesystem_snapshots: Default::default(),
resource_usage_metering: Default::default(),
rdbms: self.rdbms,
resource_limits: self.resource_limits,
Expand Down
5 changes: 2 additions & 3 deletions golem-worker-executor/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ autotests = false

[features]
test-utils = []
fs-snapshot-benchmark = ["dep:clap", "dep:rayon"]
fs-snapshot-benchmark = ["dep:clap"]

[lib]
path = "src/lib.rs"
Expand Down Expand Up @@ -96,7 +96,7 @@ prometheus = { workspace = true }
prost = { workspace = true }
prost-types = { workspace = true }
rand = { workspace = true }
rayon = { workspace = true, optional = true }
rayon = { workspace = true }
regex = { workspace = true }
ringbuf = { workspace = true }
rustic_core = { workspace = true }
Expand Down Expand Up @@ -169,7 +169,6 @@ goldenfile = { workspace = true }
pretty_assertions = { workspace = true, features = [ "unstable" ] }
proptest = { workspace = true }
rand = { workspace = true }
rayon = { workspace = true }
redis = { workspace = true }
serde_json = { workspace = true }
test-r = { workspace = true }
Expand Down
3 changes: 3 additions & 0 deletions golem-worker-executor/config/worker-executor.sample.env
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_CAPACITY=1000
GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_EVICTION_INTERVAL="1m"
GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_TTL__NANOS=0
GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_TTL__SECS=300
GOLEM__FILESYSTEM_SNAPSHOTS__TYPE="Disabled"
#GOLEM__FILESYSTEM_STORAGE__DETERMINISTIC_ROOT_DIR=
#GOLEM__FILESYSTEM_STORAGE__MANAGED_XFS_ROOT_DIR=
GOLEM__FILESYSTEM_STORAGE__CLEANUP_RETRY__MAX_ATTEMPTS=4
Expand Down Expand Up @@ -337,6 +338,7 @@ GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_CAPACITY=1000
GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_EVICTION_INTERVAL="1m"
GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_TTL__NANOS=0
GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_TTL__SECS=300
GOLEM__FILESYSTEM_SNAPSHOTS__TYPE="Disabled"
#GOLEM__FILESYSTEM_STORAGE__DETERMINISTIC_ROOT_DIR=
#GOLEM__FILESYSTEM_STORAGE__MANAGED_XFS_ROOT_DIR=
GOLEM__FILESYSTEM_STORAGE__CLEANUP_RETRY__MAX_ATTEMPTS=4
Expand Down Expand Up @@ -614,6 +616,7 @@ GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_CAPACITY=1000
GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_EVICTION_INTERVAL="1m"
GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_TTL__NANOS=0
GOLEM__ENVIRONMENT_STATE_SERVICE__CACHE_TTL__SECS=300
GOLEM__FILESYSTEM_SNAPSHOTS__TYPE="Disabled"
#GOLEM__FILESYSTEM_STORAGE__DETERMINISTIC_ROOT_DIR=
#GOLEM__FILESYSTEM_STORAGE__MANAGED_XFS_ROOT_DIR=
GOLEM__FILESYSTEM_STORAGE__CLEANUP_RETRY__MAX_ATTEMPTS=4
Expand Down
15 changes: 15 additions & 0 deletions golem-worker-executor/config/worker-executor.toml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@ cache_eviction_interval = "1m"
nanos = 0
secs = 300

[filesystem_snapshots]
type = "Disabled"

[filesystem_snapshots.config]

[filesystem_storage.cleanup_retry]
max_attempts = 4
max_delay = "250ms"
Expand Down Expand Up @@ -507,6 +512,11 @@ without_time = false
# nanos = 0
# secs = 300
#
# [filesystem_snapshots]
# type = "Disabled"
#
# [filesystem_snapshots.config]
#
# [filesystem_storage.cleanup_retry]
# max_attempts = 4
# max_delay = "250ms"
Expand Down Expand Up @@ -916,6 +926,11 @@ without_time = false
# nanos = 0
# secs = 300
#
# [filesystem_snapshots]
# type = "Disabled"
#
# [filesystem_snapshots.config]
#
# [filesystem_storage.cleanup_retry]
# max_attempts = 4
# max_delay = "250ms"
Expand Down
4 changes: 4 additions & 0 deletions golem-worker-executor/docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ LABEL cloud.golem.cpu.features="neon,crc,lse,aes,sha2,dotprod"

FROM platform-${TARGETARCH} AS final

# The image has no time zone database. jiff reads this POSIX rule without one, so the snapshot
# store writes no time zone warning for each timestamp.
ENV TZ=UTC0

WORKDIR /app
COPY /target/$RUST_TARGET/release/worker-executor ./
COPY /golem-worker-executor/config/worker-executor.toml ./config/worker-executor.toml
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,10 @@ mod volume;

use super::rustic::{
ChangeDetection, Chunking, Compression, InspectReport, PhaseTime, Repository, RepositoryKey,
RepositorySettings, STORAGE_CALL_DEADLINE, SaveSettings,
RepositorySettings, SaveSettings,
};
use super::{SnapshotName, SnapshotScope};
use crate::services::golem_config::DEFAULT_FILESYSTEM_SNAPSHOT_STORAGE_CALL_DEADLINE as STORAGE_CALL_DEADLINE;
use agents::{AgentStorage, FIRST_AGENT};
use golem_common::model::environment::EnvironmentId;
use golem_service_base::storage::blob::{BlobStorage, BlobStorageNamespace};
Expand Down
Loading
Loading