GitHub importer fails on LFS import
As seen in !48632 (comment 456626562):
{
"severity": "ERROR",
"time": "2020-11-29T15:40:41.056Z",
"correlation_id": "ddd173eaef0fa35741a2acb96b0ddcfb",
"extra.sidekiq": {
"class": "Gitlab::GithubImport::Stage::ImportLfsObjectsWorker",
"args": [
"226"
],
"retry": 5,
"queue": "github_importer:github_import_stage_import_lfs_objects",
"backtrace": true,
"version": 0,
"queue_namespace": "github_importer",
"dead": false,
"jid": "21781ab9d6bda48f58162fc4",
"created_at": 1606664398.839218,
"meta.user": "root",
"meta.project": "root/json_exporter",
"meta.root_namespace": "root",
"meta.caller_id": "Gitlab::GithubImport::AdvanceStageWorker",
"meta.related_class": "Projects::CreateService",
"meta.feature_category": "importers",
"correlation_id": "ddd173eaef0fa35741a2acb96b0ddcfb",
"enqueued_at": 1606664441.0117419,
"error_message": "undefined method `oid' for [:status, :success]:Array",
"error_class": "NoMethodError",
"failed_at": 1606664398.910867,
"retry_count": 1,
"error_backtrace": [
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/github_import/representation/lfs_object.rb:16:in `from_api_response'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/github_import/parallel_scheduling.rb:70:in `block in parallel_import'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/github_import/importer/lfs_objects_importer.rb:29:in `block in each_object_to_import'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/github_import/importer/lfs_objects_importer.rb:28:in `each'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/github_import/importer/lfs_objects_importer.rb:28:in `each_object_to_import'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/github_import/parallel_scheduling.rb:69:in `parallel_import'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/github_import/parallel_scheduling.rb:33:in `execute'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/app/workers/gitlab/github_import/stage/import_lfs_objects_worker.rb:23:in `import'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/app/workers/gitlab/github_import/stage/import_lfs_objects_worker.rb:14:in `perform'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:192:in `execute_job'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:165:in `block (2 levels) in process'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:128:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/metrics/sidekiq_middleware.rb:18:in `block in call'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/metrics/transaction.rb:56:in `run'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/metrics/sidekiq_middleware.rb:18:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing.rb:16:in `perform'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb:40:in `perform'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/duplicate_jobs/server.rb:8:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/worker_context.rb:9:in `wrap_in_optional_context'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/worker_context/server.rb:17:in `block in call'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/application_context.rb:54:in `block in use'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/gitlab-labkit-0.13.1/lib/labkit/context.rb:32:in `with_context'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/application_context.rb:54:in `use'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/application_context.rb:21:in `with_context'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/worker_context/server.rb:15:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_status/server_middleware.rb:7:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_versioning/middleware.rb:9:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/admin_mode/server.rb:8:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/instrumentation_logger.rb:7:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/gitlab-labkit-0.13.1/lib/labkit/middleware/sidekiq/server.rb:21:in `block in call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:128:in `block in invoke'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/gitlab-labkit-0.13.1/lib/labkit/middleware/sidekiq/context/server.rb:14:in `block in call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/gitlab-labkit-0.13.1/lib/labkit/context.rb:32:in `with_context'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/gitlab-labkit-0.13.1/lib/labkit/middleware/sidekiq/context/server.rb:13:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:133:in `invoke'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/gitlab-labkit-0.13.1/lib/labkit/middleware/sidekiq/server.rb:20:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/batch_loader.rb:7:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/extra_done_log_metadata.rb:7:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/request_store_middleware.rb:10:in `block in call'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/with_request_store.rb:17:in `enabling_request_store'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/with_request_store.rb:10:in `with_request_store'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/request_store_middleware.rb:9:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/server_metrics.rb:37:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/monitor.rb:8:in `block in call'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_daemon/monitor.rb:49:in `within_job'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_middleware/monitor.rb:7:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/marginalia-1.9.0/lib/marginalia/sidekiq_instrumentation.rb:10:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sentry-raven-3.0.4/lib/raven/integrations/sidekiq.rb:9:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/middleware/chain.rb:133:in `invoke'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:164:in `block in process'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:137:in `block (6 levels) in dispatch'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/job_retry.rb:109:in `local'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:136:in `block (5 levels) in dispatch'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/rails.rb:43:in `block in call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/execution_wrapper.rb:88:in `wrap'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/reloader.rb:72:in `block in wrap'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/execution_wrapper.rb:88:in `wrap'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/reloader.rb:71:in `wrap'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/rails.rb:42:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:132:in `block (4 levels) in dispatch'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:250:in `stats'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:127:in `block (3 levels) in dispatch'",
"/Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/sidekiq_logging/structured_logger.rb:18:in `call'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:126:in `block (2 levels) in dispatch'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/job_retry.rb:74:in `global'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:125:in `block in dispatch'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/logging.rb:48:in `with_context'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/logging.rb:42:in `with_job_hash_context'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:124:in `dispatch'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:163:in `process'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:83:in `process_one'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/processor.rb:71:in `run'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/util.rb:16:in `watchdog'",
"/Users/stanhu/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/sidekiq-5.2.9/lib/sidekiq/util.rb:25:in `block in safe_thread'"
],
"retried_at": 1606664421.6004171
},
"extra.import_source": "github",
"extra.project_id": 226,
"extra.importer": "Gitlab::GithubImport::Importer::LfsObjectImporter",
"extra.parallel": true,
"exception.class": "NoMethodError",
"exception.message": "undefined method `oid' for [:status, :success]:Array",
"exception.backtrace": [
"lib/gitlab/github_import/representation/lfs_object.rb:16:in `from_api_response'",
"lib/gitlab/github_import/parallel_scheduling.rb:70:in `block in parallel_import'",
"lib/gitlab/github_import/importer/lfs_objects_importer.rb:29:in `block in each_object_to_import'",
"lib/gitlab/github_import/importer/lfs_objects_importer.rb:28:in `each'",
"lib/gitlab/github_import/importer/lfs_objects_importer.rb:28:in `each_object_to_import'",
"lib/gitlab/github_import/parallel_scheduling.rb:69:in `parallel_import'",
"lib/gitlab/github_import/parallel_scheduling.rb:33:in `execute'",
"app/workers/gitlab/github_import/stage/import_lfs_objects_worker.rb:23:in `import'",
"app/workers/gitlab/github_import/stage/import_lfs_objects_worker.rb:14:in `perform'",
"lib/gitlab/metrics/sidekiq_middleware.rb:18:in `block in call'",
"lib/gitlab/metrics/transaction.rb:56:in `run'",
"lib/gitlab/metrics/sidekiq_middleware.rb:18:in `call'",
"lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing.rb:16:in `perform'",
"lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb:40:in `perform'",
"lib/gitlab/sidekiq_middleware/duplicate_jobs/server.rb:8:in `call'",
"lib/gitlab/sidekiq_middleware/worker_context.rb:9:in `wrap_in_optional_context'",
"lib/gitlab/sidekiq_middleware/worker_context/server.rb:17:in `block in call'",
"lib/gitlab/application_context.rb:54:in `block in use'",
"lib/gitlab/application_context.rb:54:in `use'",
"lib/gitlab/application_context.rb:21:in `with_context'",
"lib/gitlab/sidekiq_middleware/worker_context/server.rb:15:in `call'",
"lib/gitlab/sidekiq_status/server_middleware.rb:7:in `call'",
"lib/gitlab/sidekiq_versioning/middleware.rb:9:in `call'",
"lib/gitlab/sidekiq_middleware/admin_mode/server.rb:8:in `call'",
"lib/gitlab/sidekiq_middleware/instrumentation_logger.rb:7:in `call'",
"lib/gitlab/sidekiq_middleware/batch_loader.rb:7:in `call'",
"lib/gitlab/sidekiq_middleware/extra_done_log_metadata.rb:7:in `call'",
"lib/gitlab/sidekiq_middleware/request_store_middleware.rb:10:in `block in call'",
"lib/gitlab/with_request_store.rb:17:in `enabling_request_store'",
"lib/gitlab/with_request_store.rb:10:in `with_request_store'",
"lib/gitlab/sidekiq_middleware/request_store_middleware.rb:9:in `call'",
"lib/gitlab/sidekiq_middleware/server_metrics.rb:37:in `call'",
"lib/gitlab/sidekiq_middleware/monitor.rb:8:in `block in call'",
"lib/gitlab/sidekiq_daemon/monitor.rb:49:in `within_job'",
"lib/gitlab/sidekiq_middleware/monitor.rb:7:in `call'",
"lib/gitlab/sidekiq_logging/structured_logger.rb:18:in `call'"
]
}
I can reproduce the problem locally:
[13] pry(main)> Gitlab::GithubImport::Importer::LfsObjectsImporter.new(project, nil).execute
ApplicationSetting Load (1.0ms) SELECT "application_settings".* FROM "application_settings" ORDER BY "application_settings"."id" DESC LIMIT 1
NoMethodError: undefined method `oid' for [:status, :success]:Array
from /Users/stanhu/gitlab/gdk-ee/gitlab/lib/gitlab/github_import/representation/lfs_object.rb:16:in `from_api_response'
[14] pry(main)> Projects::LfsPointers::LfsImportService.new(project).execute
=> {:status=>:success}
Maybe we want LfsObjectDownloadListService instead of LfsImportService on https://gitlab.com/gitlab-org/gitlab/blob/054853977a85a97b8aadbdfb64a9c887e86f7bd8/lib%2Fgitlab%2Fgithub_import%2Fimporter%2Flfs_objects_importer.rb#L26?
diff --git a/lib/gitlab/github_import/importer/lfs_objects_importer.rb b/lib/gitlab/github_import/importer/lfs_objects_importer.rb
index 0024a2e7dc6..9f11e51301e 100644
--- a/lib/gitlab/github_import/importer/lfs_objects_importer.rb
+++ b/lib/gitlab/github_import/importer/lfs_objects_importer.rb
@@ -1,3 +1,4 @@
+
# frozen_string_literal: true
module Gitlab
@@ -23,7 +24,7 @@ def collection_method
end
def each_object_to_import
- lfs_objects = Projects::LfsPointers::LfsImportService.new(project).execute
+ lfs_objects = Projects::LfsPointers::LfsObjectDownloadListService.new(project).execute
lfs_objects.each do |object|
yield object
This problem might have been around for a while but exposed recently in !48512 (merged) due to the removal of the rescue.
Even with the diff above, we may still not want to fail the import if LFS fails to download?