| 1 | package checkpoint |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
| 5 | "os" |
| 6 | "path/filepath" |
| 7 | ) |
| 8 | |
| 9 | func (s *Store) expirePayloadLocked(c *Checkpoint) error { |
| 10 | if c == nil || c.ExpiredFilePayload { |
| 11 | return nil |
| 12 | } |
| 13 | expired := *c |
| 14 | expired.Result = c.Result.Summary() |
| 15 | if expired.Result != nil { |
| 16 | for i := range expired.Result.Files { |
| 17 | expired.Result.Files[i].Unavailable = "expired" |
| 18 | } |
| 19 | } |
| 20 | expired.Files = append([]FileSnap(nil), c.Files...) |
| 21 | expired.CoverageGaps = append([]CoverageGap(nil), c.CoverageGaps...) |
| 22 | for i := range expired.Files { |
| 23 | expired.Files[i].BlobRef = "" |
| 24 | expired.Files[i].Content = nil |
| 25 | expired.Files[i].PayloadExpired = true |
| 26 | } |
| 27 | expired.ExpiredFilePayload = true |
| 28 | expired.Coverage = CoveragePartial |
| 29 | expired.CoverageGaps = append(expired.CoverageGaps, CoverageGap{Reason: GapExpiredPayload, Detail: "file recovery payload expired"}) |
| 30 | if err := s.persist(&expired); err != nil { |
| 31 | return err |
| 32 | } |
| 33 | if s.dir != "" { |
| 34 | legacyVisible := filepath.Join(s.dir, fmt.Sprintf("turn-%d.json", c.Turn)) |
| 35 | if err := os.Remove(legacyVisible); err != nil && !os.IsNotExist(err) { |
| 36 | _ = os.Remove(s.checkpointPath(&expired)) |
| 37 | return err |
| 38 | } |
| 39 | } |
| 40 | *c = expired |
| 41 | return nil |
| 42 | } |
| 43 |