Add locking to repository access in memory cache
Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)master
							parent
							
								
									dabdc5e52b
								
							
						
					
					
						commit
						a50ce1ab93
					
				|  | @ -77,37 +77,46 @@ type repositoryScopedInMemoryBlobDescriptorCache struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (rsimbdcp *repositoryScopedInMemoryBlobDescriptorCache) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { | func (rsimbdcp *repositoryScopedInMemoryBlobDescriptorCache) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { | ||||||
| 	if rsimbdcp.repository == nil { | 	rsimbdcp.parent.mu.Lock() | ||||||
|  | 	repo := rsimbdcp.repository | ||||||
|  | 	rsimbdcp.parent.mu.Unlock() | ||||||
|  | 
 | ||||||
|  | 	if repo == nil { | ||||||
| 		return distribution.Descriptor{}, distribution.ErrBlobUnknown | 		return distribution.Descriptor{}, distribution.ErrBlobUnknown | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return rsimbdcp.repository.Stat(ctx, dgst) | 	return repo.Stat(ctx, dgst) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (rsimbdcp *repositoryScopedInMemoryBlobDescriptorCache) Clear(ctx context.Context, dgst digest.Digest) error { | func (rsimbdcp *repositoryScopedInMemoryBlobDescriptorCache) Clear(ctx context.Context, dgst digest.Digest) error { | ||||||
| 	if rsimbdcp.repository == nil { | 	rsimbdcp.parent.mu.Lock() | ||||||
|  | 	repo := rsimbdcp.repository | ||||||
|  | 	rsimbdcp.parent.mu.Unlock() | ||||||
|  | 
 | ||||||
|  | 	if repo == nil { | ||||||
| 		return distribution.ErrBlobUnknown | 		return distribution.ErrBlobUnknown | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return rsimbdcp.repository.Clear(ctx, dgst) | 	return repo.Clear(ctx, dgst) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (rsimbdcp *repositoryScopedInMemoryBlobDescriptorCache) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { | func (rsimbdcp *repositoryScopedInMemoryBlobDescriptorCache) SetDescriptor(ctx context.Context, dgst digest.Digest, desc distribution.Descriptor) error { | ||||||
| 	if rsimbdcp.repository == nil { | 	rsimbdcp.parent.mu.Lock() | ||||||
|  | 	repo := rsimbdcp.repository | ||||||
|  | 	if repo == nil { | ||||||
| 		// allocate map since we are setting it now.
 | 		// allocate map since we are setting it now.
 | ||||||
| 		rsimbdcp.parent.mu.Lock() |  | ||||||
| 		var ok bool | 		var ok bool | ||||||
| 		// have to read back value since we may have allocated elsewhere.
 | 		// have to read back value since we may have allocated elsewhere.
 | ||||||
| 		rsimbdcp.repository, ok = rsimbdcp.parent.repositories[rsimbdcp.repo] | 		repo, ok = rsimbdcp.parent.repositories[rsimbdcp.repo] | ||||||
| 		if !ok { | 		if !ok { | ||||||
| 			rsimbdcp.repository = newMapBlobDescriptorCache() | 			repo = newMapBlobDescriptorCache() | ||||||
| 			rsimbdcp.parent.repositories[rsimbdcp.repo] = rsimbdcp.repository | 			rsimbdcp.parent.repositories[rsimbdcp.repo] = repo | ||||||
| 		} | 		} | ||||||
| 
 | 		rsimbdcp.repository = repo | ||||||
| 		rsimbdcp.parent.mu.Unlock() |  | ||||||
| 	} | 	} | ||||||
|  | 	rsimbdcp.parent.mu.Unlock() | ||||||
| 
 | 
 | ||||||
| 	if err := rsimbdcp.repository.SetDescriptor(ctx, dgst, desc); err != nil { | 	if err := repo.SetDescriptor(ctx, dgst, desc); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue