mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-18 11:00:25 +00:00
util: make inode metrics optional in FilesystemNodeGetVolumeStats()
CephFS does not have a concept of "free inodes", inodes get allocated on-demand in the filesystem. This confuses alerting managers that expect a (high) number of free inodes, and warnings get produced if the number of free inodes is not high enough. This causes alerts to always get reported for CephFS. To prevent the false-positive alerts from happening, the NodeGetVolumeStats procedure for CephFS (and CephNFS) will not contain inodes in the reply anymore. See-also: https://bugzilla.redhat.com/2128263 Signed-off-by: Niels de Vos <ndevos@redhat.com>
This commit is contained in:
parent
386d3ddd6e
commit
b7703faf37
@ -637,7 +637,7 @@ func (ns *NodeServer) NodeGetVolumeStats(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if stat.Mode().IsDir() {
|
if stat.Mode().IsDir() {
|
||||||
return csicommon.FilesystemNodeGetVolumeStats(ctx, ns.Mounter, targetPath)
|
return csicommon.FilesystemNodeGetVolumeStats(ctx, ns.Mounter, targetPath, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, status.Errorf(codes.InvalidArgument, "targetpath %q is not a directory or device", targetPath)
|
return nil, status.Errorf(codes.InvalidArgument, "targetpath %q is not a directory or device", targetPath)
|
||||||
|
@ -241,6 +241,7 @@ func FilesystemNodeGetVolumeStats(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
mounter mount.Interface,
|
mounter mount.Interface,
|
||||||
targetPath string,
|
targetPath string,
|
||||||
|
includeInodes bool,
|
||||||
) (*csi.NodeGetVolumeStatsResponse, error) {
|
) (*csi.NodeGetVolumeStatsResponse, error) {
|
||||||
isMnt, err := util.IsMountPoint(mounter, targetPath)
|
isMnt, err := util.IsMountPoint(mounter, targetPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -274,23 +275,8 @@ func FilesystemNodeGetVolumeStats(
|
|||||||
if !ok {
|
if !ok {
|
||||||
log.ErrorLog(ctx, "failed to fetch used bytes")
|
log.ErrorLog(ctx, "failed to fetch used bytes")
|
||||||
}
|
}
|
||||||
inodes, ok := (*(volMetrics.Inodes)).AsInt64()
|
|
||||||
if !ok {
|
|
||||||
log.ErrorLog(ctx, "failed to fetch available inodes")
|
|
||||||
|
|
||||||
return nil, status.Error(codes.Unknown, "failed to fetch available inodes")
|
res := &csi.NodeGetVolumeStatsResponse{
|
||||||
}
|
|
||||||
inodesFree, ok := (*(volMetrics.InodesFree)).AsInt64()
|
|
||||||
if !ok {
|
|
||||||
log.ErrorLog(ctx, "failed to fetch free inodes")
|
|
||||||
}
|
|
||||||
|
|
||||||
inodesUsed, ok := (*(volMetrics.InodesUsed)).AsInt64()
|
|
||||||
if !ok {
|
|
||||||
log.ErrorLog(ctx, "failed to fetch used inodes")
|
|
||||||
}
|
|
||||||
|
|
||||||
return &csi.NodeGetVolumeStatsResponse{
|
|
||||||
Usage: []*csi.VolumeUsage{
|
Usage: []*csi.VolumeUsage{
|
||||||
{
|
{
|
||||||
Available: requirePositive(available),
|
Available: requirePositive(available),
|
||||||
@ -298,14 +284,35 @@ func FilesystemNodeGetVolumeStats(
|
|||||||
Used: requirePositive(used),
|
Used: requirePositive(used),
|
||||||
Unit: csi.VolumeUsage_BYTES,
|
Unit: csi.VolumeUsage_BYTES,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Available: requirePositive(inodesFree),
|
|
||||||
Total: requirePositive(inodes),
|
|
||||||
Used: requirePositive(inodesUsed),
|
|
||||||
Unit: csi.VolumeUsage_INODES,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}, nil
|
}
|
||||||
|
|
||||||
|
if includeInodes {
|
||||||
|
inodes, ok := (*(volMetrics.Inodes)).AsInt64()
|
||||||
|
if !ok {
|
||||||
|
log.ErrorLog(ctx, "failed to fetch available inodes")
|
||||||
|
|
||||||
|
return nil, status.Error(codes.Unknown, "failed to fetch available inodes")
|
||||||
|
}
|
||||||
|
inodesFree, ok := (*(volMetrics.InodesFree)).AsInt64()
|
||||||
|
if !ok {
|
||||||
|
log.ErrorLog(ctx, "failed to fetch free inodes")
|
||||||
|
}
|
||||||
|
|
||||||
|
inodesUsed, ok := (*(volMetrics.InodesUsed)).AsInt64()
|
||||||
|
if !ok {
|
||||||
|
log.ErrorLog(ctx, "failed to fetch used inodes")
|
||||||
|
}
|
||||||
|
|
||||||
|
res.Usage = append(res.Usage, &csi.VolumeUsage{
|
||||||
|
Available: requirePositive(inodesFree),
|
||||||
|
Total: requirePositive(inodes),
|
||||||
|
Used: requirePositive(inodesUsed),
|
||||||
|
Unit: csi.VolumeUsage_INODES,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// requirePositive returns the value for `x` when it is greater or equal to 0,
|
// requirePositive returns the value for `x` when it is greater or equal to 0,
|
||||||
|
@ -88,7 +88,7 @@ func TestFilesystemNodeGetVolumeStats(t *testing.T) {
|
|||||||
|
|
||||||
// retry until a mountpoint is found
|
// retry until a mountpoint is found
|
||||||
for {
|
for {
|
||||||
stats, err := FilesystemNodeGetVolumeStats(context.TODO(), mount.New(""), cwd)
|
stats, err := FilesystemNodeGetVolumeStats(context.TODO(), mount.New(""), cwd, true)
|
||||||
if err != nil && cwd != "/" && strings.HasSuffix(err.Error(), "is not mounted") {
|
if err != nil && cwd != "/" && strings.HasSuffix(err.Error(), "is not mounted") {
|
||||||
// try again with the parent directory
|
// try again with the parent directory
|
||||||
cwd = filepath.Dir(cwd)
|
cwd = filepath.Dir(cwd)
|
||||||
|
@ -182,7 +182,7 @@ func (ns *NodeServer) NodeGetVolumeStats(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if stat.Mode().IsDir() {
|
if stat.Mode().IsDir() {
|
||||||
return csicommon.FilesystemNodeGetVolumeStats(ctx, ns.Mounter, targetPath)
|
return csicommon.FilesystemNodeGetVolumeStats(ctx, ns.Mounter, targetPath, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, status.Errorf(codes.InvalidArgument,
|
return nil, status.Errorf(codes.InvalidArgument,
|
||||||
|
@ -1240,7 +1240,7 @@ func (ns *NodeServer) NodeGetVolumeStats(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if stat.Mode().IsDir() {
|
if stat.Mode().IsDir() {
|
||||||
return csicommon.FilesystemNodeGetVolumeStats(ctx, ns.Mounter, targetPath)
|
return csicommon.FilesystemNodeGetVolumeStats(ctx, ns.Mounter, targetPath, true)
|
||||||
} else if (stat.Mode() & os.ModeDevice) == os.ModeDevice {
|
} else if (stat.Mode() & os.ModeDevice) == os.ModeDevice {
|
||||||
return blockNodeGetVolumeStats(ctx, targetPath)
|
return blockNodeGetVolumeStats(ctx, targetPath)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user