Skip to content

Conversation

@yunwang0911
Copy link
Contributor

@yunwang0911 yunwang0911 commented Aug 10, 2024

What type of PR is this?

/kind bug

What this PR does / why we need it:

Fix one bug of the feature pod in-place resource resize, feature gate: InPlacePodVerticalScaling

Which issue(s) this PR fixes:

Fixes #128375

Special notes for your reviewer:

One line bug description: the content func stateCheckpoint.storeState writes into the file /var/lib/kubelet/pod_status_manager_state is different from it func stateCheckpoint.restoreState reads from the same file, which causes function VerifyChecksum always fails for some format of Quantity value. It should only happen for static pods in static dir.

**How to reproduce? **

  1. prepare a pod spec with content below
{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "nginx2"
  },
  "spec": {
    "containers": [
      {
        "name": "nginx",
        "image": "nginx:1.14.2",
        "ports": [
          {
            "containerPort": 80
          }
        ],
        "resources": {
          "requests": {
            "cpu": "0.4",
            "memory": "1Gi"
          },
          "limits": {
            "cpu": "1.5",
            "memory": "1Gi"
          }
        }
      }
    ]
  }
}
  1. copy the pod spec into dir /etc/kubernetes/manifest/ in master node
  2. restart the kubelet systemctl restart kubelet
  3. the kubelet will crash all the time until the file /var/lib/kubelet/pod_status_manager_state is deleted
  4. error message would be like below
Aug 10 04:39:38 minikube systemd[1]: kubelet.service: Failed with result 'exit-code'.
Aug 10 04:39:38 minikube systemd[1]: kubelet.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Aug 10 04:39:38 minikube kubelet[1190750]:         k8s.io/kubernetes/cmd/kubelet/app/server.go:1239 +0x90
Aug 10 04:39:38 minikube kubelet[1190750]: created by k8s.io/kubernetes/cmd/kubelet/app.startKubelet in goroutine 1
Aug 10 04:39:38 minikube kubelet[1190750]:         k8s.io/kubernetes/pkg/kubelet/kubelet.go:1628 +0x658
Aug 10 04:39:38 minikube kubelet[1190750]: k8s.io/kubernetes/pkg/kubelet.(*Kubelet).Run(0x4000ccac08, 0x4000ca1140)
Aug 10 04:39:38 minikube kubelet[1190750]:         k8s.io/kubernetes/pkg/kubelet/status/status_manager.go:204 +0x28c
Aug 10 04:39:38 minikube kubelet[1190750]: k8s.io/kubernetes/pkg/kubelet/status.(*manager).Start(0x40007a3a70)
Aug 10 04:39:38 minikube kubelet[1190750]: goroutine 239 [running]:
Aug 10 04:39:38 minikube kubelet[1190750]: panic: could not restore state from checkpoint: checkpoint is corrupted, please drain this node and delete pod allocation checkpoint file "/var/lib/kubelet/pod_status_manager_state" before restarting Kubelet
Aug 10 04:39:38 minikube kubelet[1190750]: E0810 04:39:38.722303 1190750 status_manager.go:203] "Could not initialize pod allocation checkpoint manager, please drain node and remove policy state file" err="could not restore state from checkpoint: checkpoint is corrupted, please drain this node and delete pod allocation checkpoint file \"/var/lib/kubelet/pod_status_manager_state\" before restarting Kubelet"

