ClickHouse / ClickHouse/clickhouse-java

InputStream `reset()` can fail on retries for BufferedInputStreams

Aperta
#2,675 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
area:docs
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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.