Dead sessions are reused with auto-reconnect off; frame-too-large rejection desynchronizes the connection

Open
#8 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
55/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
rust

Research direction

Trace Session::is_open(), the pool's acquire-side eviction loop, TFramedReadTransport, fetch_results, with_retry, and execute_query_raw. Start by reproducing or following the transport-failure path, then verify that failures mark the session broken, the pool evicts it, and auto-reconnect replaces it when enabled without adding retry behavior to fetch_results.

Written by the indexing model from the issue text.

Description

bug

Two related liveness/robustness issues:

  1. Session::is_open() is connection.is_some(), not socket state. With enable_auto_reconnect = false, a session whose connection died (silent peer, FIN lost, etc.) is reused indefinitely under load: the pool's acquire-side eviction loop (entry.session.is_open()) keeps handing it out, every RPC on it blocks or fails, and nothing ever discards it. A transport-level failure should mark the connection broken so is_open() turns false and the pool discards/replaces the session.
  2. Frame-too-large rejection desynchronizes the connection. TFramedReadTransport (thrift 0.23) rejects a frame above its default 16,384,000-byte cap before draining the body, leaving the connection desynchronized; fetch_results does not go through with_retry, so the desynchronized connection is then reused. Go and C# use the same cap, so the cap itself is not Rust-specific — the fix worth having is that a transport-level failure (including this one) marks the session broken, so the pool evicts it and auto-reconnect (when enabled) replaces it. (execute_query_raw deliberately excludes the result-set-pinned fetch_results from retry; see spec gotcha #13.)
Dominant language
Rust
Stars
1
Forks
0
PR merge metrics
No merged PRs in 30d

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from apache/iotdb-client-rust

All issues in apache/iotdb-client-rust

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.