Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HH-208976 refactor master-worker pipes #691

Merged
1 commit merged into from
Mar 19, 2024
Merged

HH-208976 refactor master-worker pipes #691

1 commit merged into from
Mar 19, 2024

Conversation

712u3
Copy link
Contributor

@712u3 712u3 commented Mar 14, 2024

https://jira.hh.ru/browse/HH-208976

рефактор пайпов

  1. перестал использовать торнадовский PipeIOStream
  2. попытался все связанное с пайпами не выносить из process.py

@712u3 712u3 requested a review from a team as a code owner March 14, 2024 13:10
frontik/app.py Outdated
self.worker_state = WorkerState(init_workers_count_down, count_down_lock) # type: ignore
self.service_discovery = get_sync_service_discovery(self.statsd_client)
self.upstreams: dict[str, Upstream] = {}
self.upstream_manager: UpstreamManager
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

как-то всё выглядит неуютно в в кучу
почему не может быть один объект отвечающий за всю балансировку - UpstreamManager

сейчас upstreams, upstream_manager, upstream_caches, service_discovery - раз ты рефакторишь - почему этому всему не жить в UpstreamManager?

@@ -226,10 +229,12 @@ def next_request_id() -> str:
return FrontikApplication.request_id

def get_current_status(self) -> dict[str, str]:
if self.init_workers_count_down.value > 0:
not_started_workers = self.worker_state.init_workers_count_down.value
master_done = self.worker_state.master_done.value
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

видимо раньше это под слоустартом было спрятано (который нужен ли в питоне?)
суть что пока мастер не забрал апстримы из консула и не отдал воркерам мы не должны начинать принимать запросы

statsd_client: Union[StatsDClient, StatsDClientStub],
event_loop: Optional[BaseEventLoop] = None,
upstreams_lock: Optional[Lock],
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

хотел чтобы здесь вообще ничего из мультипроцессинга не было, но только так получилось

мы тут заряжаем консул коллбэки которые меняют upstreams
а в параллельном треде upstreams отправляются воркерам
и есть еще один тред который делает переотправку
соотв читать и изменять апстримы надо под локом

@712u3 712u3 force-pushed the HH-208976 branch 2 times, most recently from 9a9c3db to b9762bf Compare March 18, 2024 05:25
while True:
self._resend_notification.get()
time.sleep(1.0)
def update_upstreams(self, upstreams: list[Upstream]) -> None:
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут без лока
это для воркера функция реагирования на апдейт апстримов с мастера
перетащил из баланс клиента, там это не нужно

frontik/app.py Outdated
self.statsd_client: Union[StatsDClient, StatsDClientStub] = create_statsd_client(options, self)

init_workers_count_down = multiprocessing.Value('i', options.workers)
master_done = multiprocessing.Value('i', 0)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

master_done - не boolean-ом надо объявить?


def sigterm_handler(signum, frame):
if not state.server:
def sigterm_handler(signum, _frame):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sigterm_handler лучше назвать master_sigterm_handler, чтобы было ясно, что это не про воркер

app.upstream_manager.register_service()


def _worker_listener_handler(app: FrontikApplication, data: Any) -> None:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в data там реально Any прилетает или мб байты какие-то?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

list[Upstream]

) -> None:
while True:
resend_notification.get()
time.sleep(1.0)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

за что этот слип отвечает?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

хз) так предшественники сделали

с натяжкой вот такое объяснение могу дать
мастер пишет в пайп (чтоэто), воркер читает
у пайпа есть буффер некоторого размера
если воркер почемуто (затупил) и не читает, то буфер кончается
в мастере эксепшн случается про чето блокед и мы отмечаем вот эту resend движуху
если мы моментально ресенд сделаем то мы ничего не запишем тк воркер еще не разобрал буфер,
думаем видимо что через секунду он раздуплится

'headers': '',
'handler': handler,
})
request = Request({'type': 'http', 'query_string': '', 'headers': '', 'handler': handler})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а зачем все эти переделки? это автоформатер теперь такой? как будто возможность упралять правилами переноса за счет запятой в конец была полезной

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

реформаттер

можно попробовать поиграть настройками

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

хотя хз че крутить
мне нравится тема что если на одну строку влезает то пусть на одной строке будет

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

эт плохая тема имхо, бывает, что влезает, но но корректнее отдельной строкой
black вообще говоря специально позволял задавать самому переносы
https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#trailing-commas
https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#the-magic-trailing-comma

мб как-то split-on-trailing-comma=true выставить или типа того?

Copy link

hh-sonar bot commented Mar 19, 2024

SonarQube Quality Gate

Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

No Coverage information No Coverage information
No Duplication information No Duplication information

@hhrelease hhrelease closed this pull request by merging all changes into master in 0a4eb10 Mar 19, 2024
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.

3 participants