Skip to content

fix(plugins): cài SDK từ bản chép riêng để hai plugin cấp phát song song không giẫm build/ - #121

Merged
phanlemanh merged 4 commits into
mainfrom
fix/cai-sdk-song-song
Sep 17, 2026
Merged

phanlemanh merged 4 commits into
mainfrom
fix/cai-sdk-song-song

Conversation

@phanlemanh

Copy link
Copy Markdown
Owner

Summary

Sửa lỗi cấp phát môi trường Python khi hai plugin được cấp phát cùng lúc: bước cài SDK của một plugin thất bại.

error: [Errno 17] File exists: 'build/bdist.macosx-26.0-arm64/wheel/oneflow_sdk-0.2.23.dist-info'
ERROR: Failed building wheel for oneflow-sdk

Nguyên nhân: mọi venv chạy pip install --upgrade <resources/sdk> trên cùng một cây nguồn, và setuptools dựng wheel ngay trong cây đó (build/bdist.*, *.egg-info). Chuỗi tuần tự hoá theo từng plugin id cho phép hai plugin cài song song, nên hai lượt giẫm lên build/ của nhau. Lỗi có sẵn trên main và làm E4 của hồ sơ local-cpu-plugins đỏ 2/2.

Bản sửa (plugin-python-env.server.ts): mỗi lượt cài chép nguồn SDK (~1 MB) sang một thư mục tạm riêng, cài từ bản chép, rồi xoá.

  • Bản chép bỏ build/, dist/, *.egg-info, .venv và các thư mục cache ở gốc; __pycache__ bị bỏ ở mọi cấp.
  • Chỉ chép khi venv chưa có SDK đúng bản.
  • Lỗi khi dọn thư mục tạm chỉ ghi log, không làm hỏng một lượt cài đã thành công.

Vì sao không chọn hai hướng kia:

  • Khoá trong tiến trình: không chặn được tiến trình khác. Engine headless (sdk/tongflow/engine/plugins.py) cài từ cùng checkout, và dev server có thể chạy nhiều worker.
  • Dựng một wheel chung rồi cài: vẫn phải dựng ở đâu đó, tức vẫn va nhau, lại thêm khoá giữa các tiến trình và một cache phải vô hiệu hoá.

