ClickHouse / ClickHouse/clickhouse-java
InputStream `reset()` can fail on retries for BufferedInputStreams
- Lingua principale
- Java
- Stelle
- 1.6k
- Fork
- 636
- Merge medio
- 2g 23h
- PR unite (30g)
- 29
Descrizione
## 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
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Inizia dalla logica dei retry in client-v2/src/main/java/com/clickhouse/client/api/Client.java alle righe collegate, quindi riproduci il fallimento utilizzando l’esempio BufferedInputStream. Determina il comportamento di reset previsto per gli insert ritentabili, aggiungi la copertura per il caso dello stream che fallisce se appropriato e assicurati che il comportamento risultante o la limitazione siano documentati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- java
- Ambito
- api
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 48/100