@@ -2930,14 +2930,40 @@ func (s *store) Unmount(id string, force bool) (bool, error) {
2930
2930
}
2931
2931
2932
2932
func (s * store ) Changes (from , to string ) ([]archive.Change , error ) {
2933
- if res , done , err := readAllLayerStores (s , func (store roLayerStore ) ([]archive.Change , bool , error ) {
2933
+ // NaiveDiff could cause mounts to happen without a lock, so be safe
2934
+ // and treat the .Diff operation as a Mount.
2935
+ // We need to make sure the home mount is present when the Mount is done, which happens by possibly reinitializing the graph driver
2936
+ // in startUsingGraphDriver().
2937
+ if err := s .startUsingGraphDriver (); err != nil {
2938
+ return nil , err
2939
+ }
2940
+ defer s .stopUsingGraphDriver ()
2941
+
2942
+ rlstore , lstores , err := s .bothLayerStoreKindsLocked ()
2943
+ if err != nil {
2944
+ return nil , err
2945
+ }
2946
+ if err := rlstore .startWriting (); err != nil {
2947
+ return nil , err
2948
+ }
2949
+ if rlstore .Exists (to ) {
2950
+ res , err := rlstore .Changes (from , to )
2951
+ rlstore .stopWriting ()
2952
+ return res , err
2953
+ }
2954
+ rlstore .stopWriting ()
2955
+
2956
+ for _ , s := range lstores {
2957
+ store := s
2958
+ if err := store .startReading (); err != nil {
2959
+ return nil , err
2960
+ }
2934
2961
if store .Exists (to ) {
2935
- res , err := store .Changes (from , to )
2936
- return res , true , err
2962
+ res , err := rlstore .Changes (from , to )
2963
+ rlstore .stopReading ()
2964
+ return res , err
2937
2965
}
2938
- return nil , false , nil
2939
- }); done {
2940
- return res , err
2966
+ store .stopReading ()
2941
2967
}
2942
2968
return nil , ErrLayerUnknown
2943
2969
}
@@ -2968,12 +2994,30 @@ func (s *store) Diff(from, to string, options *DiffOptions) (io.ReadCloser, erro
2968
2994
}
2969
2995
defer s .stopUsingGraphDriver ()
2970
2996
2971
- layerStores , err := s .allLayerStoresLocked ()
2997
+ rlstore , lstores , err := s .bothLayerStoreKindsLocked ()
2972
2998
if err != nil {
2973
2999
return nil , err
2974
3000
}
2975
3001
2976
- for _ , s := range layerStores {
3002
+ if err := rlstore .startWriting (); err != nil {
3003
+ return nil , err
3004
+ }
3005
+ if rlstore .Exists (to ) {
3006
+ rc , err := rlstore .Diff (from , to , options )
3007
+ if rc != nil && err == nil {
3008
+ wrapped := ioutils .NewReadCloserWrapper (rc , func () error {
3009
+ err := rc .Close ()
3010
+ rlstore .stopWriting ()
3011
+ return err
3012
+ })
3013
+ return wrapped , nil
3014
+ }
3015
+ rlstore .stopWriting ()
3016
+ return rc , err
3017
+ }
3018
+ rlstore .stopWriting ()
3019
+
3020
+ for _ , s := range lstores {
2977
3021
store := s
2978
3022
if err := store .startReading (); err != nil {
2979
3023
return nil , err
0 commit comments