ClickHouse / ClickHouse/clickhouse-java

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

オープン
#2,675 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る
area:docs
主要言語
Java
スター
1.6k
フォーク
636
平均マージ
2日 23時間
マージ済み PR(30日)
29

説明

## 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

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

まず、リンクされた行にある client-v2/src/main/java/com/clickhouse/client/api/Client.java の retry ロジックを確認し、次に BufferedInputStream の例を使って失敗を再現します。retry 可能な insert に対して想定されている reset の動作を確認し、適切であれば失敗するストリームのケースのカバレッジを追加し、結果としての動作または制限事項が文書化されていることを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java
領域
api
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
48/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。