| Copyright 2020 The Monogon Project Authors. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| |
| |
| This rips out ZFS support from cadvisor. This should be turned into an upstream change for allowing zfs to be disabled via a build tag. |
| |
| diff -ur com_github_google_cadvisor.orig/container/docker/factory.go com_github_google_cadvisor/container/docker/factory.go |
| --- com_github_google_cadvisor.orig/container/docker/factory.go 2020-04-15 17:54:23.082143453 +0200 |
| +++ com_github_google_cadvisor/container/docker/factory.go 2020-04-16 15:08:47.394501543 +0200 |
| @@ -34,7 +34,6 @@ |
| info "github.com/google/cadvisor/info/v1" |
| "github.com/google/cadvisor/machine" |
| "github.com/google/cadvisor/watcher" |
| - "github.com/google/cadvisor/zfs" |
| |
| docker "github.com/docker/docker/client" |
| "golang.org/x/net/context" |
| @@ -102,7 +101,6 @@ |
| aufsStorageDriver storageDriver = "aufs" |
| overlayStorageDriver storageDriver = "overlay" |
| overlay2StorageDriver storageDriver = "overlay2" |
| - zfsStorageDriver storageDriver = "zfs" |
| ) |
| |
| type dockerFactory struct { |
| @@ -127,8 +125,6 @@ |
| |
| thinPoolName string |
| thinPoolWatcher *devicemapper.ThinPoolWatcher |
| - |
| - zfsWatcher *zfs.ZfsWatcher |
| } |
| |
| func (self *dockerFactory) String() string { |
| @@ -157,7 +153,6 @@ |
| self.includedMetrics, |
| self.thinPoolName, |
| self.thinPoolWatcher, |
| - self.zfsWatcher, |
| ) |
| return |
| } |
| @@ -246,21 +241,6 @@ |
| return thinPoolWatcher, nil |
| } |
| |
| -func startZfsWatcher(dockerInfo *dockertypes.Info) (*zfs.ZfsWatcher, error) { |
| - filesystem, err := dockerutil.DockerZfsFilesystem(*dockerInfo) |
| - if err != nil { |
| - return nil, err |
| - } |
| - |
| - zfsWatcher, err := zfs.NewZfsWatcher(filesystem) |
| - if err != nil { |
| - return nil, err |
| - } |
| - |
| - go zfsWatcher.Start() |
| - return zfsWatcher, nil |
| -} |
| - |
| func ensureThinLsKernelVersion(kernelVersion string) error { |
| // kernel 4.4.0 has the proper bug fixes to allow thin_ls to work without corrupting the thin pool |
| minKernelVersion := semver.MustParse("4.4.0") |
| @@ -358,14 +338,6 @@ |
| thinPoolName = status.DriverStatus[dockerutil.DriverStatusPoolName] |
| } |
| |
| - var zfsWatcher *zfs.ZfsWatcher |
| - if storageDriver(dockerInfo.Driver) == zfsStorageDriver { |
| - zfsWatcher, err = startZfsWatcher(dockerInfo) |
| - if err != nil { |
| - klog.Errorf("zfs filesystem stats will not be reported: %v", err) |
| - } |
| - } |
| - |
| klog.V(1).Infof("Registering Docker factory") |
| f := &dockerFactory{ |
| cgroupSubsystems: cgroupSubsystems, |
| @@ -379,7 +351,6 @@ |
| includedMetrics: includedMetrics, |
| thinPoolName: thinPoolName, |
| thinPoolWatcher: thinPoolWatcher, |
| - zfsWatcher: zfsWatcher, |
| } |
| |
| container.RegisterContainerHandlerFactory(f, []watcher.ContainerWatchSource{watcher.Raw}) |
| diff -ur com_github_google_cadvisor.orig/container/docker/handler.go com_github_google_cadvisor/container/docker/handler.go |
| --- com_github_google_cadvisor.orig/container/docker/handler.go 2020-04-15 17:54:23.082143453 +0200 |
| +++ com_github_google_cadvisor/container/docker/handler.go 2020-04-16 15:45:56.432489633 +0200 |
| @@ -25,12 +25,10 @@ |
| |
| "github.com/google/cadvisor/container" |
| "github.com/google/cadvisor/container/common" |
| - dockerutil "github.com/google/cadvisor/container/docker/utils" |
| containerlibcontainer "github.com/google/cadvisor/container/libcontainer" |
| "github.com/google/cadvisor/devicemapper" |
| "github.com/google/cadvisor/fs" |
| info "github.com/google/cadvisor/info/v1" |
| - "github.com/google/cadvisor/zfs" |
| |
| dockercontainer "github.com/docker/docker/api/types/container" |
| docker "github.com/docker/docker/client" |
| @@ -87,9 +85,6 @@ |
| // the devicemapper poolname |
| poolName string |
| |
| - // zfsParent is the parent for docker zfs |
| - zfsParent string |
| - |
| // Reference to the container |
| reference info.ContainerReference |
| |
| @@ -130,7 +125,6 @@ |
| includedMetrics container.MetricSet, |
| thinPoolName string, |
| thinPoolWatcher *devicemapper.ThinPoolWatcher, |
| - zfsWatcher *zfs.ZfsWatcher, |
| ) (container.ContainerHandler, error) { |
| // Create the cgroup paths. |
| cgroupPaths := common.MakeCgroupPaths(cgroupSubsystems.MountPoints, name) |
| @@ -164,8 +158,6 @@ |
| // For devicemapper, we only need the thin pool name, and that is passed in to this call |
| var ( |
| rootfsStorageDir string |
| - zfsFilesystem string |
| - zfsParent string |
| ) |
| switch storageDriver { |
| case aufsStorageDriver: |
| @@ -174,13 +166,6 @@ |
| rootfsStorageDir = path.Join(storageDir, string(storageDriver), rwLayerID, overlayRWLayer) |
| case overlay2StorageDriver: |
| rootfsStorageDir = path.Join(storageDir, string(storageDriver), rwLayerID, overlay2RWLayer) |
| - case zfsStorageDriver: |
| - status, err := Status() |
| - if err != nil { |
| - return nil, fmt.Errorf("unable to determine docker status: %v", err) |
| - } |
| - zfsParent = status.DriverStatus[dockerutil.DriverStatusParentDataset] |
| - zfsFilesystem = path.Join(zfsParent, rwLayerID) |
| } |
| |
| // We assume that if Inspect fails then the container is not known to docker. |
| @@ -200,7 +185,6 @@ |
| envs: make(map[string]string), |
| labels: ctnr.Config.Labels, |
| includedMetrics: includedMetrics, |
| - zfsParent: zfsParent, |
| } |
| // Timestamp returned by Docker is in time.RFC3339Nano format. |
| handler.creationTime, err = time.Parse(time.RFC3339Nano, ctnr.Created) |
| @@ -244,9 +228,6 @@ |
| handler.fsHandler = &dockerFsHandler{ |
| fsHandler: common.NewFsHandler(common.DefaultPeriod, rootfsStorageDir, otherStorageDir, fsInfo), |
| thinPoolWatcher: thinPoolWatcher, |
| - zfsWatcher: zfsWatcher, |
| - deviceID: ctnr.GraphDriver.Data["DeviceId"], |
| - zfsFilesystem: zfsFilesystem, |
| } |
| } |
| |
| @@ -271,7 +252,7 @@ |
| } |
| |
| // dockerFsHandler is a composite FsHandler implementation the incorporates |
| -// the common fs handler, a devicemapper ThinPoolWatcher, and a zfsWatcher |
| +// the common fs handler and a devicemapper ThinPoolWatcher |
| type dockerFsHandler struct { |
| fsHandler common.FsHandler |
| |
| @@ -279,11 +260,6 @@ |
| thinPoolWatcher *devicemapper.ThinPoolWatcher |
| // deviceID is the id of the container's fs device |
| deviceID string |
| - |
| - // zfsWatcher is the zfs filesystem watcher |
| - zfsWatcher *zfs.ZfsWatcher |
| - // zfsFilesystem is the docker zfs filesystem |
| - zfsFilesystem string |
| } |
| |
| var _ common.FsHandler = &dockerFsHandler{} |
| @@ -316,16 +292,6 @@ |
| usage.TotalUsageBytes += thinPoolUsage |
| } |
| } |
| - |
| - if h.zfsWatcher != nil { |
| - zfsUsage, err := h.zfsWatcher.GetUsage(h.zfsFilesystem) |
| - if err != nil { |
| - klog.V(5).Infof("unable to get fs usage from zfs for filesystem %s: %v", h.zfsFilesystem, err) |
| - } else { |
| - usage.BaseUsageBytes = zfsUsage |
| - usage.TotalUsageBytes += zfsUsage |
| - } |
| - } |
| return usage |
| } |
| |
| @@ -389,8 +355,6 @@ |
| return fmt.Errorf("unable to determine device info for dir: %v: %v", self.rootfsStorageDir, err) |
| } |
| device = deviceInfo.Device |
| - case zfsStorageDriver: |
| - device = self.zfsParent |
| default: |
| return nil |
| } |
| diff -ur com_github_google_cadvisor.orig/container/docker/utils/docker.go com_github_google_cadvisor/container/docker/utils/docker.go |
| --- com_github_google_cadvisor.orig/container/docker/utils/docker.go 2020-04-15 17:54:23.082143453 +0200 |
| +++ com_github_google_cadvisor/container/docker/utils/docker.go 2020-04-16 15:10:30.379817831 +0200 |
| @@ -69,12 +69,3 @@ |
| |
| return metadataDevice, nil |
| } |
| - |
| -func DockerZfsFilesystem(info dockertypes.Info) (string, error) { |
| - filesystem := DriverStatusValue(info.DriverStatus, DriverStatusParentDataset) |
| - if len(filesystem) == 0 { |
| - return "", fmt.Errorf("Could not get zfs filesystem") |
| - } |
| - |
| - return filesystem, nil |
| -} |
| diff -ur com_github_google_cadvisor.orig/fs/fs.go com_github_google_cadvisor/fs/fs.go |
| --- com_github_google_cadvisor.orig/fs/fs.go 2020-04-15 17:54:23.086143468 +0200 |
| +++ com_github_google_cadvisor/fs/fs.go 2020-04-16 15:39:57.294333566 +0200 |
| @@ -32,7 +32,6 @@ |
| |
| "github.com/google/cadvisor/devicemapper" |
| "github.com/google/cadvisor/utils" |
| - zfs "github.com/mistifyio/go-zfs" |
| |
| "k8s.io/klog" |
| "k8s.io/utils/mount" |
| @@ -167,11 +166,9 @@ |
| |
| supportedFsType := map[string]bool{ |
| // all ext systems are checked through prefix. |
| - "btrfs": true, |
| "overlay": true, |
| "tmpfs": true, |
| "xfs": true, |
| - "zfs": true, |
| } |
| |
| for _, mount := range mounts { |
| @@ -200,17 +197,6 @@ |
| if mount.FsType == "tmpfs" { |
| mount.Source = mount.MountPoint |
| } |
| - // btrfs fix: following workaround fixes wrong btrfs Major and Minor Ids reported in /proc/self/mountinfo. |
| - // instead of using values from /proc/self/mountinfo we use stat to get Ids from btrfs mount point |
| - if mount.FsType == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") { |
| - major, minor, err := getBtrfsMajorMinorIds(&mount) |
| - if err != nil { |
| - klog.Warningf("%s", err) |
| - } else { |
| - mount.Major = major |
| - mount.Minor = minor |
| - } |
| - } |
| |
| // overlay fix: Making mount source unique for all overlay mounts, using the mount's major and minor ids. |
| if mount.FsType == "overlay" { |
| @@ -312,7 +298,7 @@ |
| |
| // TODO(rjnagal): Detect docker root and graphdriver directories from docker info. |
| dockerRoot := context.Docker.Root |
| - for _, dir := range []string{"devicemapper", "btrfs", "aufs", "overlay", "overlay2", "zfs"} { |
| + for _, dir := range []string{"devicemapper", "overlay", "overlay2"} { |
| dockerImagePaths[path.Join(dockerRoot, dir)] = struct{}{} |
| } |
| for dockerRoot != "/" && dockerRoot != "." { |
| @@ -390,14 +376,6 @@ |
| fs.Capacity, fs.Free, fs.Available, err = getDMStats(device, partition.blockSize) |
| klog.V(5).Infof("got devicemapper fs capacity stats: capacity: %v free: %v available: %v:", fs.Capacity, fs.Free, fs.Available) |
| fs.Type = DeviceMapper |
| - case ZFS.String(): |
| - if _, devzfs := os.Stat("/dev/zfs"); os.IsExist(devzfs) { |
| - fs.Capacity, fs.Free, fs.Available, err = getZfstats(device) |
| - fs.Type = ZFS |
| - break |
| - } |
| - // if /dev/zfs is not present default to VFS |
| - fallthrough |
| default: |
| var inodes, inodesFree uint64 |
| if utils.FileExists(partition.mountpoint) { |
| @@ -521,30 +499,6 @@ |
| } |
| } |
| |
| - mount, found := self.mounts[dir] |
| - // try the parent dir if not found until we reach the root dir |
| - // this is an issue on btrfs systems where the directory is not |
| - // the subvolume |
| - for !found { |
| - pathdir, _ := filepath.Split(dir) |
| - // break when we reach root |
| - if pathdir == "/" { |
| - break |
| - } |
| - // trim "/" from the new parent path otherwise the next possible |
| - // filepath.Split in the loop will not split the string any further |
| - dir = strings.TrimSuffix(pathdir, "/") |
| - mount, found = self.mounts[dir] |
| - } |
| - |
| - if found && mount.FsType == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") { |
| - major, minor, err := getBtrfsMajorMinorIds(&mount) |
| - if err != nil { |
| - klog.Warningf("%s", err) |
| - } else { |
| - return &DeviceInfo{mount.Source, uint(major), uint(minor)}, nil |
| - } |
| - } |
| return nil, fmt.Errorf("could not find device with major: %d, minor: %d in cached partitions map", major, minor) |
| } |
| |
| @@ -715,18 +669,6 @@ |
| return used, total, nil |
| } |
| |
| -// getZfstats returns ZFS mount stats using zfsutils |
| -func getZfstats(poolName string) (uint64, uint64, uint64, error) { |
| - dataset, err := zfs.GetDataset(poolName) |
| - if err != nil { |
| - return 0, 0, 0, err |
| - } |
| - |
| - total := dataset.Used + dataset.Avail + dataset.Usedbydataset |
| - |
| - return total, dataset.Avail, dataset.Avail, nil |
| -} |
| - |
| // Simple io.Writer implementation that counts how many bytes were written. |
| type byteCounter struct{ bytesWritten uint64 } |
| |
| @@ -734,33 +676,3 @@ |
| b.bytesWritten += uint64(len(p)) |
| return len(p), nil |
| } |
| - |
| -// Get major and minor Ids for a mount point using btrfs as filesystem. |
| -func getBtrfsMajorMinorIds(mount *mount.MountInfo) (int, int, error) { |
| - // btrfs fix: following workaround fixes wrong btrfs Major and Minor Ids reported in /proc/self/mountinfo. |
| - // instead of using values from /proc/self/mountinfo we use stat to get Ids from btrfs mount point |
| - |
| - buf := new(syscall.Stat_t) |
| - err := syscall.Stat(mount.Source, buf) |
| - if err != nil { |
| - err = fmt.Errorf("stat failed on %s with error: %s", mount.Source, err) |
| - return 0, 0, err |
| - } |
| - |
| - klog.V(4).Infof("btrfs mount %#v", mount) |
| - if buf.Mode&syscall.S_IFMT == syscall.S_IFBLK { |
| - err := syscall.Stat(mount.MountPoint, buf) |
| - if err != nil { |
| - err = fmt.Errorf("stat failed on %s with error: %s", mount.MountPoint, err) |
| - return 0, 0, err |
| - } |
| - |
| - // The type Dev and Rdev in Stat_t are 32bit on mips. |
| - klog.V(4).Infof("btrfs dev major:minor %d:%d\n", int(major(uint64(buf.Dev))), int(minor(uint64(buf.Dev)))) // nolint: unconvert |
| - klog.V(4).Infof("btrfs rdev major:minor %d:%d\n", int(major(uint64(buf.Rdev))), int(minor(uint64(buf.Rdev)))) // nolint: unconvert |
| - |
| - return int(major(uint64(buf.Dev))), int(minor(uint64(buf.Dev))), nil // nolint: unconvert |
| - } else { |
| - return 0, 0, fmt.Errorf("%s is not a block device", mount.Source) |
| - } |
| -} |
| diff -ur com_github_google_cadvisor.orig/fs/fs_test.go com_github_google_cadvisor/fs/fs_test.go |
| --- com_github_google_cadvisor.orig/fs/fs_test.go 2020-04-15 17:54:23.086143468 +0200 |
| +++ com_github_google_cadvisor/fs/fs_test.go 2020-04-16 15:10:42.829856068 +0200 |
| @@ -516,7 +516,6 @@ |
| {Root: "/", MountPoint: "/b", Source: "/dev/sdb", FsType: "ext4", Major: 253, Minor: 1}, |
| {Root: "/", MountPoint: "/c", Source: "/dev/sdc", FsType: "btrfs", Major: 253, Minor: 2}, |
| {Root: "/", MountPoint: "/d", Source: "/dev/sdd", FsType: "xfs", Major: 253, Minor: 3}, |
| - {Root: "/", MountPoint: "/e", Source: "/dev/sde", FsType: "zfs", Major: 253, Minor: 4}, |
| {Root: "/", MountPoint: "/f", Source: "overlay", FsType: "overlay", Major: 253, Minor: 5}, |
| {Root: "/", MountPoint: "/test1", Source: "tmpfs", FsType: "tmpfs", Major: 253, Minor: 4}, |
| {Root: "/", MountPoint: "/test2", Source: "tmpfs", FsType: "tmpfs", Major: 253, Minor: 4}, |
| @@ -526,7 +525,6 @@ |
| "/dev/sdb": {fsType: "ext4", mountpoint: "/b", major: 253, minor: 1}, |
| "/dev/sdc": {fsType: "btrfs", mountpoint: "/c", major: 253, minor: 2}, |
| "/dev/sdd": {fsType: "xfs", mountpoint: "/d", major: 253, minor: 3}, |
| - "/dev/sde": {fsType: "zfs", mountpoint: "/e", major: 253, minor: 4}, |
| "overlay_253-5": {fsType: "overlay", mountpoint: "/f", major: 253, minor: 5}, |
| "/test1": {fsType: "tmpfs", mountpoint: "/test1", major: 253, minor: 4}, |
| "/test2": {fsType: "tmpfs", mountpoint: "/test2", major: 253, minor: 4}, |
| diff -ur com_github_google_cadvisor.orig/fs/types.go com_github_google_cadvisor/fs/types.go |
| --- com_github_google_cadvisor.orig/fs/types.go 2020-04-15 17:54:23.086143468 +0200 |
| +++ com_github_google_cadvisor/fs/types.go 2020-04-16 15:10:48.264872763 +0200 |
| @@ -47,7 +47,6 @@ |
| } |
| |
| const ( |
| - ZFS FsType = "zfs" |
| DeviceMapper FsType = "devicemapper" |
| VFS FsType = "vfs" |
| ) |