Log backtrace when SAVEPOINT is discovered
We have mostly eliminated using subtransactions from the code, but there are a few places where they may be happening. Log the backtrace of the caller to identify exactly where this is happening.
Testing
I applied this diff:
diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb
index ba24e3e619b4..416b515a9198 100644
--- a/app/controllers/admin/dashboard_controller.rb
+++ b/app/controllers/admin/dashboard_controller.rb
@@ -16,6 +16,15 @@ def index
@notices = Gitlab::ConfigChecker::PumaRuggedChecker.check
@notices += Gitlab::ConfigChecker::ExternalDatabaseChecker.check
@redis_versions = [Gitlab::Redis::Queues, Gitlab::Redis::SharedState, Gitlab::Redis::Cache, Gitlab::Redis::TraceChunks].map(&:version).uniq
+
+ Project.transaction do
+ Project.transaction(requires_new: true) do
+ Project.transaction(requires_new: true) do
+ Project.first.touch
+ end
+ end
+ end
+
end
# rubocop: enable CodeReuse/ActiveRecord
Then visited the /admin
page:
{
"severity": "INFO",
"time": "2021-08-26T04:11:10.515Z",
"correlation_id": "01FE0AF3TKZET97MP3N6N0MFEJ",
"class": "Gitlab::Database::Transaction::Context",
"result": "commit",
"duration_s": 0.12094899988733232,
"depth": 3,
"savepoints_count": 2,
"rollbacks_count": 0,
"releases_count": 2,
"sql": "BEGIN /*application:web,correlation_id:01FE0AF3TKZET97MP3N6N0MFEJ,endpoint_id:Admin::DashboardController#index,line:/lib/gitlab/database/schema_cache_with_renamed_table.rb:21:in `primary_keys'*/",
"savepoint_backtraces": [
[
"lib/gitlab/database/transaction/observer.rb:41:in `block in register!'",
"lib/gitlab/database/schema_cache_with_renamed_table.rb:21:in `primary_keys'",
"app/controllers/admin/dashboard_controller.rb:23:in `block (3 levels) in index'",
"lib/gitlab/database.rb:225:in `block in transaction'",
"lib/gitlab/database.rb:224:in `transaction'",
"app/controllers/admin/dashboard_controller.rb:22:in `block (2 levels) in index'",
"lib/gitlab/database.rb:225:in `block in transaction'",
"lib/gitlab/database.rb:224:in `transaction'",
"app/controllers/admin/dashboard_controller.rb:21:in `block in index'",
"lib/gitlab/database.rb:225:in `block in transaction'",
"lib/gitlab/database.rb:224:in `transaction'",
"app/controllers/admin/dashboard_controller.rb:20:in `index'",
"ee/app/controllers/ee/admin/dashboard_controller.rb:12:in `index'",
"ee/lib/gitlab/ip_address_state.rb:10:in `with'",
"ee/app/controllers/ee/application_controller.rb:44:in `set_current_ip_address'",
"lib/gitlab/auth/current_user_mode.rb:78:in `with_current_admin'",
"app/controllers/application_controller.rb:486:in `set_current_admin'",
"lib/gitlab/session.rb:11:in `with_session'",
"app/controllers/application_controller.rb:474:in `set_session_storage'",
"app/controllers/application_controller.rb:468:in `set_locale'",
"app/controllers/application_controller.rb:462:in `set_current_context'",
"lib/gitlab/jira/middleware.rb:19:in `call'"
],
[
"lib/gitlab/database/transaction/observer.rb:41:in `block in register!'",
"lib/gitlab/database/schema_cache_with_renamed_table.rb:21:in `primary_keys'",
"app/controllers/admin/dashboard_controller.rb:23:in `block (3 levels) in index'",
"lib/gitlab/database.rb:225:in `block in transaction'",
"lib/gitlab/database.rb:224:in `transaction'",
"app/controllers/admin/dashboard_controller.rb:22:in `block (2 levels) in index'",
"lib/gitlab/database.rb:225:in `block in transaction'",
"lib/gitlab/database.rb:224:in `transaction'",
"app/controllers/admin/dashboard_controller.rb:21:in `block in index'",
"lib/gitlab/database.rb:225:in `block in transaction'",
"lib/gitlab/database.rb:224:in `transaction'",
"app/controllers/admin/dashboard_controller.rb:20:in `index'",
"ee/app/controllers/ee/admin/dashboard_controller.rb:12:in `index'",
"ee/lib/gitlab/ip_address_state.rb:10:in `with'",
"ee/app/controllers/ee/application_controller.rb:44:in `set_current_ip_address'",
"lib/gitlab/auth/current_user_mode.rb:78:in `with_current_admin'",
"app/controllers/application_controller.rb:486:in `set_current_admin'",
"lib/gitlab/session.rb:11:in `with_session'",
"app/controllers/application_controller.rb:474:in `set_session_storage'",
"app/controllers/application_controller.rb:468:in `set_locale'",
"app/controllers/application_controller.rb:462:in `set_current_context'",
"lib/gitlab/jira/middleware.rb:19:in `call'"
]
]
}
Edited by Stan Hu