taproot-assets
taproot-assets copied to clipboard
[feature]: add sqlite database integrity checks to aid troubleshooting
A user on Slack encountered a SQLite database foreign key constraint violation error when starting tapd. To address this, it's proposed that tapd should optionally perform SQLite database integrity checks during startup. This enhancement will be controlled by a new command line argument flag.
Proposed Changes
-
Modify the
sql.Opencall in the functionNewSqliteStoreto include debug/integrity check pragma options. This function is instantiated at startup in thetapcfg/server.gofile (source). -
Implement SQLite "pragma" options for integrity checks. Relevant options are foreign_key_check and integrity_check. These two checks do not seem to overlap and can be included for comprehensive validation.
-
Introduce a command line argument flag to control the execution of these checks, as they may significantly slow down
tapdstartup.
A list of SQLite "pragma" options can be found here.
Was this due to a partially botched migration? We already have the pragama to enforce the foreign key constraints. Did they try to manually modify the db?
@Roasbeef
Was this due to a partially botched migration? We already have the pragama to enforce the foreign key constraints.
I'm not sure. Possibly. This is why I think it would be good to have a user side check that the user could run.
Is this feature a good idea? (cc @GeorgeTsagk @jharveyb @guggero )
Did they try to manually modify the db?
No, I don't think so.
Here's the related slack thread: https://lightningcommunity.slack.com/archives/C03B3556HQ8/p1704690702094769
The user has performed a foreign key check on the db directly using a db tool. The check passed successfully. Which suggests that the db is not faulty but that tapd is running a query at startup which violates a foreign key constraint. I've asked the user to re-run with trace level logging to see if we can identify which query is broken, if any.
I think this issue would still be useful for troubleshooting user bugs. It's extra debug tooling on the user's side.