Skip to content

Surface BitBucket Server Import Errors to users

Summary

Currently, when a user attempts a project import from BitBucket server to GitLab, they might get a successful import, but not all the data will be imported.

For example, the project might be missing Pull Requests if the BitBucket user used for import doesn't have permissions to view Bitbucket project members and permissions. Making sure that BitBucket user has Admin rights on the project solves the issue.

The bug is that it is not immediately clear that not all data has been imported unless the user manually checks the presence of Pull Requests in GitLab.

There is an exception that gets written to Sidekiq logs which should somehow be surfaced to the end user in the UI:

"exception.backtrace": [
        "lib/bitbucket_server/connection.rb:88:in `check_errors!'",
        "lib/bitbucket_server/connection.rb:39:in `get'",
        "lib/bitbucket_server/paginator.rb:56:in `fetch_next_page'",
        "lib/bitbucket_server/paginator.rb:24:in `items'",
        "lib/bitbucket_server/collection.rb:14:in `block (2 levels) in initialize'",
        "lib/bitbucket_server/collection.rb:13:in `loop'",
        "lib/bitbucket_server/collection.rb:13:in `block in initialize'",
        "lib/gitlab/bitbucket_server_import/importers/users_importer.rb:30:in `each'",
        "lib/gitlab/bitbucket_server_import/importers/users_importer.rb:30:in `each'",
        "lib/gitlab/bitbucket_server_import/importers/users_importer.rb:30:in `to_a'",
        "lib/gitlab/bitbucket_server_import/importers/users_importer.rb:30:in `block in execute'",
        "lib/gitlab/bitbucket_server_import/importers/users_importer.rb:24:in `loop'",
        "lib/gitlab/bitbucket_server_import/importers/users_importer.rb:24:in `execute'",
        "app/workers/gitlab/bitbucket_server_import/stage/import_users_worker.rb:16:in `import'",
        "app/workers/concerns/gitlab/bitbucket_server_import/stage_methods.rb:38:in `perform'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:210:in `execute_job'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:180:in `block (4 levels) in process'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:180:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/skip_jobs.rb:49:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb:29:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing.rb:16:in `perform'",
        "lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb:44:in `perform'",
        "lib/gitlab/sidekiq_middleware/duplicate_jobs/server.rb:8:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/concurrency_limit/middleware.rb:32:in `perform'",
        "lib/gitlab/sidekiq_middleware/concurrency_limit/server.rb:8:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/click_house/migration_support/sidekiq_middleware.rb:7:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/pause_control/strategies/base.rb:31:in `perform'",
        "lib/gitlab/sidekiq_middleware/pause_control/strategy_handler.rb:22:in `perform'",
        "lib/gitlab/sidekiq_middleware/pause_control/server.rb:8:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/worker_context.rb:9:in `wrap_in_optional_context'",
        "lib/gitlab/sidekiq_middleware/worker_context/server.rb:19:in `block in call'",
        "lib/gitlab/application_context.rb:130:in `block in use'",
        "gitlab-labkit (0.35.1) lib/labkit/context.rb:35:in `with_context'",
        "lib/gitlab/application_context.rb:130:in `use'",
        "lib/gitlab/application_context.rb:64:in `with_context'",
        "lib/gitlab/sidekiq_middleware/worker_context/server.rb:17:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_status/server_middleware.rb:7:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_versioning/middleware.rb:9:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/query_analyzer.rb:7:in `block in call'",
        "lib/gitlab/database/query_analyzer.rb:40:in `within'",
        "lib/gitlab/sidekiq_middleware/query_analyzer.rb:7:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/admin_mode/server.rb:14:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/instrumentation_logger.rb:9:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/batch_loader.rb:7:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/extra_done_log_metadata.rb:7:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/request_store_middleware.rb:8:in `block in call'",
        "gems/gitlab-safe_request_store/lib/gitlab/safe_request_store.rb:66:in `enabling_request_store'",
        "gems/gitlab-safe_request_store/lib/gitlab/safe_request_store.rb:59:in `ensure_request_store'",
        "lib/gitlab/sidekiq_middleware/request_store_middleware.rb:7:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/server_metrics.rb:105:in `block in call'",
        "lib/gitlab/sidekiq_middleware/server_metrics.rb:133:in `block in instrument'",
        "lib/gitlab/metrics/background_transaction.rb:33:in `run'",
        "lib/gitlab/sidekiq_middleware/server_metrics.rb:133:in `instrument'",
        "lib/gitlab/sidekiq_middleware/server_metrics.rb:104:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "gitlab-labkit (0.35.1) lib/labkit/middleware/sidekiq/server.rb:21:in `block in call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:180:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "gitlab-labkit (0.35.1) lib/labkit/middleware/sidekiq/context/server.rb:16:in `block in call'",
        "gitlab-labkit (0.35.1) lib/labkit/context.rb:35:in `with_context'",
        "gitlab-labkit (0.35.1) lib/labkit/middleware/sidekiq/context/server.rb:15:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:173:in `invoke'",
        "gitlab-labkit (0.35.1) lib/labkit/middleware/sidekiq/server.rb:20:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/monitor.rb:10:in `block in call'",
        "lib/gitlab/sidekiq_daemon/monitor.rb:46:in `within_job'",
        "lib/gitlab/sidekiq_middleware/monitor.rb:9:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "lib/gitlab/sidekiq_middleware/size_limiter/server.rb:13:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "marginalia (1.11.1) lib/marginalia/sidekiq_instrumentation.rb:9:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "sentry-sidekiq (5.10.0) lib/sentry/sidekiq/sentry_context_middleware.rb:26:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "sentry-raven (3.1.2) lib/raven/integrations/sidekiq/cleanup_middleware.rb:7:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/metrics/tracking.rb:26:in `track'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/metrics/tracking.rb:122:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:182:in `traverse'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/middleware/chain.rb:173:in `invoke'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:179:in `block (3 levels) in process'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:140:in `block (6 levels) in dispatch'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/job_retry.rb:114:in `local'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:139:in `block (5 levels) in dispatch'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/rails.rb:16:in `block in call'",
        "activesupport (7.0.8.1) lib/active_support/execution_wrapper.rb:92:in `wrap'",
        "activesupport (7.0.8.1) lib/active_support/reloader.rb:72:in `block in wrap'",
        "activesupport (7.0.8.1) lib/active_support/execution_wrapper.rb:92:in `wrap'",
        "activesupport (7.0.8.1) lib/active_support/reloader.rb:71:in `wrap'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/rails.rb:15:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:135:in `block (4 levels) in dispatch'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:271:in `stats'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:130:in `block (3 levels) in dispatch'",
        "lib/gitlab/sidekiq_logging/structured_logger.rb:21:in `call'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:129:in `block (2 levels) in dispatch'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/job_retry.rb:81:in `global'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:128:in `block in dispatch'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/job_logger.rb:39:in `prepare'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:127:in `dispatch'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:178:in `block (2 levels) in process'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:177:in `handle_interrupt'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:177:in `block in process'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:176:in `handle_interrupt'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:176:in `process'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:82:in `process_one'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/processor.rb:72:in `run'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/component.rb:10:in `watchdog'",
        "vendor/gems/sidekiq-7.1.6/lib/sidekiq/component.rb:19:in `block in safe_thread'"
      ],
      "exception.message": "Error 401: You are not permitted to access this resource",
      "meta.project": "PROJECT",
      "correlation_id": "8d6c5b38ccaaf49704db1893792395b5",
      "class": "Gitlab::BitbucketServerImport::Stage::ImportUsersWorker",
      "exception.class": "BitbucketServer::Connection::ConnectionError",
      "args": [
        "55406631"
      ],
      "meta.caller_id": "Gitlab::BitbucketServerImport::Stage::ImportRepositoryWorker",
      "type": "sidekiq",
      "message": "Gitlab::BitbucketServerImport::Stage::ImportUsersWorker JID-656e24bd08ea553890be4013: fail: 1.013697 sec",

Steps to reproduce

  1. Attempt an import of a project from BitBucket server using a user who is unable to view project members.
  2. Import is successful, but Merge Requests won't be imported, no error message is returned.
  3. The user might think that import was successful unless they manually check Merge Requests presence.

What is the current bug behavior?

No error is getting surfaced to UI when BitBucket user doesn't have all the required permissions.

What is the expected correct behavior?

The Error 401: You are not permitted to access this resource error should be surfaced to UI and Import should be failed when it is not possible to import Pull Requests due to insufficient permissions.

Relevant logs and/or screenshots

Output of checks

This bug happens on GitLab.com

Possible fixes

Edited by Filip Aleksic
OSZAR »