| 66 | } |
| 67 | |
| 68 | func getLogSessions(ctx context.Context, st blob.Reader) ([]*logSessionInfo, error) { |
| 69 | sessions := map[string]*logSessionInfo{} |
| 70 | |
| 71 | var allSessions []*logSessionInfo |
| 72 | |
| 73 | if err := st.ListBlobs(ctx, repodiag.LogBlobPrefix, func(bm blob.Metadata) error { |
| 74 | parts := strings.Split(string(bm.BlobID), "_") |
| 75 | |
| 76 | //nolint:mnd |
| 77 | if len(parts) < 8 { |
| 78 | log(ctx).Errorf("invalid part count: %v skipping unrecognized log: %v", len(parts), bm.BlobID) |
| 79 | return nil |
| 80 | } |
| 81 | |
| 82 | id := parts[2] + "_" + parts[3] |
| 83 | |
| 84 | startTime, err := strconv.ParseInt(parts[4], 10, 64) |
| 85 | if err != nil { |
| 86 | log(ctx).Errorf("invalid start time - skipping unrecognized log: %v", bm.BlobID) |
| 87 | |
| 88 | //nolint:nilerr |
| 89 | return nil |
| 90 | } |
| 91 | |
| 92 | endTime, err := strconv.ParseInt(parts[5], 10, 64) |
| 93 | if err != nil { |
| 94 | log(ctx).Errorf("invalid end time - skipping unrecognized log: %v", bm.BlobID) |
| 95 | |
| 96 | //nolint:nilerr |
| 97 | return nil |
| 98 | } |
| 99 | |
| 100 | s := sessions[id] |
| 101 | if s == nil { |
| 102 | s = &logSessionInfo{ |
| 103 | id: id, |
| 104 | } |
| 105 | sessions[id] = s |
| 106 | allSessions = append(allSessions, s) |
| 107 | } |
| 108 | |
| 109 | if t := time.Unix(startTime, 0); s.startTime.IsZero() || t.Before(s.startTime) { |
| 110 | s.startTime = t |
| 111 | } |
| 112 | |
| 113 | if t := time.Unix(endTime, 0); t.After(s.endTime) { |
| 114 | s.endTime = t |
| 115 | } |
| 116 | |
| 117 | s.segments = append(s.segments, bm) |
| 118 | s.totalSize += bm.Length |
| 119 | |
| 120 | return nil |
| 121 | }); err != nil { |
| 122 | return nil, errors.Wrap(err, "error listing logs") |
| 123 | } |
| 124 | |
| 125 | for _, s := range allSessions { |