pkg/blobinfocache/boltdb/boltdb.go
func (bdc *cache) RecordDigestUncompressedPair(anyDigest digest.Digest, uncompressed digest.Digest) {
	_ = bdc.update(func(tx *bolt.Tx) error {
		b, err := tx.CreateBucketIfNotExists(uncompressedDigestBucket)
		if err != nil {
			return err
		}
		key := []byte(anyDigest.String())
		if previousBytes := b.Get(key); previousBytes != nil {
			previous, err := digest.Parse(string(previousBytes))
			if err != nil {
				return err
			}
			if previous != uncompressed {
				logrus.Warnf("Uncompressed digest for blob %s previously recorded as %s, now %s", anyDigest, previous, uncompressed)
			}
		}
		if err := b.Put(key, []byte(uncompressed.String())); err != nil {
			return err
		}

		b, err = tx.CreateBucketIfNotExists(digestByUncompressedBucket)
		if err != nil {
			return err
		}
		b, err = b.CreateBucketIfNotExists([]byte(uncompressed.String()))
		if err != nil {
			return err
		}
		if err := b.Put([]byte(anyDigest.String()), []byte{}); err != nil { // Possibly writing the same []byte{} presence marker again.
			return err
		}
		return nil
	}) // FIXME? Log error (but throttle the log volume on repeated accesses)?
}
func (bdc *cache) RecordDigestUncompressedPair(anyDigest digest.Digest, uncompressed digest.Digest) {
	_ = bdc.update(func(tx *bolt.Tx) error {
		b, err := tx.CreateBucketIfNotExists(uncompressedDigestBucket)
		if err != nil {
			return err
		}
		key := []byte(anyDigest.String())
		if previousBytes := b.Get(key); previousBytes != nil {
			previous, err := digest.Parse(string(previousBytes))
			if err != nil {
				return err
			}
			if previous != uncompressed {
				logrus.Warnf("Uncompressed digest for blob %s previously recorded as %s, now %s", anyDigest, previous, uncompressed)
			}
		}
		if err := b.Put(key, []byte(uncompressed.String())); err != nil {
			return err
		}

		b, err = tx.CreateBucketIfNotExists(digestByUncompressedBucket)
		if err != nil {
			return err
		}
		b, err = b.CreateBucketIfNotExists([]byte(uncompressed.String()))
		if err != nil {
			return err
		}
		if err := b.Put([]byte(anyDigest.String()), []byte{}); err != nil { // Possibly writing the same []byte{} presence marker again.
			return err
		}
		return nil
	}) // FIXME? Log error (but throttle the log volume on repeated accesses)?
}
func ( bdc * cache ) RecordDigestUncompressedPair ( anyDigest digest . Digest , uncompressed digest . Digest ) { _ = bdc . update ( func ( tx * bolt . Tx ) error { b , err := tx . CreateBucketIfNotExists ( uncompressedDigestBucket ) if err != nil { return err } key := [ ] byte ( anyDigest . String ( ) ) if previousBytes := b . Get ( key ) ; previousBytes != nil { previous , err := digest . Parse ( string ( previousBytes ) ) if err != nil { return err } if previous != uncompressed { logrus . Warnf ( " " , anyDigest , previous , uncompressed ) } } if err := b . Put ( key , [ ] byte ( uncompressed . String ( ) ) ) ; err != nil { return err } b , err = tx . CreateBucketIfNotExists ( digestByUncompressedBucket ) if err != nil { return err } b , err = b . CreateBucketIfNotExists ( [ ] byte ( uncompressed . String ( ) ) ) if err != nil { return err } if err := b . Put ( [ ] byte ( anyDigest . String ( ) ) , [ ] byte { } ) ; err != nil { // Possibly writing the same []byte{} presence marker again. return err } return nil } ) // FIXME? Log error (but throttle the log volume on repeated accesses)? }
// RecordDigestUncompressedPair records that the uncompressed version of anyDigest is uncompressed.
// It’s allowed for anyDigest == uncompressed.
// WARNING: Only call this for LOCALLY VERIFIED data; don’t record a digest pair just because some remote author claims so (e.g.
// because a manifest/config pair exists); otherwise the cache could be poisoned and allow substituting unexpected blobs.
// (Eventually, the DiffIDs in image config could detect the substitution, but that may be too late, and not all image formats contain that data.)
RecordDigestUncompressedPair records that the uncompressed version of anyDigest is uncompressed . It’s allowed for anyDigest == uncompressed . WARNING : Only call this for LOCALLY VERIFIED data ; don’t record a digest pair just because some remote author claims so ( e . g . because a manifest / config pair exists ) ; otherwise the cache could be poisoned and allow substituting unexpected blobs . ( Eventually the DiffIDs in image config could detect the substitution but that may be too late and not all image formats contain that data . )