Validate command in st.cache_resources did not working as expected

Summary

Hi guys, after im reading st.cache_resources docs, there is a validate parameter that checking the health of cached data. In my case, im checking for database connection health after calling client.close(), but it seem it wont recall the function in st.cache_resourses after returning False. If anything wrong I think its the validate function itself. Appreciate for any help, thanks

Steps to reproduce

Code snippet:

from pymongo import MongoClient, errors
import settings
import streamlit as st

# Assume cache here is client cached data
def validate_connect(cache): 
    try:
        print('Doing')
        cache.server_info()
    except errors.InvalidOperation:
        print('Connection already close')
        return False
    return True

@st.cache_resource(validate = validate_connect)
def init_connect():
    return MongoClient(f"<connection_string>")

client = init_connect()

# Close the connection
client.close()

# Auto connect back if validate_connect return False
st.write(client.server_info())

Expected behavior:

Write client info at streamlit homepage

Actual behavior:

Got pymongo error, here is error log:

Doing
Connection already close
2023-07-06 12:01:00.045 Uncaught app exception
Traceback (most recent call last):
 File "e:\Python Projects\FaceRecogApp\.venv\lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py", line 552, in _run_script
   exec(code, module.__dict__)
 File "E:\Python Projects\FaceRecogApp\test.py", line 24, in <module>
   st.write(client.server_info())
 File "e:\Python Projects\FaceRecogApp\.venv\lib\site-packages\pymongo\mongo_client.py", line 1805, in server_info
   self.admin.command(
 File "e:\Python Projects\FaceRecogApp\.venv\lib\site-packages\pymongo\_csot.py", line 105, in csot_wrapper
   return func(self, *args, **kwargs)
 File "e:\Python Projects\FaceRecogApp\.venv\lib\site-packages\pymongo\database.py", line 805, in command
   with self.__client._socket_for_reads(read_preference, session) as (
 File "e:\Python Projects\FaceRecogApp\.venv\lib\site-packages\pymongo\mongo_client.py", line 1295, in _socket_for_reads
   _ = self._get_topology()
 File "e:\Python Projects\FaceRecogApp\.venv\lib\site-packages\pymongo\mongo_client.py", line 1203, in _get_topology
   self._topology.open()
 File "e:\Python Projects\FaceRecogApp\.venv\lib\site-packages\pymongo\topology.py", line 192, in open
   self._ensure_opened()
 File "e:\Python Projects\FaceRecogApp\.venv\lib\site-packages\pymongo\topology.py", line 592, in _ensure_opened
   raise InvalidOperation("Cannot use MongoClient after close")
pymongo.errors.InvalidOperation: Cannot use MongoClient after close

Debug info

  • Streamlit version: 1.23.1
  • Python version: 3.9.1