diff --git a/internal/criocli/wipe.go b/internal/criocli/wipe.go index 54d242b9386..1abd8b77a07 100644 --- a/internal/criocli/wipe.go +++ b/internal/criocli/wipe.go @@ -2,6 +2,7 @@ package criocli import ( "errors" + "fmt" "os" cstorage "github.com/containers/storage" @@ -68,8 +69,22 @@ func crioWipe(c *cli.Context) error { config.CleanShutdownFile, store.GraphRoot(), ) + + const wipeMarkerFile = "/run/crio/crio-wipe-done" + if _, err := os.Stat(wipeMarkerFile); err == nil { + logrus.Infof("Unclean shutdown check already succeeded by previous crio wipe command") + + return nil + } + // This will fail if there are any containers currently running. - return lib.RemoveStorageDirectory(config, store, false) + if err := lib.RemoveStorageDirectory(config, store, false); err != nil { + return fmt.Errorf("failed to remove storage directory %w", err) + } + + if err = os.WriteFile(wipeMarkerFile, []byte("done"), 0o644); err != nil { + logrus.Warnf("Failed to create crio wipe marker file: %v", err) + } } // If crio is configured to wipe internally (and `--force` wasn't set) diff --git a/internal/version/version.go b/internal/version/version.go index ce7a03d4b88..1bf386aff41 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -21,7 +21,7 @@ import ( ) // Version is the version of the build. -const Version = "1.30.12" +const Version = "1.30.13" // Variables injected during build-time var ( diff --git a/test/crio-wipe.bats b/test/crio-wipe.bats index 089b70a9526..b50b741aa2a 100644 --- a/test/crio-wipe.bats +++ b/test/crio-wipe.bats @@ -85,6 +85,7 @@ function start_crio_with_stopped_pod() { rm "$CONTAINER_VERSION_FILE" rm "$CONTAINER_VERSION_FILE_PERSIST" + rm -f "/run/crio/crio-wipe-done" run_crio_wipe CONTAINER_INTERNAL_WIPE=false start_crio_no_setup @@ -97,6 +98,7 @@ function start_crio_with_stopped_pod() { stop_crio_no_clean rm "$CONTAINER_VERSION_FILE" + rm -f "/run/crio/crio-wipe-done" run_crio_wipe CONTAINER_INTERNAL_WIPE=false start_crio_no_setup @@ -109,6 +111,7 @@ function start_crio_with_stopped_pod() { stop_crio_no_clean rm "$CONTAINER_VERSION_FILE_PERSIST" + rm -f "/run/crio/crio-wipe-done" run_crio_wipe CONTAINER_INTERNAL_WIPE=false start_crio_no_setup @@ -123,6 +126,7 @@ function start_crio_with_stopped_pod() { CONTAINER_INTERNAL_WIPE=false start_crio_with_stopped_pod stop_crio_no_clean + rm -f "/run/crio/crio-wipe-done" run_podman_with_args run --name test -d quay.io/crio/fedora-crio-ci:latest top @@ -137,6 +141,7 @@ function start_crio_with_stopped_pod() { rm "$CONTAINER_CLEAN_SHUTDOWN_FILE" rm "$CONTAINER_VERSION_FILE" + rm -f "/run/crio/crio-wipe-done" run_crio_wipe @@ -160,6 +165,7 @@ function start_crio_with_stopped_pod() { rm "$CONTAINER_CLEAN_SHUTDOWN_FILE" rm "$CONTAINER_VERSION_FILE" + rm -f "/run/crio/crio-wipe-done" run_crio_wipe @@ -179,6 +185,7 @@ function start_crio_with_stopped_pod() { rm "$CONTAINER_CLEAN_SHUTDOWN_FILE" rm "$CONTAINER_VERSION_FILE" + rm -f "/run/crio/crio-wipe-done" run ! "$CRIO_BINARY_PATH" --config "$CRIO_CONFIG" -d "$CRIO_CONFIG_DIR" wipe } @@ -187,6 +194,7 @@ function start_crio_with_stopped_pod() { CONTAINER_INTERNAL_WIPE=false start_crio_with_stopped_pod stop_crio_no_clean "-9" || true + rm -f "/run/crio/crio-wipe-done" run_crio_wipe CONTAINER_INTERNAL_WIPE=false start_crio_no_setup @@ -201,6 +209,7 @@ function start_crio_with_stopped_pod() { rm "$CONTAINER_CLEAN_SHUTDOWN_FILE.supported" + rm -f "/run/crio/crio-wipe-done" run_crio_wipe CONTAINER_INTERNAL_WIPE=false start_crio_no_setup @@ -376,3 +385,24 @@ function start_crio_with_stopped_pod() { return 1 fi } + +@test "crio-wipe should create /run/crio/crio-wipe-done and not wipe again" { + CONTAINER_INTERNAL_WIPE=false start_crio_with_stopped_pod + stop_crio_no_clean + + rm "$CONTAINER_CLEAN_SHUTDOWN_FILE" + rm "$CONTAINER_VERSION_FILE" + rm -f "/run/crio/crio-wipe-done" + + run_crio_wipe + + ls -l /run/crio/crio-wipe-done + + run cat /run/crio/crio-wipe-done + [[ "$output" == "done" ]] + + run_crio_wipe + [[ ! "$output" == *"Wiping storage directory"* ]] + + ls -l /run/crio/crio-wipe-done +}