From 9feac7738f5dbe9f2f32cfa297582d3b520cb049 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Fri, 3 Apr 2026 20:33:59 +0900 Subject: internal/pkg: optionally suppress via assumed checksum This is quite error-prone and causes cache inconsistency similar to the store inconsistency seen on nix when a similar condition happens. Keep this behind a flag in case it is ever beneficial. Signed-off-by: Ophestra --- internal/pkg/pkg.go | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'internal/pkg/pkg.go') diff --git a/internal/pkg/pkg.go b/internal/pkg/pkg.go index 0c882bea..ccb7541e 100644 --- a/internal/pkg/pkg.go +++ b/internal/pkg/pkg.go @@ -507,6 +507,20 @@ const ( // CSchedIdle arranges for the [ext.SCHED_IDLE] scheduling priority to be // set for [KindExec] and [KindExecNet] containers. CSchedIdle + + // CAssumeChecksum enables the use of [KnownChecksum] for duplicate function + // call suppression via the on-disk cache. + // + // This may cause incorrect cure outcome if an impossible checksum is + // specified that matches an output already present in the on-disk cache. + // This may be avoided by purposefully specifying a statistically + // unattainable checksum, like the zero value. + // + // While this optimisation might seem appealing, it is almost never + // applicable in real world use. Almost every time this path was taken, it + // was caused by an incorrect checksum accidentally left behind while + // bumping a package. Only enable this if you are really sure you need it. + CAssumeChecksum ) // Cache is a support layer that implementations of [Artifact] can use to store @@ -1041,7 +1055,7 @@ func (c *Cache) finaliseIdent( // [FileArtifact] to the filesystem. If err is nil, the caller is responsible // for closing the resulting [io.ReadCloser]. func (c *Cache) openFile(f FileArtifact) (r io.ReadCloser, err error) { - if kc, ok := f.(KnownChecksum); ok { + if kc, ok := f.(KnownChecksum); c.flags&CAssumeChecksum != 0 && ok { c.checksumMu.RLock() r, err = os.Open(c.base.Append( dirChecksum, @@ -1484,16 +1498,18 @@ func (c *Cache) cure(a Artifact, curesExempt bool) ( checksums, ) - c.checksumMu.RLock() - checksumFi, err = os.Stat(checksumPathname.String()) - c.checksumMu.RUnlock() + if c.flags&CAssumeChecksum != 0 { + c.checksumMu.RLock() + checksumFi, err = os.Stat(checksumPathname.String()) + c.checksumMu.RUnlock() - if err != nil { - if !errors.Is(err, os.ErrNotExist) { - return - } + if err != nil { + if !errors.Is(err, os.ErrNotExist) { + return + } - checksumFi, err = nil, nil + checksumFi, err = nil, nil + } } } -- cgit v1.3.1