Skip to content

Log backtrace when SAVEPOINT is discovered

Stan Hu requested to merge sh-add-backtrace-transaction-observer into master

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

Merge request reports