Add locking to repository access in memory cache
Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
This commit is contained in:
		
							parent
							
								
									dabdc5e52b
								
							
						
					
					
						commit
						a50ce1ab93
					
				
					 1 changed files with 21 additions and 12 deletions
				
			
		
							
								
								
									
										33
									
								
								registry/storage/cache/memory/memory.go
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								registry/storage/cache/memory/memory.go
									
										
									
									
										vendored
									
									
								
							|  | @ -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 { |  | ||||||
| 		// allocate map since we are setting it now. |  | ||||||
| 	rsimbdcp.parent.mu.Lock() | 	rsimbdcp.parent.mu.Lock() | ||||||
|  | 	repo := rsimbdcp.repository | ||||||
|  | 	if repo == nil { | ||||||
|  | 		// allocate map since we are setting it now. | ||||||
| 		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…
	
	Add table
		Add a link
		
	
		Reference in a new issue