ensure cleanup always runs