Skip to content

[MISC] odoo/service: scale up by one worker when all workers are busy, the total number of workers is limited to 1.5x#1207

Open
royle-vietnam wants to merge 1 commit into
Viindoo:17.0from
royle-vietnam:v17_misc_odoo_service
Open

[MISC] odoo/service: scale up by one worker when all workers are busy, the total number of workers is limited to 1.5x#1207
royle-vietnam wants to merge 1 commit into
Viindoo:17.0from
royle-vietnam:v17_misc_odoo_service

Conversation

@royle-vietnam
Copy link
Copy Markdown
Collaborator

Hiện trạng:

  • Hết worker nếu thao tác gì đó lâu

Giải pháp:

  • Mỗi lần thực hiện request sẽ đánh dấu worker đó bận, thực hiện xong thì đánh dấu hết bận. Nếu tất cả worker bận thì cho phép tăng thêm 1 worker mỗi lần. Số lượng worker tăng thêm không quá 1.5x so với cấu hình ban đầu
    Ví dụ cấu hình là 8 worker, thì chỉ được tăng tối đa thêm 4 worker

Mặc định cấu hình 8 worker là Odoo đã tạo cả 8 worker rồi, nên chỉ khi 8 worker đều bận thì mới tăng thêm

TODOs:

  • Đóng worker đã tăng thêm khi số lượng worker nhàn dỗi nhỏ hơn số lượng worker đã cấu hình, ví dụ cấu hình 8, tăng thêm 4, lúc rảnh có thể đóng bớt 4 đi để quay về cấu hình ban đầu <= chưa tìm ra giải pháp, nhưng hiện tại cứ restart hoặc đêm restart thì sẽ quay về số worker ban đầu

I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr

the total number of workers is limited to 1.5x
@viinbot viinbot added 🚀 Running PR/Commit is done for everything and ready for manually test and removed 🚀 Building labels Mar 13, 2026
@viinbot
Copy link
Copy Markdown

viinbot commented Mar 13, 2026

@royle-vietnam Viindoo Test Suite has passed!

@davidtranhp
Copy link
Copy Markdown

davidtranhp commented May 16, 2026

Code review

Phát hiện 1 vấn đề:

  1. Bộ đếm WORKER_BUSY bị rò rỉ trên nhánh exception. Lệnh giảm WORKER_BUSY.value -= 1 được đặt bên trong khối try, ngay sau lời gọi self.server.process_request(client, addr). Do đó khi lời gọi này raise bất kỳ exception nào — bao gồm cả IOError(EPIPE) đang được nuốt im lặng (trường hợp phổ biến khi HTTP client đóng socket sớm) hoặc bất kỳ exception non-EPIPE nào — dòng giảm sẽ bị bỏ qua và bộ đếm sẽ tăng vĩnh viễn. Theo thời gian, điều này vừa làm hỏng điều kiện scale-up mới (so sánh len(self.workers_http) == WORKER_BUSY.value sẽ không bao giờ khớp được nữa), vừa khiến giá trị busy= trong log bị sai lệch. Đề xuất sửa: bọc lời gọi process_request trong try/finally để đảm bảo lệnh giảm luôn được thực thi.

odoo/odoo/service/server.py

Lines 1225 to 1238 in cfee031

self.server.socket = client
# tolerate broken pipe when the http client closes the socket before
# receiving the full reply
try:
with WORKER_BUSY.get_lock():
WORKER_BUSY.value += 1
self.server.process_request(client, addr)
with WORKER_BUSY.get_lock():
WORKER_BUSY.value -= 1
except IOError as e:
if e.errno != errno.EPIPE:
raise
self.request_count += 1

🤖 Được tạo bởi Claude Code

- Nếu review này hữu ích, hãy react 👍. Nếu không, hãy react 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

R&D 🚀 Running PR/Commit is done for everything and ready for manually test

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants