From cada0270fe195f1664bda43befc9547e454c7817 Mon Sep 17 00:00:00 2001 From: Humble Chirammal Date: Thu, 23 May 2019 01:04:28 +0530 Subject: [PATCH] Fix nil pointer dereference in metrics value calculator. The metrics structure passed to volume stat calculator can contain real stats on subset of metrics fields. For example, the metrics structure filled by a CSI driver can have either INODES or BYTES filled, IOW it a valid return. In such cases the volume stat calculator panic with below trace: 0516 21:36:19.013143 14452 runtime.go:69] Observed a panic: "invalid memory address or nil pointer dereference" (runtime error: invalid memory address or nil pointer dereference) /home/hchiramm/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go:76 /home/hchiramm/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go:65 /home/hchiramm/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go:51 /usr/local/go/src/runtime/panic.go:522 /usr/local/go/src/runtime/panic.go:82 /usr/local/go/src/runtime/signal_unix.go:390 /home/hchiramm/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go:697 /home/hchiramm/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go:685 /home/hchiramm/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go:144 /home/hchiramm/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go:125 /home/hchiramm/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go:65 /home/hchiramm/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:152 /home/hchiramm/gopath/src/k8s.io/kubernetes/_output/local/go/src/k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:153 /usr/local/go/src/runtime/asm_amd64.s:1337 Signed-off-by: Humble Chirammal --- .../server/stats/volume_stat_calculator.go | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/pkg/kubelet/server/stats/volume_stat_calculator.go b/pkg/kubelet/server/stats/volume_stat_calculator.go index cd8ffdf8df8..2b474c70fc7 100644 --- a/pkg/kubelet/server/stats/volume_stat_calculator.go +++ b/pkg/kubelet/server/stats/volume_stat_calculator.go @@ -138,12 +138,26 @@ func (s *volumeStatCalculator) calcAndStoreStats() { // parsePodVolumeStats converts (internal) volume.Metrics to (external) stats.VolumeStats structures func (s *volumeStatCalculator) parsePodVolumeStats(podName string, pvcRef *stats.PVCReference, metric *volume.Metrics, volSpec v1.Volume) stats.VolumeStats { - available := uint64(metric.Available.Value()) - capacity := uint64(metric.Capacity.Value()) - used := uint64(metric.Used.Value()) - inodes := uint64(metric.Inodes.Value()) - inodesFree := uint64(metric.InodesFree.Value()) - inodesUsed := uint64(metric.InodesUsed.Value()) + + var available, capacity, used, inodes, inodesFree, inodesUsed uint64 + if metric.Available != nil { + available = uint64(metric.Available.Value()) + } + if metric.Capacity != nil { + capacity = uint64(metric.Capacity.Value()) + } + if metric.Used != nil { + used = uint64(metric.Used.Value()) + } + if metric.Inodes != nil { + inodes = uint64(metric.Inodes.Value()) + } + if metric.InodesFree != nil { + inodesFree = uint64(metric.InodesFree.Value()) + } + if metric.InodesUsed != nil { + inodesUsed = uint64(metric.InodesUsed.Value()) + } return stats.VolumeStats{ Name: podName,