Add experimental s3backer mounter
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.
This commit is contained in:
parent
108364fb88
commit
82ab4b0983
11 changed files with 354 additions and 36 deletions
pkg/s3
|
@ -1,6 +1,12 @@
|
|||
package s3
|
||||
|
||||
import "fmt"
|
||||
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
|
||||
|
@ -11,9 +17,10 @@ type Mounter interface {
|
|||
}
|
||||
|
||||
const (
|
||||
s3fsMounterType = "s3fs"
|
||||
goofysMounterType = "goofys"
|
||||
s3qlMounterType = "s3ql"
|
||||
s3fsMounterType = "s3fs"
|
||||
goofysMounterType = "goofys"
|
||||
s3qlMounterType = "s3ql"
|
||||
s3backerMounterType = "s3backer"
|
||||
)
|
||||
|
||||
// newMounter returns a new mounter depending on the mounterType parameter
|
||||
|
@ -28,6 +35,38 @@ func newMounter(bucket string, cfg *Config) (Mounter, error) {
|
|||
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)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue