Plan
Plan copied to clipboard
Reduce amount of extension metadata transactions
I would like to be able to..
Improve write performance by reducing queue size from extension metadata storage transactions.
Is your feature request related to a problem? Please describe.
The amount of writes shows up as deadlocks since the metadata table is accessed frequently
458edd978b - Last occurred: 2022-11-27 Occurrences: 6
---- Context 5 ----
Plan v5.5 build 1969
Velocity 3.1.2-SNAPSHOT (git-213f3f88-b183)
Server v3.1.2-SNAPSHOT (git-213f3f88-b183)
Transaction: class com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction
DB State: OPEN - fatal: false
Error code: 1213
UPDATE plan_extension_providers SET text=?,description=?,priority=?,condition_name=?,icon_id=?,tab_id=(SELECT id FROM plan_extension_tabs WHERE name=? AND plugin_id=(SELECT id FROM plan_extension_plugins WHERE name=? AND server_uuid=? LIMIT 1) LIMIT 1),show_in_players_table=?,hidden=?,provided_condition=?,format_type=?,player_name=? WHERE plugin_id=(SELECT id FROM plan_extension_plugins WHERE name=? AND server_uuid=? LIMIT 1) AND name=?
Deadlock
---- Context 4 ----
Plan v5.5 build 1969
Velocity 3.1.2-SNAPSHOT (git-213f3f88-b183)
Server v3.1.2-SNAPSHOT (git-213f3f88-b183)
Transaction: class com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction
DB State: OPEN - fatal: false
Error code: 1213
UPDATE plan_extension_providers SET text=?,description=?,priority=?,condition_name=?,icon_id=?,tab_id=(SELECT id FROM plan_extension_tabs WHERE name=? AND plugin_id=(SELECT id FROM plan_extension_plugins WHERE name=? AND server_uuid=? LIMIT 1) LIMIT 1),show_in_players_table=?,hidden=?,provided_condition=?,format_type=?,player_name=? WHERE plugin_id=(SELECT id FROM plan_extension_plugins WHERE name=? AND server_uuid=? LIMIT 1) AND name=?
Deadlock
---- Context 3 ----
Plan v5.5 build 1969
Velocity 3.1.2-SNAPSHOT (git-213f3f88-b183)
Server v3.1.2-SNAPSHOT (git-213f3f88-b183)
Transaction: class com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction
DB State: OPEN - fatal: false
Error code: 1213
UPDATE plan_extension_providers SET text=?,description=?,priority=?,condition_name=?,icon_id=?,tab_id=(SELECT id FROM plan_extension_tabs WHERE name=? AND plugin_id=(SELECT id FROM plan_extension_plugins WHERE name=? AND server_uuid=? LIMIT 1) LIMIT 1),show_in_players_table=?,hidden=?,provided_condition=?,format_type=?,player_name=? WHERE plugin_id=(SELECT id FROM plan_extension_plugins WHERE name=? AND server_uuid=? LIMIT 1) AND name=?
Deadlock
---- Context 2 ----
Plan v5.5 build 1969
Velocity 3.1.2-SNAPSHOT (git-213f3f88-b183)
Server v3.1.2-SNAPSHOT (git-213f3f88-b183)
Transaction: class com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction
DB State: OPEN - fatal: false
Error code: 1213
UPDATE plan_extension_providers SET text=?,description=?,priority=?,condition_name=?,icon_id=?,tab_id=(SELECT id FROM plan_extension_tabs WHERE name=? AND plugin_id=(SELECT id FROM plan_extension_plugins WHERE name=? AND server_uuid=? LIMIT 1) LIMIT 1),show_in_players_table=?,hidden=?,provided_condition=?,format_type=?,player_name=? WHERE plugin_id=(SELECT id FROM plan_extension_plugins WHERE name=? AND server_uuid=? LIMIT 1) AND name=?
Deadlock
---- Context 1 ----
Plan v5.5 build 1969
Velocity 3.1.2-SNAPSHOT (git-213f3f88-b183)
Server v3.1.2-SNAPSHOT (git-213f3f88-b183)
Transaction: class com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction
DB State: OPEN - fatal: false
Error code: 1213
UPDATE plan_extension_providers SET text=?,description=?,priority=?,condition_name=?,icon_id=?,tab_id=(SELECT id FROM plan_extension_tabs WHERE name=? AND plugin_id=(SELECT id FROM plan_extension_plugins WHERE name=? AND server_uuid=? LIMIT 1) LIMIT 1),show_in_players_table=?,hidden=?,provided_condition=?,format_type=?,player_name=? WHERE plugin_id=(SELECT id FROM plan_extension_plugins WHERE name=? AND server_uuid=? LIMIT 1) AND name=?
Deadlock
---- Stacktrace ----
java.util.concurrent.CompletionException: com.djrapitops.plan.exceptions.database.DBOpException: SQL Failure: Deadlock found when trying to get lock; try restarting transaction
java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315)
java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:320)
java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1770)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
java.base/java.lang.Thread.run(Thread.java:833)
Caused by:
com.djrapitops.plan.exceptions.database.DBOpException: SQL Failure: Deadlock found when trying to get lock; try restarting transaction
com.djrapitops.plan.exceptions.database.DBOpException.forCause(DBOpException.java:152)
com.djrapitops.plan.storage.database.transactions.ExecStatement.execute(ExecStatement.java:57)
com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction.lambda$storeProvider$0(StoreProviderTransaction.java:69)
com.djrapitops.plan.storage.database.transactions.Transaction.execute(Transaction.java:214)
com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction.performOperations(StoreProviderTransaction.java:64)
com.djrapitops.plan.storage.database.transactions.Transaction.executeTransaction(Transaction.java:89)
com.djrapitops.plan.storage.database.SQLDB.lambda$executeTransaction$3(SQLDB.java:346)
java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
java.base/java.lang.Thread.run(Thread.java:833)
Caused by:
com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:123)
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092)
com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040)
com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1347)
com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025)
plan.com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
plan.com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
com.djrapitops.plan.storage.database.transactions.ExecStatement.callExecute(ExecStatement.java:70)
com.djrapitops.plan.storage.database.transactions.ExecStatement.execute(ExecStatement.java:64)
com.djrapitops.plan.storage.database.transactions.ExecStatement.execute(ExecStatement.java:55)
com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction.lambda$storeProvider$0(StoreProviderTransaction.java:69)
com.djrapitops.plan.storage.database.transactions.Transaction.execute(Transaction.java:214)
com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreProviderTransaction.performOperations(StoreProviderTransaction.java:64)
com.djrapitops.plan.storage.database.transactions.Transaction.executeTransaction(Transaction.java:89)
com.djrapitops.plan.storage.database.SQLDB.lambda$executeTransaction$3(SQLDB.java:346)
java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
... (17 lines left)
Solution:
- Keep a cache of extension metadata and only update if it has changed (Since it can be dynamic it can't be stored once).
- No need to keep all data, it is enough to create a checksum for each plugin-method