Files

63 lines
1.6 KiB
Go

// SPDX-License-Identifier: AGPL-3.0-only
// Copied from github.com/grafana/mimir/pkg/util/shutdownmarker/shutdown_marker.go
// at commit 9657d59b990e51693f0c48a5bc79f2331a78bb83
package shutdownmarker
import (
"os"
"path"
"strings"
"time"
"github.com/grafana/dskit/multierror"
"github.com/grafana/tempo/pkg/util/atomicfs"
)
const shutdownMarkerFilename = "shutdown-requested.txt"
// Create writes a marker file on the given path to indicate that a component is
// going to be scaled down in the future. The presence of this file means that a component
// should perform some operations specified by the component itself before being shutdown.
func Create(p string) error {
return atomicfs.CreateFile(p, strings.NewReader(time.Now().UTC().Format(time.RFC3339)))
}
// Remove removes the shutdown marker file on the given path if it exists.
func Remove(p string) error {
err := os.Remove(p)
if err != nil && !os.IsNotExist(err) {
return err
}
dir, err := os.OpenFile(path.Dir(p), os.O_RDONLY, 0o600) // mode doesn't matter since we're not passing os.O_CREATE
if err != nil {
return err
}
merr := multierror.New()
merr.Add(dir.Sync())
merr.Add(dir.Close())
return merr.Err()
}
// Exists returns true if the shutdown marker file exists on the given path, false otherwise
func Exists(p string) (bool, error) {
s, err := os.Stat(p)
if err != nil && os.IsNotExist(err) {
return false, nil
}
if err != nil {
return false, err
}
return s.Mode().IsRegular(), nil
}
// GetPath returns the absolute path of the shutdown marker file
func GetPath(dirPath string) string {
return path.Join(dirPath, shutdownMarkerFilename)
}