-
Notifications
You must be signed in to change notification settings - Fork 219
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: implement multiple read single write for sqlite #3568
feat: implement multiple read single write for sqlite #3568
Conversation
- Implemented a system-wide diesel sqlite pool connection manager that uses the modern Write-ahead Log (WAL) SQLite3 database mode to speed up database operations. See https://www.sqlite.org/wal.html. - Implemented this for use by the Wallet's database connection.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Very nice, looks good to me.
let mut pool = SqliteConnectionPool::new(db_path.clone(), 1, true, true, Duration::from_secs(60)); | ||
pool.create_pool() | ||
.unwrap_or_else(|_| panic!("Error connecting to {}", db_path)); | ||
// Note: For this test the connection pool is setup with a pool size of one; the pooled connection must go out |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: this is fine, just a note that you could explicitly drop() the pool rather than using a {} scope which I think is a bit more explicit and easy to use.
* development: feat: implement multiple read single write for sqlite (tari-project#3568)
* development: (32 commits) feat: add atomic swap refund transaction handling (tari-project#3573) feat: improve wallet connectivity status for console wallet (tari-project#3577) v0.21.1 feat: add error codes to LibWallet for CipherSeed errors (tari-project#3578) ci: split cucumber job into two (tari-project#3583) feat(wallet): import utxo’s as EncumberedToBeReceived rather than Unspent (tari-project#3575) docs: rfc 0250_Covenants (tari-project#3574) feat: get fee for transactions for stratum transcoder (tari-project#3571) test: make monerod stagenet usage resilient (tari-project#3572) feat: add atomic swap htlc sending and claiming (tari-project#3552) feat: implement prometheus metrics for base node (tari-project#3563) feat: implement multiple read single write for sqlite (tari-project#3568) feat: trigger time lock balance update when block received (tari-project#3567) test: reduce cucumber ci to critical only (tari-project#3566) test: fix cucumber console wallet startup (tari-project#3564) chore: add node id/public key to log mdc (tari-project#3559) fix: avoid implicit using of the time crate (tari-project#3562) feat: one-click installer - cli edition (tari-project#3534) ci: add workflow dispatch to libwallet build action (tari-project#3556) fix: stop leak of value of recovered output (tari-project#3558) ...
Description
WAL
NORMAL
| 2 | FULL
1000
(the default)Motivation and Context
The wallet's database connection was not optimal.
How Has This Been Tested?
npm test -- --tags "not @long-running and not @broken"
)make-it-rain
transactions from one sender to two receiving wallets of 250 transactions each)The graphs below show the SQLite WAL mode profiling for the above two tests (sender wallet only) with a pool size of 16 for all read and write database operations where the total time (acquire lock time + db operation time) was larger than 1ms. The wallet in question had a communications breakdown to its connected base node for a while after all transactions were completed and when it eventually gained an RPC connection validation protocols for all 500 transactions queried the base node as fast as possible, which panned out in some of those protocols waiting for a pooled connection. The actual time db operations will wait for a write operation to conclude is managed by SQLite and bunched within the
db op time
measurement.