ClickHouse / ClickHouse/clickhouse-java
InputStream `reset()` can fail on retries for BufferedInputStreams
- Lenguaje dominante
- Java
- Estrellas
- 1.6k
- Forks
- 636
- Merge medio
- 2 d 23 h
- PR fusionados (30 d)
- 29
Descripción
## Description
The ClickHouse Java `Client` provides an `insert` method that takes an `InputStream`.
On failure, this method calls `data.reset()` https://github.com/ClickHouse/clickhouse-java/blob/f9f588d9d1b8abd8e7e8ab0eafc84b070377a68d/client-v2/src/main/java/com/clickhouse/client/api/Client.java#L1387-L1390
However, as far as I can tell, the code never sets a `mark`.
This works well on `ByteArrayInputStreams` (as is used in the unit tests), where `reset` will move the stream back to the beginning, but not one something like `BufferedInputStream`. In that case, even though `markSupported` is `true`, the mark needs to be defined.
This will also obviously fail on `InputStreams` like `GZIPInputStream` where `markSupported` is `false`, but that's to be expected.
I'm not sure if the client should set a mark, but I think it should at least mention that in the documentation.
### Steps to reproduce
Send an insert request that fails from a `BufferedInputStream`.
Note that this can simply be a `BufferedInputStream` wrapping a `ByteInputStream`.
### Error Log or Exception StackTrace
```java
Failed to reset stream before next attempt
Caused by: Exception java.io.IOException: Resetting to invalid mark
```
### Expected Behaviour
### Code Example
```java
jshell> var bais = new java.io.ByteArrayInputStream("1,2,3".getBytes())
bais ==> java.io.ByteArrayInputStream@3159c4b8
jshell> var buffered = new java.io.BufferedInputStream(bais)
buffered ==> java.io.BufferedInputStream@29ca901e
jshell> // both support marks
jshell> bais.markSupported()
$3 ==> true
jshell> buffered.markSupported()
$4 ==> true
jshell> // reset works on byte array input streams
jshell> bais.reset()
jshell> // but fails on the buffered version
jshell> buffered.reset()
| Exception java.io.IOException: Resetting to invalid mark
| at BufferedInputStream.implReset (BufferedInputStream.java:583)
| at BufferedInputStream.reset (BufferedInputStream.java:569)
| at (#6:1)
jshell> // it works as expected after setting the first mark
jshell> buffered.mark(1024)
jshell> buffered.reset()
```
### Configuration
#### Client Configuration
```java
```
#### Environment
* Client version: v0.9.4
* Language version: Java
Guía de contribución
Línea de trabajo
Comienza con la lógica de reintentos en client-v2/src/main/java/com/clickhouse/client/api/Client.java en las líneas enlazadas y, después, reproduce el fallo utilizando el ejemplo de BufferedInputStream. Determina el comportamiento de restablecimiento previsto para las inserciones reintentables, añade cobertura para el caso del stream que falla si corresponde y asegúrate de que se documente el comportamiento resultante o la limitación.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- java
- Área
- api
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 48/100