82ab4b0983
This also adds some generic handling of stale umounts. Fuse returns immediately and does not indicate that the mounter has finished writing to the backend. The process finding is sort of hacky as I could not find a better way to get to the PID from a fuse mount.
72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
package s3
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
|
|
"github.com/golang/glog"
|
|
"k8s.io/kubernetes/pkg/util/mount"
|
|
)
|
|
|
|
// Mounter interface which can be implemented
|
|
// by the different mounter types
|
|
type Mounter interface {
|
|
Format() error
|
|
Mount(targetPath string) error
|
|
Unmount(targetPath string) error
|
|
}
|
|
|
|
const (
|
|
s3fsMounterType = "s3fs"
|
|
goofysMounterType = "goofys"
|
|
s3qlMounterType = "s3ql"
|
|
s3backerMounterType = "s3backer"
|
|
)
|
|
|
|
// newMounter returns a new mounter depending on the mounterType parameter
|
|
func newMounter(bucket string, cfg *Config) (Mounter, error) {
|
|
switch cfg.Mounter {
|
|
case s3fsMounterType:
|
|
return newS3fsMounter(bucket, cfg)
|
|
|
|
case goofysMounterType:
|
|
return newGoofysMounter(bucket, cfg)
|
|
|
|
case s3qlMounterType:
|
|
return newS3qlMounter(bucket, cfg)
|
|
|
|
case s3backerMounterType:
|
|
return newS3backerMounter(bucket, cfg)
|
|
|
|
}
|
|
return nil, fmt.Errorf("Error mounting bucket %s, invalid mounter specified: %s", bucket, cfg.Mounter)
|
|
}
|
|
|
|
func fuseMount(path string, command string, args []string) error {
|
|
cmd := exec.Command(command, args...)
|
|
|
|
out, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
return fmt.Errorf("Error fuseMount command: %s\nargs: %s\noutput: %s", command, args, out)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func fuseUnmount(path string, command string) error {
|
|
if err := mount.New("").Unmount(path); err != nil {
|
|
return err
|
|
}
|
|
// as fuse quits immediately, we will try to wait until the process is done
|
|
process, err := findFuseMountProcess(path, command)
|
|
if err != nil {
|
|
glog.Errorf("Error getting PID of fuse mount: %s", err)
|
|
return nil
|
|
}
|
|
if process == nil {
|
|
glog.Warningf("Unable to find PID of fuse mount %s, it must have finished already", path)
|
|
return nil
|
|
}
|
|
glog.Infof("Found fuse pid %v of mount %s, checking if it still runs", process.Pid, path)
|
|
return waitForProcess(process, 1)
|
|
}
|