func fusetestCommon(t *testing.T, fs *otaru.FileSystem, f func(mountpoint string)) { bfuse.Debug = func(msg interface{}) { log.Printf("fusedbg: %v", msg) } mountpoint := "/tmp/hoge" if err := os.Mkdir(mountpoint, 0777); err != nil && !os.IsExist(err) { log.Fatalf("Failed to create mountpoint: %v", err) } bfuse.Unmount(mountpoint) done := make(chan bool) ready := make(chan bool) go func() { if err := fuse.ServeFUSE("otaru-test", mountpoint, fs, ready); err != nil { t.Errorf("ServeFUSE err: %v", err) close(ready) } close(done) }() <-ready f(mountpoint) time.Sleep(100 * time.Millisecond) if err := bfuse.Unmount(mountpoint); err != nil { t.Errorf("umount failed: %v", err) } <-done }
func main() { log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) flag.Usage = Usage flag.Parse() cfg, err := facade.NewConfigFromTomlFile(*flagConfigFile) if err != nil { log.Printf("%v", err) Usage() os.Exit(2) } if flag.NArg() != 1 { Usage() os.Exit(2) } mountpoint := flag.Arg(0) o, err := facade.NewOtaru(cfg, &facade.OneshotConfig{Mkfs: *flagMkfs}) if err != nil { log.Printf("NewOtaru failed: %v", err) os.Exit(1) } var muClose sync.Mutex closeOtaruAndExit := func() { muClose.Lock() defer muClose.Unlock() if err := bfuse.Unmount(mountpoint); err != nil { log.Printf("umount err: %v", err) } if o != nil { if err := o.Close(); err != nil { log.Printf("Otaru.Close() returned errs: %v", err) } o = nil } os.Exit(0) } defer closeOtaruAndExit() sigC := make(chan os.Signal, 1) signal.Notify(sigC, os.Interrupt) signal.Notify(sigC, syscall.SIGTERM) go func() { for s := range sigC { log.Printf("Received signal: %v", s) closeOtaruAndExit() } }() bfuse.Debug = func(msg interface{}) { log.Printf("fusedbg: %v", msg) } if err := fuse.ServeFUSE(mountpoint, o.FS, nil); err != nil { log.Fatalf("ServeFUSE failed: %v", err) } log.Printf("ServeFUSE end!") }
func main() { log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) logger.Registry().AddOutput(logger.WriterLogger{os.Stderr}) flag.Usage = Usage flag.Parse() cfg, err := facade.NewConfig(*flagConfigDir) if err != nil { logger.Criticalf(mylog, "%v", err) Usage() os.Exit(2) } if flag.NArg() != 1 { Usage() os.Exit(2) } mountpoint := flag.Arg(0) if err := facade.SetupFluentLogger(cfg); err != nil { logger.Criticalf(mylog, "Failed to setup fluentd logger: %v", err) os.Exit(1) } o, err := facade.NewOtaru(cfg, &facade.OneshotConfig{Mkfs: *flagMkfs}) if err != nil { logger.Criticalf(mylog, "NewOtaru failed: %v", err) os.Exit(1) } var muClose sync.Mutex closeOtaruAndExit := func(exitCode int) { muClose.Lock() defer muClose.Unlock() if err := bfuse.Unmount(mountpoint); err != nil { logger.Warningf(mylog, "umount err: %v", err) } if o != nil { if err := o.Close(); err != nil { logger.Warningf(mylog, "Otaru.Close() returned errs: %v", err) } o = nil } os.Exit(exitCode) } defer closeOtaruAndExit(0) sigC := make(chan os.Signal, 1) signal.Notify(sigC, os.Interrupt) signal.Notify(sigC, syscall.SIGTERM) go func() { for s := range sigC { logger.Warningf(mylog, "Received signal: %v", s) closeOtaruAndExit(1) } }() logger.Registry().AddOutput(logger.HandleCritical(func() { logger.Warningf(mylog, "Starting shutdown due to critical event.") closeOtaruAndExit(1) })) bfuseLogger := logger.Registry().Category("bfuse") bfuse.Debug = func(msg interface{}) { logger.Debugf(bfuseLogger, "%v", msg) } if err := fuse.ServeFUSE(cfg.BucketName, mountpoint, o.FS, nil); err != nil { logger.Warningf(mylog, "ServeFUSE failed: %v", err) closeOtaruAndExit(1) } logger.Infof(mylog, "ServeFUSE end!") }