diff --git a/pkg/filesystem/fs.go b/pkg/filesystem/fs.go index b7e68e1c02..118f97c9c9 100644 --- a/pkg/filesystem/fs.go +++ b/pkg/filesystem/fs.go @@ -55,7 +55,7 @@ type Filesystem struct { rootMountpoint string } -func (fs *Filesystem) tryRetainSharedDaemon(d *daemon.Daemon) { +func (fs *Filesystem) TryRetainSharedDaemon(d *daemon.Daemon) { // FsDriver can be changed between two startups. if d.HostMountpoint() == fs.rootMountpoint || config.GetFsDriver() == config.FsDriverFscache { fs.sharedDaemon = d @@ -110,13 +110,13 @@ func NewFileSystem(ctx context.Context, opt ...NewFSOpt) (*Filesystem, error) { // Found shared daemon // Fscache userspace daemon has no host mountpoint. - fs.tryRetainSharedDaemon(d) + fs.TryRetainSharedDaemon(d) } for _, d := range liveDaemons { // Found shared daemon - fs.tryRetainSharedDaemon(d) + fs.TryRetainSharedDaemon(d) } return &fs, nil diff --git a/pkg/system/system.go b/pkg/system/system.go index f1d7c3ae1e..7a7250e29a 100644 --- a/pkg/system/system.go +++ b/pkg/system/system.go @@ -25,6 +25,7 @@ import ( "github.com/containerd/nydus-snapshotter/pkg/daemon" "github.com/containerd/nydus-snapshotter/pkg/daemon/types" "github.com/containerd/nydus-snapshotter/pkg/errdefs" + "github.com/containerd/nydus-snapshotter/pkg/filesystem" "github.com/containerd/nydus-snapshotter/pkg/manager" metrics "github.com/containerd/nydus-snapshotter/pkg/metrics/tool" ) @@ -50,6 +51,7 @@ const defaultErrorCode string = "Unknown" // 3. Rolling update // 4. Daemons failures record as metrics type Controller struct { + fs *filesystem.Filesystem manager *manager.Manager // httpSever *http.Server addr *net.UnixAddr @@ -117,7 +119,7 @@ type rafsInstanceInfo struct { ImageID string `json:"image_id"` } -func NewSystemController(manager *manager.Manager, sock string) (*Controller, error) { +func NewSystemController(fs *filesystem.Filesystem, manager *manager.Manager, sock string) (*Controller, error) { if err := os.MkdirAll(filepath.Dir(sock), os.ModePerm); err != nil { return nil, err } @@ -134,6 +136,7 @@ func NewSystemController(manager *manager.Manager, sock string) (*Controller, er } sc := Controller{ + fs: fs, manager: manager, addr: addr, router: mux.NewRouter(), @@ -293,6 +296,7 @@ func (sc *Controller) upgradeNydusDaemon(d *daemon.Daemon, c upgradeRequest) err log.L.Infof("Upgrading nydusd %s, request %v", d.ID(), c) manager := sc.manager + fs := sc.fs var new daemon.Daemon new.States = d.States @@ -337,6 +341,8 @@ func (sc *Controller) upgradeNydusDaemon(d *daemon.Daemon, c upgradeRequest) err return errors.Wrap(err, "old daemon exits") } + fs.TryRetainSharedDaemon(&new) + if err := new.Start(); err != nil { return errors.Wrap(err, "start file system service") } diff --git a/snapshot/snapshot.go b/snapshot/snapshot.go index 488ca6d68d..d7545835f1 100644 --- a/snapshot/snapshot.go +++ b/snapshot/snapshot.go @@ -39,10 +39,10 @@ import ( "github.com/containerd/nydus-snapshotter/pkg/metrics" "github.com/containerd/nydus-snapshotter/pkg/metrics/collector" "github.com/containerd/nydus-snapshotter/pkg/pprof" + "github.com/containerd/nydus-snapshotter/pkg/system" "github.com/containerd/nydus-snapshotter/pkg/resolve" "github.com/containerd/nydus-snapshotter/pkg/store" - "github.com/containerd/nydus-snapshotter/pkg/system" "github.com/containerd/nydus-snapshotter/pkg/filesystem" "github.com/containerd/nydus-snapshotter/pkg/label" @@ -122,24 +122,6 @@ func NewSnapshotter(ctx context.Context, cfg *config.SnapshotterConfig) (snapsho }() } - if config.IsSystemControllerEnabled() { - systemController, err := system.NewSystemController(manager, config.SystemControllerAddress()) - if err != nil { - return nil, errors.Wrap(err, "create system controller") - } - go func() { - if err := systemController.Run(); err != nil { - log.L.WithError(err).Error("Failed to start system controller") - } - }() - pprofAddress := config.SystemControllerPprofAddress() - if pprofAddress != "" { - if err := pprof.NewPprofHTTPListener(pprofAddress); err != nil { - return nil, errors.Wrap(err, "Failed to start pprof HTTP server") - } - } - } - opts := []filesystem.NewFSOpt{ filesystem.WithManager(manager), filesystem.WithNydusImageBinaryPath(cfg.DaemonConfig.NydusdPath), @@ -169,6 +151,24 @@ func NewSnapshotter(ctx context.Context, cfg *config.SnapshotterConfig) (snapsho return nil, errors.Wrap(err, "failed to initialize nydus filesystem") } + if config.IsSystemControllerEnabled() { + systemController, err := system.NewSystemController(nydusFs, manager, config.SystemControllerAddress()) + if err != nil { + return nil, errors.Wrap(err, "create system controller") + } + go func() { + if err := systemController.Run(); err != nil { + log.L.WithError(err).Error("Failed to start system controller") + } + }() + pprofAddress := config.SystemControllerPprofAddress() + if pprofAddress != "" { + if err := pprof.NewPprofHTTPListener(pprofAddress); err != nil { + return nil, errors.Wrap(err, "Failed to start pprof HTTP server") + } + } + } + // With fuse driver enabled and a fuse daemon configuration with "localfs" // storage backend, it indicates that a Blobs Manager is needed to download // blobs from registry alone with no help of nydusd or containerd.