Add a mutex to protect concurrent access to mountedLayer.references map.
Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
(cherry picked from commit f73b5cb4e8b9a23ad6700577840582d66017a733)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
| ... | ... |
@@ -2,6 +2,7 @@ package layer // import "github.com/docker/docker/layer" |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 | 4 |
"io" |
| 5 |
+ "sync" |
|
| 5 | 6 |
|
| 6 | 7 |
"github.com/docker/docker/pkg/archive" |
| 7 | 8 |
"github.com/docker/docker/pkg/containerfs" |
| ... | ... |
@@ -15,6 +16,7 @@ type mountedLayer struct {
|
| 15 | 15 |
path string |
| 16 | 16 |
layerStore *layerStore |
| 17 | 17 |
|
| 18 |
+ sync.Mutex |
|
| 18 | 19 |
references map[RWLayer]*referencedRWLayer |
| 19 | 20 |
} |
| 20 | 21 |
|
| ... | ... |
@@ -62,16 +64,24 @@ func (ml *mountedLayer) getReference() RWLayer {
|
| 62 | 62 |
ref := &referencedRWLayer{
|
| 63 | 63 |
mountedLayer: ml, |
| 64 | 64 |
} |
| 65 |
+ ml.Lock() |
|
| 65 | 66 |
ml.references[ref] = ref |
| 67 |
+ ml.Unlock() |
|
| 66 | 68 |
|
| 67 | 69 |
return ref |
| 68 | 70 |
} |
| 69 | 71 |
|
| 70 | 72 |
func (ml *mountedLayer) hasReferences() bool {
|
| 71 |
- return len(ml.references) > 0 |
|
| 73 |
+ ml.Lock() |
|
| 74 |
+ ret := len(ml.references) > 0 |
|
| 75 |
+ ml.Unlock() |
|
| 76 |
+ |
|
| 77 |
+ return ret |
|
| 72 | 78 |
} |
| 73 | 79 |
|
| 74 | 80 |
func (ml *mountedLayer) deleteReference(ref RWLayer) error {
|
| 81 |
+ ml.Lock() |
|
| 82 |
+ defer ml.Unlock() |
|
| 75 | 83 |
if _, ok := ml.references[ref]; !ok {
|
| 76 | 84 |
return ErrLayerNotRetained |
| 77 | 85 |
} |
| ... | ... |
@@ -81,7 +91,9 @@ func (ml *mountedLayer) deleteReference(ref RWLayer) error {
|
| 81 | 81 |
|
| 82 | 82 |
func (ml *mountedLayer) retakeReference(r RWLayer) {
|
| 83 | 83 |
if ref, ok := r.(*referencedRWLayer); ok {
|
| 84 |
+ ml.Lock() |
|
| 84 | 85 |
ml.references[ref] = ref |
| 86 |
+ ml.Unlock() |
|
| 85 | 87 |
} |
| 86 | 88 |
} |
| 87 | 89 |
|