This repository was archived by the owner on Jun 11, 2025. It is now read-only.

Description
minimal repro i could come up with. Tested on python 3.11 (created via conda create -n deadlock python=3.11 anaconda)
run via: python main.py [sqlite3/libsql]
Versions:
(deadlock) mihai[deadlock]$ pip freeze | grep "Flask\|libsql"
Flask==3.0.2
Flask-Cors==4.0.0
libsql-client==0.3.1
import libsql_client
import os
import sys
import sqlite3
from flask.testing import FlaskClient
from flask import Flask, Response, current_app
def get_data() -> Response:
if isinstance(current_app.db, sqlite3.Connection):
data = current_app.db.execute("select item from data").fetchall()[0][0]
else:
data = current_app.db.execute("select item from data").rows[0][0]
return {"hello": data}, 200
def _setup_db(db_path: str):
os.remove(db_path)
client = libsql_client.create_client_sync(f"file:{db_path}")
client.execute("create table data (id integer primary key unique, item text)")
client.execute("insert into data(id, item) values(null, 'world')")
client.close()
def setup_app(db_path: str, engine: str) -> Flask:
assert engine in ("sqlite3", "libsql"), engine
app = Flask(__name__)
app.add_url_rule("/get_data", "get_data", view_func=get_data, methods=["GET"])
if engine == "sqlite3":
app.db = sqlite3.Connection(db_path)
else:
app.db = libsql_client.create_client_sync(f"file:{db_path}")
return app
if __name__ == "__main__":
_setup_db("test.db")
app = setup_app("test.db", sys.argv[1])
app.config.update({"TESTING": True})
flask_client: FlaskClient = app.test_client()
data = flask_client.get("get_data").json
assert data["hello"] == "world"
Upon ctrl+c:
^CException ignored in: <module 'threading' from '/home/mihai/libs/miniconda3/envs/deadlock/lib/python3.11/threading.py'>
Traceback (most recent call last):
File "/home/mihai/libs/miniconda3/envs/deadlock/lib/python3.11/threading.py", line 1590, in _shutdown
lock.acquire()
KeyboardInterrupt: