Library: preserve concurrent changes during conditional save and move

オープン
#480 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
5/5
見積もり時間
1週間以上
初心者へのやさしさ
25/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
活発
技術スタック
rust

調査の方向性

Read elastos/crates/elastos-server/src/library.rs around the conditional write (develop line 3704) and move path (line 6630), plus api/gateway_provider_proxy.rs around lines 439–448 and 802–811. Start by tracing how revision checks and mutation ownership work across the Library and object-provider processes. Done means deterministic conflict tests cover concurrent writes, move/upload, and copy/destination creation, with acknowledged data preserved and destination failures leaving the source intact; the issue also calls for installed Mac and Linux checks and independent review.

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

説明

User impact

A Library operation can overwrite a newer save or remove newer source bytes while reporting success. This is a proposed 0.8.0 release-blocking data-integrity finding from the systematic review in #93. Source review confirms the race; installed reproduction and its frequency remain unmeasured.

Source evidence

Checked on fetched develop 3beb816438fd567145a8d725e22465bd83277cf0 and local release candidate 460b1888d344f52cebd1c25866be88ff4085f035. Two independent reviewers and the lead checked the call path.

  • In published develop, Library conditional write checks the expected revision before calling the unconditional protected-object writer at line 3718. Candidate equivalents are library.rs:3774,3789.
  • The protected-object writer acquires its mutation lock after that check. Two callers can both accept revision R and then both save, so one acknowledged change is lost.
  • Candidate library.rs:7194-7206 reads a source, writes the destination, then removes the source. An upload between the read and removal can be acknowledged and then lost. The develop equivalent starts at line 6630.
  • Ordinary object-provider messages are serial, but gateway raw upload and chunk completion call the Library write path directly (api/gateway_provider_proxy.rs:439-448,802-811). That path can overlap the separate object-provider process. The auth mutation mutex is process-local.
  • Documents already holds a mutation guard across its revision check and write. Library needs one ownership boundary that also covers its gateway/provider split.

Smallest repair and proof

Keep user-visible operation semantics. Make revision validation and commit one operation. Give move/copy explicit source and destination ownership, and preserve a newer source version if another writer changes it. A lock confined to only one process is insufficient for the current paths.

  • A deterministic write/write test admits only one request using the same old revision; the other receives a conflict.
  • Move/upload and copy/destination-create tests preserve all acknowledged data and report a clear conflict.
  • Destination failure leaves the original source intact.
  • Exercise gateway upload together with the external object-provider path.
  • Installed Mac and Linux checks cover two concurrent clients and restart/recovery.
  • Independent review and exact-candidate acceptance are recorded before closure.

Deduplication: #450 covers opening/lazy protection, #445 listing, #449 extraction, and PR #428 UI behavior. This issue owns mutation atomicity. Searches of open and closed issues found no matching owner. This issue is queued for release triage; the audit started no implementation work.

主要言語
Rust
スター
6
フォーク
2
平均マージ
1日 3時間
マージ済み PR(30日)
42

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

elastos/elastos-runtime のほかの issue

elastos/elastos-runtime の issue をすべて見る

似ている issue

Rust の issue をもっと見る

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

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