Không chạm sdk/** (E5 của local-cpu-plugins giữ xanh).

Giới hạn còn lại: hai tiến trình engine headless chạy đồng thời vẫn có thể va nhau trong SDK_ROOT. Sửa phía đó là thay đổi sdk/** (T3), nằm ngoài PR này.

Type of change

  • Bug fix
  • New feature
  • Documentation
  • Refactor / chore (sửa thước đo E4, ghim lại hồ sơ)
  • Other (describe)

Checklist

  • I agree my contribution is licensed under AGPL-3.0
  • My branch is up to date with main
  • pnpm typecheck passes
  • pnpm lint (or pnpm lint:check) passes where applicable
  • I have not committed secrets or .env files

pnpm test (971 test) và pnpm build cũng xanh. Không chạm sdk/ nên không chạy pytest.

Notes for reviewers

Đo đỏ trước, xanh sau

  • Test mới «parallel provisioning» trong plugin-python-env.test.ts dùng một python giả chiếm <src>/build bằng mkdir, đúng như setuptools làm.
    • Trên mã cũ, test đỏ lần nào cũng như lần nào (resources/sdk/build: File exists).
    • Sau khi sửa, test xanh.
    • Test có đối chứng dương rằng hai lượt cài thật sự chạy chồng thời gian.
    • Bỏ qua trên Windows vì python giả là script sh.
  • E4 (scripts/plugins/check-venv-isolation.sh): đỏ 2/2 trên mã cũ, xanh 3/3 sau khi sửa. Không nới điều E4 đo.

Sửa thước (commit riêng af00e47, check-venv-isolation.ts): script vẫn đo đúng điều cũ; chỉ sửa cách nó dọn dẹp và báo lỗi.

  • fail() gọi rmSync(work) trong lúc pip con của plugin kia còn ghi, nên văng ENOTEMPTY, và stack trace đó che mất dòng FAIL thật. Giờ dọn dẹp không văng lỗi, và dòng FAIL in sau cùng.
  • Promise.all đổi sang Promise.allSettled: script đợi cả hai lượt cài xong rồi báo mọi lỗi.
  • Chạy trên mã cũ: dòng FAIL và [Errno 17] đều hiện, 0 lần ENOTEMPTY.

Hồ sơ nghiệm thu

  • Owner quyết gắn bản sửa vào hồ sơ đã ký local-cpu-plugins, không mở hồ sơ mới: kế hoạch đang băng, guard F1 chặn hồ sơ ngoài kế hoạch.
  • Bản sửa chạm src/lib/plugins/, nằm trong phạm vi của hai hồ sơ T3 conformance-l0hai-duong-chay-mot-venv. Bằng chứng của hai hồ sơ đó vì vậy cũ đi, làm E20 của local-cpu-plugins đỏ.
  • Owner cho ghim hai hồ sơ T3 trước, local-cpu-plugins sau. Cả hai làn đều chạy bằng repin-lane.mjs --write, không viết tay dòng repin:
    • 5778124: 9/9 lệnh suite exit 0; conformance-l0 xanh 15/15 eval, hai-duong-chay-mot-venv xanh 16/16; recheck-evidence xanh.
    • f963f1b: local-cpu-plugins xanh 25/25 eval máy, gồm E4 và E20; recheck-evidence xanh.
  • pnpm plan:check không báo vi phạm (★ 5/16 · 30% · còn băng).

🤖 Generated with Claude Code

phanlemanh and others added 4 commits September 17, 2026 07:39
…ong không giẫm build/

setuptools dựng wheel ngay trong cây nguồn pip được giao
(<src>/build/bdist.*, <src>/*.egg-info). Mọi venv cài từ cùng một
resources/sdk, nên hai plugin cấp phát cùng lúc (chuỗi tuần tự hoá theo
từng id cho phép điều đó) va nhau:
"[Errno 17] File exists: 'build/bdist.../wheel/oneflow_sdk-0.2.23.dist-info'".
Lỗi có sẵn trên main; E4 của local-cpu-plugins đỏ 2/2.

Hướng chọn: mỗi lượt cài chép nguồn SDK sang một thư mục tạm riêng
(bỏ build/, dist/, *.egg-info, .venv, cache ở gốc; __pycache__ mọi cấp),
cài từ đó, rồi xoá. Vì sao không chọn hai hướng kia:
- khoá trong tiến trình không che được người ghi thứ hai ở tiến trình
  khác: engine headless (sdk/tongflow/engine/plugins.py) cài từ cùng
  checkout, và dev server có thể chạy nhiều worker;
- dựng một wheel chung trước vẫn cần chỗ dựng, tức vẫn là cuộc đua đó,
  cộng thêm khoá liên tiến trình và cache phải vô hiệu hoá.
Bản chép đúng qua ranh giới tiến trình mà không cần phối hợp, và cây
chung không còn bị ghi. Giá: chép ~1 MB, chỉ khi trượt cache. Không chạm
sdk/** (E5 giữ xanh).

Giới hạn còn lại: hai tiến trình engine headless chạy đồng thời vẫn có
thể va nhau trong SDK_ROOT; sửa phía đó là thay đổi sdk/** (T3).

Chiều đỏ trước: test mới "parallel provisioning" dùng một python giả
chiếm <src>/build bằng mkdir, đỏ tất định trên mã cũ
("resources/sdk/build: File exists"), xanh sau khi sửa; có đối chứng
dương rằng hai lượt cài thật sự chồng thời gian.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Đây là sửa THƯỚC, không đổi điều E4 đo: vẫn hai plugin ghim hai bản six
khác nhau, cấp phát đồng thời, mỗi bên phải ra đúng bản của mình, và phản
chứng venv chung vẫn phải mất một pin.

- fail() gọi rmSync(work) khi pip con của plugin kia còn ghi trong work,
  văng ENOTEMPTY; stack trace đó in đè sau dòng FAIL thật. Giờ dọn dẹp
  không bao giờ văng (chỉ in một dòng note), và FAIL in cuối cùng.
- Promise.all từ chối ngay ở lỗi đầu tiên trong khi pip bên kia còn chạy,
  nên lỗi thứ hai không bao giờ được báo. Đổi sang Promise.allSettled:
  đợi cả hai xong, báo mọi lỗi cấp phát.

Kiểm trên mã sản xuất cũ: đỏ 2/2, dòng FAIL và "[Errno 17] File exists"
đều hiện, 0 lần ENOTEMPTY. Trên mã đã sửa: xanh 3/3.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bản sửa cài SDK song song chạm src/lib/plugins/plugin-python-env.*, nằm
trong phạm vi của hai hồ sơ T3 này, nên bằng chứng của chúng cũ đi và E20
của local-cpu-plugins (check-resign-wave) đỏ. Owner cho ghim hai hồ sơ này
trước, local-cpu-plugins sau.

Làn repin-lane --write tại af00e47: suite 9/9 exit 0; conformance-l0 15/15
eval, hai-duong-chay-mot-venv 16/16 eval; recheck-evidence xanh cả hai.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…DK song song

Thay pin suite-only bằng pin có evals_exit. Làn repin-lane --write tại
5778124: suite 9/9 exit 0; 25/25 eval máy xanh, trong đó E4 (hai plugin
ghim hai bản six cấp phát đồng thời) và E20 (không hồ sơ nào khác mang
bằng chứng cũ) xanh; recheck-evidence xanh.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@phanlemanh
phanlemanh merged commit db7587c into main Sep 17, 2026
5 of 6 checks passed
phanlemanh added a commit that referenced this pull request Sep 17, 2026
…tem-v1): re-pin after rebase onto main with #121

run_id repin-20260917T010205Z-49608, 59 machine evals + 9 suites green at ea7f898.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@phanlemanh
phanlemanh deleted the fix/cai-sdk-song-song branch September 17, 2026 01:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant