GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Keep the LRU order of `CallbackDataCache` when persisting it by waw666waw666 · Pull Request #5397 · python-telegram-bot/python-telegram-bot

Conversation

@waw666waw666

@waw666waw666 waw666waw666 commented Nov 2, 2026

Copy link
Copy Markdown

With arbitrary_callback_data and a persistence, the keyboards that are used the most can be the first ones evicted from CallbackDataCache, so their buttons start returning InvalidCallbackData.

persistence_data builds its list from self._keyboard_data.values(). For a cachetools.LRUCache, that goes through __getitem__ for every key, which marks each keyboard as just used, in insertion order. Application.update_persistence reads this property on every run, so after each run the LRU order is simply "oldest keyboard first", regardless of how recently it was pressed. The same order is used when loading the data after a restart.

cdc = CallbackDataCache(bot, maxsize=2)
menu = ...  # keyboard sent first, pressed regularly
old = ...   # keyboard sent later, never pressed again
# press a button of `menu`
cdc.persistence_data             # what update_persistence does
cdc.process_keyboard(new_markup)  # evicts `menu` instead of `old`

Changes proposed in this pull request:

  • Read the keyboards in persistence_data without updating the LRU order, and return them sorted by access_time (least recently used first).
  • Insert the keyboards sorted by access_time in load_persistence_data, so the order after a restart matches the one before (also for data stored by earlier versions).
  • Add a test that checks which keyboard is evicted after reading persistence_data, with and without reloading it.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@waw666waw666
Keep the LRU order of CallbackDataCache when persisting and loading it
8d743d5
Reading persistence_data went through LRUCache.__getitem__ for every
keyboard, which marked all keyboards as just used in insertion order.
Since Application.update_persistence reads it periodically, the most
used keyboards could become the first ones to be evicted. Loading the
data also inserted the keyboards in that order.

Read the keyboards without touching the LRU order, return them sorted
by access time and insert them in that order when loading.

This branch has not been deployed

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

Reviewers

No reviews

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

1 participant

@waw666waw666
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.