|
4 | 4 | "context"
|
5 | 5 | "encoding/json"
|
6 | 6 | "errors"
|
7 |
| - "time" |
8 | 7 |
|
9 | 8 | godigest "github.com/opencontainers/go-digest"
|
10 | 9 | ispec "github.com/opencontainers/image-spec/specs-go/v1"
|
@@ -108,66 +107,65 @@ func getReposToBeDeleted(allStorageRepos []string, allMetaDBRepos []string) []st
|
108 | 107 | func ParseRepo(repo string, metaDB mTypes.MetaDB, storeController stypes.StoreController, log log.Logger) error {
|
109 | 108 | imageStore := storeController.GetImageStore(repo)
|
110 | 109 |
|
111 |
| - var lockLatency time.Time |
| 110 | + err := imageStore.WithRepoReadLock(repo, func() error { |
| 111 | + indexBlob, err := imageStore.GetIndexContent(repo) |
| 112 | + if err != nil { |
| 113 | + log.Error().Err(err).Str("repository", repo).Msg("failed to read index.json for repo") |
112 | 114 |
|
113 |
| - imageStore.RLock(&lockLatency) |
114 |
| - defer imageStore.RUnlock(&lockLatency) |
| 115 | + return err |
| 116 | + } |
115 | 117 |
|
116 |
| - indexBlob, err := imageStore.GetIndexContent(repo) |
117 |
| - if err != nil { |
118 |
| - log.Error().Err(err).Str("repository", repo).Msg("failed to read index.json for repo") |
| 118 | + var indexContent ispec.Index |
119 | 119 |
|
120 |
| - return err |
121 |
| - } |
| 120 | + err = json.Unmarshal(indexBlob, &indexContent) |
| 121 | + if err != nil { |
| 122 | + log.Error().Err(err).Str("repository", repo).Msg("failed to unmarshal index.json for repo") |
122 | 123 |
|
123 |
| - var indexContent ispec.Index |
| 124 | + return err |
| 125 | + } |
124 | 126 |
|
125 |
| - err = json.Unmarshal(indexBlob, &indexContent) |
126 |
| - if err != nil { |
127 |
| - log.Error().Err(err).Str("repository", repo).Msg("failed to unmarshal index.json for repo") |
| 127 | + err = metaDB.ResetRepoReferences(repo) |
| 128 | + if err != nil && !errors.Is(err, zerr.ErrRepoMetaNotFound) { |
| 129 | + log.Error().Err(err).Str("repository", repo).Msg("failed to reset tag field in RepoMetadata for repo") |
128 | 130 |
|
129 |
| - return err |
130 |
| - } |
| 131 | + return err |
| 132 | + } |
131 | 133 |
|
132 |
| - err = metaDB.ResetRepoReferences(repo) |
133 |
| - if err != nil && !errors.Is(err, zerr.ErrRepoMetaNotFound) { |
134 |
| - log.Error().Err(err).Str("repository", repo).Msg("failed to reset tag field in RepoMetadata for repo") |
| 134 | + for _, manifest := range indexContent.Manifests { |
| 135 | + tag := manifest.Annotations[ispec.AnnotationRefName] |
135 | 136 |
|
136 |
| - return err |
137 |
| - } |
| 137 | + if zcommon.IsReferrersTag(tag) { |
| 138 | + continue |
| 139 | + } |
138 | 140 |
|
139 |
| - for _, manifest := range indexContent.Manifests { |
140 |
| - tag := manifest.Annotations[ispec.AnnotationRefName] |
| 141 | + manifestBlob, _, _, err := imageStore.GetImageManifest(repo, manifest.Digest.String()) |
| 142 | + if err != nil { |
| 143 | + log.Error().Err(err).Str("repository", repo).Str("digest", manifest.Digest.String()). |
| 144 | + Msg("failed to get blob for image") |
141 | 145 |
|
142 |
| - if zcommon.IsReferrersTag(tag) { |
143 |
| - continue |
144 |
| - } |
| 146 | + return err |
| 147 | + } |
145 | 148 |
|
146 |
| - manifestBlob, _, _, err := imageStore.GetImageManifest(repo, manifest.Digest.String()) |
147 |
| - if err != nil { |
148 |
| - log.Error().Err(err).Str("repository", repo).Str("digest", manifest.Digest.String()). |
149 |
| - Msg("failed to get blob for image") |
| 149 | + reference := tag |
150 | 150 |
|
151 |
| - return err |
152 |
| - } |
| 151 | + if tag == "" { |
| 152 | + reference = manifest.Digest.String() |
| 153 | + } |
153 | 154 |
|
154 |
| - reference := tag |
| 155 | + err = SetImageMetaFromInput(context.Background(), repo, reference, manifest.MediaType, manifest.Digest, manifestBlob, |
| 156 | + imageStore, metaDB, log) |
| 157 | + if err != nil { |
| 158 | + log.Error().Err(err).Str("repository", repo).Str("tag", tag). |
| 159 | + Msg("failed to set metadata for image") |
155 | 160 |
|
156 |
| - if tag == "" { |
157 |
| - reference = manifest.Digest.String() |
| 161 | + return err |
| 162 | + } |
158 | 163 | }
|
159 | 164 |
|
160 |
| - err = SetImageMetaFromInput(context.Background(), repo, reference, manifest.MediaType, manifest.Digest, manifestBlob, |
161 |
| - imageStore, metaDB, log) |
162 |
| - if err != nil { |
163 |
| - log.Error().Err(err).Str("repository", repo).Str("tag", tag). |
164 |
| - Msg("failed to set metadata for image") |
165 |
| - |
166 |
| - return err |
167 |
| - } |
168 |
| - } |
| 165 | + return nil |
| 166 | + }) |
169 | 167 |
|
170 |
| - return nil |
| 168 | + return err |
171 | 169 | }
|
172 | 170 |
|
173 | 171 | func getAllRepos(storeController stypes.StoreController, log log.Logger) ([]string, error) {
|
@@ -222,34 +220,33 @@ func getCosignSignatureLayersInfo(
|
222 | 220 | return layers, err
|
223 | 221 | }
|
224 | 222 |
|
225 |
| - var lockLatency time.Time |
226 |
| - |
227 |
| - imageStore.RLock(&lockLatency) |
228 |
| - defer imageStore.RUnlock(&lockLatency) |
| 223 | + err := imageStore.WithRepoReadLock(repo, func() error { |
| 224 | + for _, layer := range manifestContent.Layers { |
| 225 | + layerContent, err := imageStore.GetBlobContent(repo, layer.Digest) |
| 226 | + if err != nil { |
| 227 | + log.Error().Err(err).Str("repository", repo).Str("reference", tag).Str("layerDigest", layer.Digest.String()). |
| 228 | + Msg("failed to get cosign signature layer content") |
229 | 229 |
|
230 |
| - for _, layer := range manifestContent.Layers { |
231 |
| - layerContent, err := imageStore.GetBlobContent(repo, layer.Digest) |
232 |
| - if err != nil { |
233 |
| - log.Error().Err(err).Str("repository", repo).Str("reference", tag).Str("layerDigest", layer.Digest.String()).Msg( |
234 |
| - "failed to get cosign signature layer content") |
| 230 | + return err |
| 231 | + } |
235 | 232 |
|
236 |
| - return layers, err |
237 |
| - } |
| 233 | + layerSigKey, ok := layer.Annotations[zcommon.CosignSigKey] |
| 234 | + if !ok { |
| 235 | + log.Error().Err(err).Str("repository", repo).Str("reference", tag).Str("layerDigest", layer.Digest.String()). |
| 236 | + Msg("failed to get specific annotation of cosign signature") |
| 237 | + } |
238 | 238 |
|
239 |
| - layerSigKey, ok := layer.Annotations[zcommon.CosignSigKey] |
240 |
| - if !ok { |
241 |
| - log.Error().Err(err).Str("repository", repo).Str("reference", tag).Str("layerDigest", layer.Digest.String()).Msg( |
242 |
| - "failed to get specific annotation of cosign signature") |
| 239 | + layers = append(layers, mTypes.LayerInfo{ |
| 240 | + LayerDigest: layer.Digest.String(), |
| 241 | + LayerContent: layerContent, |
| 242 | + SignatureKey: layerSigKey, |
| 243 | + }) |
243 | 244 | }
|
244 | 245 |
|
245 |
| - layers = append(layers, mTypes.LayerInfo{ |
246 |
| - LayerDigest: layer.Digest.String(), |
247 |
| - LayerContent: layerContent, |
248 |
| - SignatureKey: layerSigKey, |
249 |
| - }) |
250 |
| - } |
| 246 | + return nil |
| 247 | + }) |
251 | 248 |
|
252 |
| - return layers, nil |
| 249 | + return layers, err |
253 | 250 | }
|
254 | 251 |
|
255 | 252 | func getNotationSignatureLayersInfo(
|
@@ -279,28 +276,27 @@ func getNotationSignatureLayersInfo(
|
279 | 276 |
|
280 | 277 | layer := manifestContent.Layers[0].Digest
|
281 | 278 |
|
282 |
| - var lockLatency time.Time |
| 279 | + err := imageStore.WithRepoReadLock(repo, func() error { |
| 280 | + layerContent, err := imageStore.GetBlobContent(repo, layer) |
| 281 | + if err != nil { |
| 282 | + log.Error().Err(err).Str("repository", repo).Str("reference", manifestDigest).Str("layerDigest", layer.String()). |
| 283 | + Msg("failed to get notation signature blob content") |
283 | 284 |
|
284 |
| - imageStore.RLock(&lockLatency) |
285 |
| - defer imageStore.RUnlock(&lockLatency) |
| 285 | + return err |
| 286 | + } |
286 | 287 |
|
287 |
| - layerContent, err := imageStore.GetBlobContent(repo, layer) |
288 |
| - if err != nil { |
289 |
| - log.Error().Err(err).Str("repository", repo).Str("reference", manifestDigest).Str("layerDigest", layer.String()).Msg( |
290 |
| - "failed to get notation signature blob content") |
| 288 | + layerSigKey := manifestContent.Layers[0].MediaType |
291 | 289 |
|
292 |
| - return layers, err |
293 |
| - } |
294 |
| - |
295 |
| - layerSigKey := manifestContent.Layers[0].MediaType |
| 290 | + layers = append(layers, mTypes.LayerInfo{ |
| 291 | + LayerDigest: layer.String(), |
| 292 | + LayerContent: layerContent, |
| 293 | + SignatureKey: layerSigKey, |
| 294 | + }) |
296 | 295 |
|
297 |
| - layers = append(layers, mTypes.LayerInfo{ |
298 |
| - LayerDigest: layer.String(), |
299 |
| - LayerContent: layerContent, |
300 |
| - SignatureKey: layerSigKey, |
| 296 | + return nil |
301 | 297 | })
|
302 | 298 |
|
303 |
| - return layers, nil |
| 299 | + return layers, err |
304 | 300 | }
|
305 | 301 |
|
306 | 302 | // SetMetadataFromInput tries to set manifest metadata and update repo metadata by adding the current tag
|
|
0 commit comments