Skip to content

ApiClient cannot deserialize responses larger than 2GB #4020

Open
@klin1344

Description

@klin1344

Describe the bug
The ApiClient cannot handle responses larger than 2GB.

Client Version
22.0.1-legacy is what we're currently using, but this issue occurs in all versions

Kubernetes Version
1.30.9

Java Version
Java 21

To Reproduce

  1. Set up a SharedIndexInformer for a resource in a cluster where the total size of all resources > 2GB.
  2. The initial list() in the ReflectorRunnable will fail with:
class io.kubernetes.client.openapi.models.V1Pod#Reflector loop failed unexpectedly

java.lang.IllegalArgumentException: byteCount: 2293832235
  at okio.Buffer.readString(Buffer.kt:306)
  at okio.Buffer.readString(Buffer.kt:302)
  at okio.RealBufferedSource.readString(RealBufferedSource.kt:96)
  at okhttp3.ResponseBody.string(ResponseBody.kt:187)
  at io.kubernetes.client.openapi.ApiClient.deserialize(ApiClient.java:758)
  at io.kubernetes.client.openapi.ApiClient.handleResponse(ApiClient.java:978)
  at io.kubernetes.client.openapi.ApiClient.execute(ApiClient.java:905)
  at io.kubernetes.client.informer.SharedInformerFactory$1.list(SharedInformerFactory.java:271)
  at io.kubernetes.client.informer.cache.ReflectorRunnable.run(ReflectorRunnable.java:91)
  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
  at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358)
  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
  at java.lang.Thread.run(Thread.java:1583)

Expected behavior
The ApiClient can deserialize responses greater than 2GB.

Additional context
This issue occurs because the response body is converted to a String here in the ApiClient, which hits this validation in okhttp:

require(byteCount >= 0 && byteCount <= Integer.MAX_VALUE) { "byteCount: $byteCount" }

because of Java's String max length limit of Integer.MAX_VALUE which is 2^31 - 1.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions