yupix / MiPAC

Misskey Python API Core
https://mipac.akarinext.org/
MIT License
17 stars 4 forks source link

set_cache で KeyError が発生する場合がある #144

Closed yuma-m closed 2 months ago

yuma-m commented 2 months ago

Describe the bug

note.get_reactions を繰り返し実行した際に、set_cache 関数内で KeyError が発生する場合がありました。

Code snippets

以下のようなコードを定期的に繰り返し実行した際に発生します。

reactions = await client.note.action.fetch_reactions(note_id=note_id)

Traceback は以下の通りです。

Traceback (most recent call last):
  File "xxx.py", line XX, in _watch_recent_notes
    reactions = await self.client.note.action.get_reactions(note_id=note_id)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/xxx/.local/lib/python3.13/site-packages/mipac/actions/note.py", line 271, in get_reactions
    return await self._client.note.reaction.action.get_reactions(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        type=type, note_id=note_id, limit=limit, since_id=since_id, until_id=until_id
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/xxx/.local/lib/python3.13/site-packages/mipac/utils/cache.py", line 28, in wrapper
    set_cache(group, key, res)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/xxx/.local/lib/python3.13/site-packages/mipac/utils/cache.py", line 11, in set_cache
    del DEFAULT_CACHE_VALUE[key]
        ~~~~~~~~~~~~~~~~~~~^^^^^
KeyError: "mipac.actions.reaction.{0}<mipac.actions.reaction.ReactionActions object at 0xe9609ab63140>()[('limit', 10), ('note_id', 'xxx'), ('since_id', None), ('type', None), ('until_id', None)]"

To Reproduce

上記の通りです。

Expected behavior

KeyError が発生しないこと。

Correct behavior

cache.py の以下の処理にて、del DEFAULT_CACHE_VALUE[key]key が存在することが保証されていない可能性がありそうです。

https://github.com/yupix/MiPAC/blob/b6bd49e727e811fc1738adf1a15c26e6f0e707bd/mipac/utils/cache.py#L20-L22

    if len(DEFAULT_CACHE.get(group, [])) > 50:
        del DEFAULT_CACHE[group][-1]
        if key in DEFAULT_CACHE_VALUE:  # We may need this line...?
            del DEFAULT_CACHE_VALUE[key]

Screenshots

上記の Traceback の通りです。

Environment used:

ご確認いただけますと幸いです、どうぞよろしくお願いいたします。

yupix commented 2 months ago

ご報告ありがとうございます。

こちらで再現したのでコードを改めて確認したところコードの挙動自体が間違っていることに気づいたので後ほど修正して0.7.1としてリリースします。具体的なものは以下に記載しておきます。

現在の動作

  1. キー一覧から一番新しいキーを削除(本来は一番古いキーを削除する予定だった)
  2. キャッシュに設定する新しいキーを削除(キャッシュに登録する前に登録するキーを削除してしまっている)

想定されている動作

  1. キー一覧から一番古いキーを削除
  2. 1で削除したキーの値を DEFAULT_CACHE_VALUE からも削除
yupix commented 2 months ago

https://github.com/yupix/MiPAC/releases/tag/0.7.1 をリリースしました。 関連する不具合として https://github.com/yupix/MiPAC/issues/146 も同時に修正しています。

yuma-m commented 2 months ago

スピーディなご対応、どうもありがとうございます!