Root cause
The json marshal function of Quantity type will convert itself to CanonicalBytes
https://github.com/kubernetes/apimachinery/blob/95b78024e3feada7739b40426690b4f287933fd8/pkg/api/resource/quantity.go#L452C25-L452C41
But the json unmarshal function of Quantity type won't do that.
https://github.com/kubernetes/apimachinery/blob/95b78024e3feada7739b40426690b4f287933fd8/pkg/api/resource/quantity.go#L701
For some formats for Quantity value, the Quantity contents, wrote to and read from the same file, might be different.
For example, if the pod cpu request is defined as cpu: "0.4", the Quantity content is cpu:{{4 -1} {<nil>} DecimalSI before writing it into the file, but the content is cpu:{{400 -3} {<nil>} 400m DecimalSI after reading from the same file.

According to the reason above, the function VerifyChecksum might fail.

Detailed test case

=== RUN   Test_stateCheckpoint_storeState
=== RUN   Test_stateCheckpoint_storeState/format_0_-_cpu_1Ki
=== RUN   Test_stateCheckpoint_storeState/format_1_-_cpu_1Mi
=== RUN   Test_stateCheckpoint_storeState/format_2_-_cpu_1Gi
=== RUN   Test_stateCheckpoint_storeState/format_3_-_cpu_1Ti
=== RUN   Test_stateCheckpoint_storeState/format_4_-_cpu_1Pi
=== RUN   Test_stateCheckpoint_storeState/format_5_-_cpu_1Ei
=== RUN   Test_stateCheckpoint_storeState/format_6_-_cpu_1n
=== RUN   Test_stateCheckpoint_storeState/format_7_-_cpu_1u
=== RUN   Test_stateCheckpoint_storeState/format_8_-_cpu_1m
=== RUN   Test_stateCheckpoint_storeState/format_9_-_cpu_1k
=== RUN   Test_stateCheckpoint_storeState/format_10_-_cpu_1M
=== RUN   Test_stateCheckpoint_storeState/format_11_-_cpu_1G
=== RUN   Test_stateCheckpoint_storeState/format_12_-_cpu_1T
=== RUN   Test_stateCheckpoint_storeState/format_13_-_cpu_1P
=== RUN   Test_stateCheckpoint_storeState/format_14_-_cpu_1E
=== RUN   Test_stateCheckpoint_storeState/format_15_-_cpu_1
=== RUN   Test_stateCheckpoint_storeState/format_16_-_cpu_0.1Ki
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_17_-_cpu_0.1Mi
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_18_-_cpu_0.1Gi
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_19_-_cpu_0.1Ti
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_20_-_cpu_0.1Pi
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_21_-_cpu_0.1Ei
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_22_-_cpu_0.1n
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_23_-_cpu_0.1u
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_24_-_cpu_0.1m
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_25_-_cpu_0.1k
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_26_-_cpu_0.1M
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_27_-_cpu_0.1G
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_28_-_cpu_0.1T
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_29_-_cpu_0.1P
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_30_-_cpu_0.1E
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_31_-_cpu_0.1
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_32_-_cpu_0.03Ki
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_33_-_cpu_0.03Mi
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_34_-_cpu_0.03Gi
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_35_-_cpu_0.03Ti
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_36_-_cpu_0.03Pi
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_37_-_cpu_0.03Ei
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_38_-_cpu_0.03n
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_39_-_cpu_0.03u
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_40_-_cpu_0.03m
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_41_-_cpu_0.03k
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_42_-_cpu_0.03M
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_43_-_cpu_0.03G
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_44_-_cpu_0.03T
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_45_-_cpu_0.03P
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_46_-_cpu_0.03E
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_47_-_cpu_0.03
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_48_-_cpu_10Ki
=== RUN   Test_stateCheckpoint_storeState/format_49_-_cpu_10Mi
=== RUN   Test_stateCheckpoint_storeState/format_50_-_cpu_10Gi
=== RUN   Test_stateCheckpoint_storeState/format_51_-_cpu_10Ti
=== RUN   Test_stateCheckpoint_storeState/format_52_-_cpu_10Pi
=== RUN   Test_stateCheckpoint_storeState/format_53_-_cpu_10Ei
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_54_-_cpu_10n
=== RUN   Test_stateCheckpoint_storeState/format_55_-_cpu_10u
=== RUN   Test_stateCheckpoint_storeState/format_56_-_cpu_10m
=== RUN   Test_stateCheckpoint_storeState/format_57_-_cpu_10k
=== RUN   Test_stateCheckpoint_storeState/format_58_-_cpu_10M
=== RUN   Test_stateCheckpoint_storeState/format_59_-_cpu_10G
=== RUN   Test_stateCheckpoint_storeState/format_60_-_cpu_10T
=== RUN   Test_stateCheckpoint_storeState/format_61_-_cpu_10P
=== RUN   Test_stateCheckpoint_storeState/format_62_-_cpu_10E
=== RUN   Test_stateCheckpoint_storeState/format_63_-_cpu_10
=== RUN   Test_stateCheckpoint_storeState/format_64_-_cpu_100Ki
=== RUN   Test_stateCheckpoint_storeState/format_65_-_cpu_100Mi
=== RUN   Test_stateCheckpoint_storeState/format_66_-_cpu_100Gi
=== RUN   Test_stateCheckpoint_storeState/format_67_-_cpu_100Ti
=== RUN   Test_stateCheckpoint_storeState/format_68_-_cpu_100Pi
=== RUN   Test_stateCheckpoint_storeState/format_69_-_cpu_100Ei
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_70_-_cpu_100n
=== RUN   Test_stateCheckpoint_storeState/format_71_-_cpu_100u
=== RUN   Test_stateCheckpoint_storeState/format_72_-_cpu_100m
=== RUN   Test_stateCheckpoint_storeState/format_73_-_cpu_100k
=== RUN   Test_stateCheckpoint_storeState/format_74_-_cpu_100M
=== RUN   Test_stateCheckpoint_storeState/format_75_-_cpu_100G
=== RUN   Test_stateCheckpoint_storeState/format_76_-_cpu_100T
=== RUN   Test_stateCheckpoint_storeState/format_77_-_cpu_100P
=== RUN   Test_stateCheckpoint_storeState/format_78_-_cpu_100E
=== RUN   Test_stateCheckpoint_storeState/format_79_-_cpu_100
=== RUN   Test_stateCheckpoint_storeState/format_80_-_cpu_512Ki
=== RUN   Test_stateCheckpoint_storeState/format_81_-_cpu_512Mi
=== RUN   Test_stateCheckpoint_storeState/format_82_-_cpu_512Gi
=== RUN   Test_stateCheckpoint_storeState/format_83_-_cpu_512Ti
=== RUN   Test_stateCheckpoint_storeState/format_84_-_cpu_512Pi
=== RUN   Test_stateCheckpoint_storeState/format_85_-_cpu_512Ei
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_86_-_cpu_512n
=== RUN   Test_stateCheckpoint_storeState/format_87_-_cpu_512u
=== RUN   Test_stateCheckpoint_storeState/format_88_-_cpu_512m
=== RUN   Test_stateCheckpoint_storeState/format_89_-_cpu_512k
=== RUN   Test_stateCheckpoint_storeState/format_90_-_cpu_512M
=== RUN   Test_stateCheckpoint_storeState/format_91_-_cpu_512G
=== RUN   Test_stateCheckpoint_storeState/format_92_-_cpu_512T
=== RUN   Test_stateCheckpoint_storeState/format_93_-_cpu_512P
=== RUN   Test_stateCheckpoint_storeState/format_94_-_cpu_512E
=== RUN   Test_stateCheckpoint_storeState/format_95_-_cpu_512
=== RUN   Test_stateCheckpoint_storeState/format_96_-_cpu_1000Ki
=== RUN   Test_stateCheckpoint_storeState/format_97_-_cpu_1000Mi
=== RUN   Test_stateCheckpoint_storeState/format_98_-_cpu_1000Gi
=== RUN   Test_stateCheckpoint_storeState/format_99_-_cpu_1000Ti
=== RUN   Test_stateCheckpoint_storeState/format_100_-_cpu_1000Pi
=== RUN   Test_stateCheckpoint_storeState/format_101_-_cpu_1000Ei
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_102_-_cpu_1000n
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_103_-_cpu_1000u
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_104_-_cpu_1000m
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_105_-_cpu_1000k
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_106_-_cpu_1000M
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_107_-_cpu_1000G
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_108_-_cpu_1000T
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_109_-_cpu_1000P
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_110_-_cpu_1000E
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_111_-_cpu_1000
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_112_-_cpu_1024Ki
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_113_-_cpu_1024Mi
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_114_-_cpu_1024Gi
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_115_-_cpu_1024Ti
=== RUN   Test_stateCheckpoint_storeState/format_116_-_cpu_1024Pi
=== RUN   Test_stateCheckpoint_storeState/format_117_-_cpu_1024Ei
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_118_-_cpu_1024n
=== RUN   Test_stateCheckpoint_storeState/format_119_-_cpu_1024u
=== RUN   Test_stateCheckpoint_storeState/format_120_-_cpu_1024m
=== RUN   Test_stateCheckpoint_storeState/format_121_-_cpu_1024k
=== RUN   Test_stateCheckpoint_storeState/format_122_-_cpu_1024M
=== RUN   Test_stateCheckpoint_storeState/format_123_-_cpu_1024G
=== RUN   Test_stateCheckpoint_storeState/format_124_-_cpu_1024T
=== RUN   Test_stateCheckpoint_storeState/format_125_-_cpu_1024P
=== RUN   Test_stateCheckpoint_storeState/format_126_-_cpu_1024E
=== RUN   Test_stateCheckpoint_storeState/format_127_-_cpu_1024
=== RUN   Test_stateCheckpoint_storeState/format_128_-_cpu_700Ki
=== RUN   Test_stateCheckpoint_storeState/format_129_-_cpu_700Mi
=== RUN   Test_stateCheckpoint_storeState/format_130_-_cpu_700Gi
=== RUN   Test_stateCheckpoint_storeState/format_131_-_cpu_700Ti
=== RUN   Test_stateCheckpoint_storeState/format_132_-_cpu_700Pi
=== RUN   Test_stateCheckpoint_storeState/format_133_-_cpu_700Ei
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_134_-_cpu_700n
=== RUN   Test_stateCheckpoint_storeState/format_135_-_cpu_700u
=== RUN   Test_stateCheckpoint_storeState/format_136_-_cpu_700m
=== RUN   Test_stateCheckpoint_storeState/format_137_-_cpu_700k
=== RUN   Test_stateCheckpoint_storeState/format_138_-_cpu_700M
=== RUN   Test_stateCheckpoint_storeState/format_139_-_cpu_700G
=== RUN   Test_stateCheckpoint_storeState/format_140_-_cpu_700T
=== RUN   Test_stateCheckpoint_storeState/format_141_-_cpu_700P
=== RUN   Test_stateCheckpoint_storeState/format_142_-_cpu_700E
=== RUN   Test_stateCheckpoint_storeState/format_143_-_cpu_700
=== RUN   Test_stateCheckpoint_storeState/format_144_-_cpu_10000Ki
=== RUN   Test_stateCheckpoint_storeState/format_145_-_cpu_10000Mi
=== RUN   Test_stateCheckpoint_storeState/format_146_-_cpu_10000Gi
=== RUN   Test_stateCheckpoint_storeState/format_147_-_cpu_10000Ti
=== RUN   Test_stateCheckpoint_storeState/format_148_-_cpu_10000Pi
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_149_-_cpu_10000Ei
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_150_-_cpu_10000n
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_151_-_cpu_10000u
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_152_-_cpu_10000m
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_153_-_cpu_10000k
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_154_-_cpu_10000M
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_155_-_cpu_10000G
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_156_-_cpu_10000T
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_157_-_cpu_10000P
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_158_-_cpu_10000E
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
=== RUN   Test_stateCheckpoint_storeState/format_159_-_cpu_10000
    state_checkpoint_test.go:82: failed to restore state: checkpoint is corrupted
--- FAIL: Test_stateCheckpoint_storeState (1.43s)
    --- PASS: Test_stateCheckpoint_storeState/format_0_-_cpu_1Ki (0.02s)
    --- PASS: Test_stateCheckpoint_storeState/format_1_-_cpu_1Mi (0.04s)
    --- PASS: Test_stateCheckpoint_storeState/format_2_-_cpu_1Gi (0.03s)
    --- PASS: Test_stateCheckpoint_storeState/format_3_-_cpu_1Ti (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_4_-_cpu_1Pi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_5_-_cpu_1Ei (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_6_-_cpu_1n (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_7_-_cpu_1u (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_8_-_cpu_1m (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_9_-_cpu_1k (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_10_-_cpu_1M (0.00s)
    --- PASS: Test_stateCheckpoint_storeState/format_11_-_cpu_1G (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_12_-_cpu_1T (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_13_-_cpu_1P (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_14_-_cpu_1E (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_15_-_cpu_1 (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_16_-_cpu_0.1Ki (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_17_-_cpu_0.1Mi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_18_-_cpu_0.1Gi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_19_-_cpu_0.1Ti (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_20_-_cpu_0.1Pi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_21_-_cpu_0.1Ei (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_22_-_cpu_0.1n (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_23_-_cpu_0.1u (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_24_-_cpu_0.1m (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_25_-_cpu_0.1k (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_26_-_cpu_0.1M (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_27_-_cpu_0.1G (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_28_-_cpu_0.1T (0.00s)
    --- FAIL: Test_stateCheckpoint_storeState/format_29_-_cpu_0.1P (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_30_-_cpu_0.1E (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_31_-_cpu_0.1 (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_32_-_cpu_0.03Ki (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_33_-_cpu_0.03Mi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_34_-_cpu_0.03Gi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_35_-_cpu_0.03Ti (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_36_-_cpu_0.03Pi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_37_-_cpu_0.03Ei (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_38_-_cpu_0.03n (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_39_-_cpu_0.03u (0.02s)
    --- FAIL: Test_stateCheckpoint_storeState/format_40_-_cpu_0.03m (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_41_-_cpu_0.03k (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_42_-_cpu_0.03M (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_43_-_cpu_0.03G (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_44_-_cpu_0.03T (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_45_-_cpu_0.03P (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_46_-_cpu_0.03E (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_47_-_cpu_0.03 (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_48_-_cpu_10Ki (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_49_-_cpu_10Mi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_50_-_cpu_10Gi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_51_-_cpu_10Ti (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_52_-_cpu_10Pi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_53_-_cpu_10Ei (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_54_-_cpu_10n (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_55_-_cpu_10u (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_56_-_cpu_10m (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_57_-_cpu_10k (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_58_-_cpu_10M (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_59_-_cpu_10G (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_60_-_cpu_10T (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_61_-_cpu_10P (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_62_-_cpu_10E (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_63_-_cpu_10 (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_64_-_cpu_100Ki (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_65_-_cpu_100Mi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_66_-_cpu_100Gi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_67_-_cpu_100Ti (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_68_-_cpu_100Pi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_69_-_cpu_100Ei (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_70_-_cpu_100n (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_71_-_cpu_100u (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_72_-_cpu_100m (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_73_-_cpu_100k (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_74_-_cpu_100M (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_75_-_cpu_100G (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_76_-_cpu_100T (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_77_-_cpu_100P (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_78_-_cpu_100E (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_79_-_cpu_100 (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_80_-_cpu_512Ki (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_81_-_cpu_512Mi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_82_-_cpu_512Gi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_83_-_cpu_512Ti (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_84_-_cpu_512Pi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_85_-_cpu_512Ei (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_86_-_cpu_512n (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_87_-_cpu_512u (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_88_-_cpu_512m (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_89_-_cpu_512k (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_90_-_cpu_512M (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_91_-_cpu_512G (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_92_-_cpu_512T (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_93_-_cpu_512P (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_94_-_cpu_512E (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_95_-_cpu_512 (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_96_-_cpu_1000Ki (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_97_-_cpu_1000Mi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_98_-_cpu_1000Gi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_99_-_cpu_1000Ti (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_100_-_cpu_1000Pi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_101_-_cpu_1000Ei (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_102_-_cpu_1000n (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_103_-_cpu_1000u (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_104_-_cpu_1000m (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_105_-_cpu_1000k (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_106_-_cpu_1000M (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_107_-_cpu_1000G (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_108_-_cpu_1000T (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_109_-_cpu_1000P (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_110_-_cpu_1000E (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_111_-_cpu_1000 (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_112_-_cpu_1024Ki (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_113_-_cpu_1024Mi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_114_-_cpu_1024Gi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_115_-_cpu_1024Ti (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_116_-_cpu_1024Pi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_117_-_cpu_1024Ei (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_118_-_cpu_1024n (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_119_-_cpu_1024u (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_120_-_cpu_1024m (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_121_-_cpu_1024k (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_122_-_cpu_1024M (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_123_-_cpu_1024G (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_124_-_cpu_1024T (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_125_-_cpu_1024P (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_126_-_cpu_1024E (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_127_-_cpu_1024 (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_128_-_cpu_700Ki (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_129_-_cpu_700Mi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_130_-_cpu_700Gi (0.02s)
    --- PASS: Test_stateCheckpoint_storeState/format_131_-_cpu_700Ti (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_132_-_cpu_700Pi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_133_-_cpu_700Ei (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_134_-_cpu_700n (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_135_-_cpu_700u (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_136_-_cpu_700m (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_137_-_cpu_700k (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_138_-_cpu_700M (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_139_-_cpu_700G (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_140_-_cpu_700T (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_141_-_cpu_700P (0.03s)
    --- PASS: Test_stateCheckpoint_storeState/format_142_-_cpu_700E (0.02s)
    --- PASS: Test_stateCheckpoint_storeState/format_143_-_cpu_700 (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_144_-_cpu_10000Ki (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_145_-_cpu_10000Mi (0.01s)
    --- PASS: Test_stateCheckpoint_storeState/format_146_-_cpu_10000Gi (0.02s)
    --- PASS: Test_stateCheckpoint_storeState/format_147_-_cpu_10000Ti (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_148_-_cpu_10000Pi (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_149_-_cpu_10000Ei (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_150_-_cpu_10000n (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_151_-_cpu_10000u (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_152_-_cpu_10000m (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_153_-_cpu_10000k (0.02s)
    --- FAIL: Test_stateCheckpoint_storeState/format_154_-_cpu_10000M (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_155_-_cpu_10000G (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_156_-_cpu_10000T (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_157_-_cpu_10000P (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_158_-_cpu_10000E (0.01s)
    --- FAIL: Test_stateCheckpoint_storeState/format_159_-_cpu_10000 (0.02s)
FAIL

Does this PR introduce a user-facing change?

Fix the bug of InPlacePodVerticalScaling state un-marshalling. State stored in `/var/lib/kubelet/pod_status_manager_state` is now can always be read back after kubelet restart.

Action Required: Since the checkpoint format was changed to fix the issue, if you are using the feature `InPlacePodVerticalScaling`, please clean up the state file `/var/lib/kubelet/pod_status_manager_state` when upgrading the kubelet as failrue to do it will lead to incompatible state formats and kubelet's failure to start.

Additional documentation e.g., KEPs (Kubernetes Enhancement Proposals), usage docs, etc.:

None

@k8s-ci-robot k8s-ci-robot added release-note-none Denotes a PR that doesn't merit a release note. kind/bug Categorizes issue or PR as related to a bug. size/L Denotes a PR that changes 100-499 lines, ignoring generated files. labels Aug 10, 2024
@k8s-ci-robot
Copy link
Contributor

Please note that we're already in Test Freeze for the release-1.31 branch. This means every merged PR will be automatically fast-forwarded via the periodic ci-fast-forward job to the release branch of the upcoming v1.31.0 release.

Fast forwards are scheduled to happen every 6 hours, whereas the most recent run was: Sat Aug 10 11:05:50 UTC 2024.

@k8s-ci-robot k8s-ci-robot added cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. do-not-merge/needs-sig Indicates an issue or PR lacks a `sig/foo` label and requires one. needs-triage Indicates an issue or PR lacks a `triage/foo` label and requires one. labels Aug 10, 2024
@k8s-ci-robot
Copy link
Contributor

Welcome @yunwang0911!

It looks like this is your first PR to kubernetes/kubernetes 🎉. Please refer to our pull request process documentation to help your PR have a smooth ride to approval.

You will be prompted by a bot to use commands during the review process. Do not be afraid to follow the prompts! It is okay to experiment. Here is the bot commands documentation.

You can also check if kubernetes/kubernetes has its own contribution guidelines.

You may want to refer to our testing guide if you run into trouble with your tests not passing.

If you are having difficulty getting your pull request seen, please follow the recommended escalation practices. Also, for tips and tricks in the contribution process you may want to read the Kubernetes contributor cheat sheet. We want to make sure your contribution gets all the attention it needs!

Thank you, and welcome to Kubernetes. 😃

@k8s-ci-robot
Copy link
Contributor

Hi @yunwang0911. Thanks for your PR.

I'm waiting for a kubernetes member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should join the org to skip this step.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@k8s-ci-robot k8s-ci-robot added needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. needs-priority Indicates a PR lacks a `priority/foo` label and requires one. area/kubelet sig/node Categorizes an issue or PR as relevant to SIG Node. and removed do-not-merge/needs-sig Indicates an issue or PR lacks a `sig/foo` label and requires one. labels Aug 10, 2024
@bart0sh
Copy link
Contributor

bart0sh commented Aug 10, 2024

@yunwang0911 This reminds me #123552. To properly fix this, checksum should be calculated after marshalling, as we did in #126303.
However, it's not easy to do as explained in the #123552

@yunwang0911 yunwang0911 force-pushed the master branch 2 times, most recently from 9bc1d68 to 9058cb9 Compare August 11, 2024 02:45
@yunwang0911
Copy link
Contributor Author

@yunwang0911 This reminds me #123552. To properly fix this, checksum should be calculated after marshalling, as we did in #126303. However, it's not easy to do as explained in the #123552

@bart0sh Thank you for your suggestion. I have updated the code. Please help to review again

@yunwang0911 yunwang0911 changed the title [InPlacePodVerticalScaling] fix restore checkpoint bug: failed to verify pod status checkpoint checksum because of special json marshal func of the Quantity [InPlacePodVerticalScaling] fix restore checkpoint bug: failed to verify pod status checkpoint checksum because of different behaviors of func Quantity.Marshal and Quantity.Unmarshal Aug 11, 2024
@yunwang0911
Copy link
Contributor Author

@vinaykul @iholder101 @tallclair could you please take a look?

@k8s-ci-robot k8s-ci-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Oct 26, 2024
@k8s-ci-robot k8s-ci-robot removed the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Oct 28, 2024
@k8s-ci-robot k8s-ci-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Oct 28, 2024
// Checkpoint represents a structure to store pod resource allocation checkpoint data
type Checkpoint struct {
// Data is a JSON serialized checkpoint data
Data string `json:"data"`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any particular reason to use the type string rather than []byte?

Copy link
Contributor Author

@yunwang0911 yunwang0911 Oct 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No particular reason, just following existing code in dra checkpoint link. How do you think? Which is better?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[]byte seems more idiomatic, and makes the intent clearer. No strong preference though.

That said, a lot of this checkpoint code is identical to the DRA checkpoint, including this Checkpoint type. Should we just move all of this to the pkg/kubelet/checkpointmanager package?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That said, a lot of this checkpoint code is identical to the DRA checkpoint, including this Checkpoint type. Should we just move all of this to the pkg/kubelet/checkpointmanager package?

Could we separate this into a different task? Since there are many checkpoints, cpu, memory, dra, device and status, refactoring the code will impact not only InPlacePodVerticalScaling feature gate.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think? @tallclair

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, sounds good. Can you file an issue and/or leave a TODO?

yunwang0911 and others added 5 commits October 29, 2024 11:39
Co-authored-by: Tim Allclair <timallclair@gmail.com>
Co-authored-by: Tim Allclair <timallclair@gmail.com>
Co-authored-by: Tim Allclair <timallclair@gmail.com>
Co-authored-by: Tim Allclair <timallclair@gmail.com>
// Checkpoint represents a structure to store pod resource allocation checkpoint data
type Checkpoint struct {
// Data is a JSON serialized checkpoint data
Data string `json:"data"`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[]byte seems more idiomatic, and makes the intent clearer. No strong preference though.

That said, a lot of this checkpoint code is identical to the DRA checkpoint, including this Checkpoint type. Should we just move all of this to the pkg/kubelet/checkpointmanager package?

@tallclair
Copy link
Member

/lgtm
/approve

@k8s-ci-robot k8s-ci-robot added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Nov 1, 2024
@k8s-ci-robot
Copy link
Contributor

LGTM label has been added.

Git tree hash: 4c3f8b4864ddf73a20eb80f7fb2cf261597e2b9f

@k8s-ci-robot
Copy link
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: tallclair, yunwang0911

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@k8s-ci-robot k8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Nov 1, 2024
@k8s-ci-robot k8s-ci-robot merged commit 2c4a863 into kubernetes:master Nov 2, 2024
14 checks passed
@k8s-ci-robot k8s-ci-robot added this to the v1.32 milestone Nov 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. area/kubelet cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. kind/bug Categorizes issue or PR as related to a bug. lgtm "Looks good to me", indicates that a PR is ready to be merged. ok-to-test Indicates a non-member PR verified by an org member that is safe to test. priority/important-longterm Important over the long term, but may not be staffed and/or may need multiple releases to complete. release-note-action-required Denotes a PR that introduces potentially breaking changes that require user action. sig/node Categorizes an issue or PR as relevant to SIG Node. size/L Denotes a PR that changes 100-499 lines, ignoring generated files. triage/accepted Indicates an issue or PR is ready to be actively worked on.

7 participants