Skip to content

fix: race condition в LazyRef.fetch() и __bool__ для pending ref#102

Closed
bish-x wants to merge 0 commit intolove-apples:feat/fetch-without-auto-requestsfrom
bish-x:fix/pr101-lazy-ref-fixes
Closed

fix: race condition в LazyRef.fetch() и __bool__ для pending ref#102
bish-x wants to merge 0 commit intolove-apples:feat/fetch-without-auto-requestsfrom
bish-x:fix/pr101-lazy-ref-fixes

Conversation

@bish-x
Copy link
Copy Markdown
Contributor

@bish-x bish-x commented Apr 9, 2026

Описание

Два исправления для механизма lazy ref из PR #101.

1. Race condition в LazyRef.fetch()

При параллельных вызовах fetch() (например, asyncio.gather(event.fetch_chat(), event.fetch_from_user())) оба вызова видели _resolved is _UNSET и оба выполняли API-запрос. Результат — дублирование запросов и двойной вызов setter.

Добавлен asyncio.Lock для сериализации — первый вызов загружает и кеширует, остальные получают кешированный результат.

2. __bool__ для pending LazyRef

Ранее bool(pending_ref) возвращал False. Это приводило к тому, что паттерн из документации не работал:

# Не работало: event.chat — это ChatRef, bool = False
chat = await event.chat.fetch() if event.chat else None

Теперь pending ref = True (ref существует, данные доступны через fetch()). После resolve: bool(resolved_value).

Тесты

Добавлен tests/test_fetchable.py — 11 тестов:

  • Однократный вызов fetcher при повторном fetch
  • Параллельные fetch не дублируют запрос (asyncio.gather)
  • Retry после ошибки fetcher
  • __bool__ для pending / resolved None / resolved value
  • __getattr__ proxy и AttributeError до fetch
  • __repr__ для pending и resolved

Все существующие тесты проходят без изменений.

@bish-x bish-x closed this Apr 9, 2026
@bish-x bish-x force-pushed the fix/pr101-lazy-ref-fixes branch from 8ee6b36 to 2ed5651 Compare April 9, 2026 08:45
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