Fix overlay2 ignoring whiteout files
| ... | ... |
@@ -197,6 +197,8 @@ func DriverTestDiffApply(t testing.TB, fileCount int, drivername string, driverO |
| 197 | 197 |
defer PutDriver(t) |
| 198 | 198 |
base := stringid.GenerateRandomID() |
| 199 | 199 |
upper := stringid.GenerateRandomID() |
| 200 |
+ deleteFile := "file-remove.txt" |
|
| 201 |
+ deleteFileContent := []byte("This file should get removed in upper!")
|
|
| 200 | 202 |
|
| 201 | 203 |
if err := driver.Create(base, "", "", nil); err != nil {
|
| 202 | 204 |
t.Fatal(err) |
| ... | ... |
@@ -206,6 +208,10 @@ func DriverTestDiffApply(t testing.TB, fileCount int, drivername string, driverO |
| 206 | 206 |
t.Fatal(err) |
| 207 | 207 |
} |
| 208 | 208 |
|
| 209 |
+ if err := addFile(driver, base, deleteFile, deleteFileContent); err != nil {
|
|
| 210 |
+ t.Fatal(err) |
|
| 211 |
+ } |
|
| 212 |
+ |
|
| 209 | 213 |
if err := driver.Create(upper, base, "", nil); err != nil {
|
| 210 | 214 |
t.Fatal(err) |
| 211 | 215 |
} |
| ... | ... |
@@ -213,6 +219,11 @@ func DriverTestDiffApply(t testing.TB, fileCount int, drivername string, driverO |
| 213 | 213 |
if err := addManyFiles(driver, upper, fileCount, 6); err != nil {
|
| 214 | 214 |
t.Fatal(err) |
| 215 | 215 |
} |
| 216 |
+ |
|
| 217 |
+ if err := removeFile(driver, upper, deleteFile); err != nil {
|
|
| 218 |
+ t.Fatal(err) |
|
| 219 |
+ } |
|
| 220 |
+ |
|
| 216 | 221 |
diffSize, err := driver.DiffSize(upper, "") |
| 217 | 222 |
if err != nil {
|
| 218 | 223 |
t.Fatal(err) |
| ... | ... |
@@ -227,6 +238,10 @@ func DriverTestDiffApply(t testing.TB, fileCount int, drivername string, driverO |
| 227 | 227 |
t.Fatal(err) |
| 228 | 228 |
} |
| 229 | 229 |
|
| 230 |
+ if err := checkFile(driver, diff, deleteFile, deleteFileContent); err != nil {
|
|
| 231 |
+ t.Fatal(err) |
|
| 232 |
+ } |
|
| 233 |
+ |
|
| 230 | 234 |
arch, err := driver.Diff(upper, base) |
| 231 | 235 |
if err != nil {
|
| 232 | 236 |
t.Fatal(err) |
| ... | ... |
@@ -248,9 +263,14 @@ func DriverTestDiffApply(t testing.TB, fileCount int, drivername string, driverO |
| 248 | 248 |
if applyDiffSize != diffSize {
|
| 249 | 249 |
t.Fatalf("Apply diff size different, got %d, expected %d", applyDiffSize, diffSize)
|
| 250 | 250 |
} |
| 251 |
+ |
|
| 251 | 252 |
if err := checkManyFiles(driver, diff, fileCount, 6); err != nil {
|
| 252 | 253 |
t.Fatal(err) |
| 253 | 254 |
} |
| 255 |
+ |
|
| 256 |
+ if err := checkFileRemoved(driver, diff, deleteFile); err != nil {
|
|
| 257 |
+ t.Fatal(err) |
|
| 258 |
+ } |
|
| 254 | 259 |
} |
| 255 | 260 |
|
| 256 | 261 |
// DriverTestChanges tests computed changes on a layer matches changes made |
| ... | ... |
@@ -78,6 +78,32 @@ func addFile(drv graphdriver.Driver, layer, filename string, content []byte) err |
| 78 | 78 |
return ioutil.WriteFile(path.Join(root, filename), content, 0755) |
| 79 | 79 |
} |
| 80 | 80 |
|
| 81 |
+func removeFile(drv graphdriver.Driver, layer, filename string) error {
|
|
| 82 |
+ root, err := drv.Get(layer, "") |
|
| 83 |
+ if err != nil {
|
|
| 84 |
+ return err |
|
| 85 |
+ } |
|
| 86 |
+ defer drv.Put(layer) |
|
| 87 |
+ |
|
| 88 |
+ return os.Remove(path.Join(root, filename)) |
|
| 89 |
+} |
|
| 90 |
+ |
|
| 91 |
+func checkFileRemoved(drv graphdriver.Driver, layer, filename string) error {
|
|
| 92 |
+ root, err := drv.Get(layer, "") |
|
| 93 |
+ if err != nil {
|
|
| 94 |
+ return err |
|
| 95 |
+ } |
|
| 96 |
+ defer drv.Put(layer) |
|
| 97 |
+ |
|
| 98 |
+ if _, err := os.Stat(path.Join(root, filename)); err == nil {
|
|
| 99 |
+ return fmt.Errorf("file still exists: %s", path.Join(root, filename))
|
|
| 100 |
+ } else if !os.IsNotExist(err) {
|
|
| 101 |
+ return err |
|
| 102 |
+ } |
|
| 103 |
+ |
|
| 104 |
+ return nil |
|
| 105 |
+} |
|
| 106 |
+ |
|
| 81 | 107 |
func addManyFiles(drv graphdriver.Driver, layer string, count int, seed int64) error {
|
| 82 | 108 |
root, err := drv.Get(layer, "") |
| 83 | 109 |
if err != nil {
|