Commit 388a9e1d authored by Humble Chirammal's avatar Humble Chirammal

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: 's avatarHumble Chirammal <hchiramm@redhat.com>
parent 92b2e906
...@@ -138,12 +138,26 @@ func (s *volumeStatCalculator) calcAndStoreStats() { ...@@ -138,12 +138,26 @@ func (s *volumeStatCalculator) calcAndStoreStats() {
// parsePodVolumeStats converts (internal) volume.Metrics to (external) stats.VolumeStats structures // 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 { 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()) var available, capacity, used, inodes, inodesFree, inodesUsed uint64
used := uint64(metric.Used.Value()) if metric.Available != nil {
inodes := uint64(metric.Inodes.Value()) available = uint64(metric.Available.Value())
inodesFree := uint64(metric.InodesFree.Value()) }
inodesUsed := uint64(metric.InodesUsed.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{ return stats.VolumeStats{
Name: podName, Name: podName,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment