Skip to content

"undefined method `epics'" error when rendering some content on GitLab.com

Summary

A Support team member (thanks @goeun.gil!) reported odd behaviour when trying to access a training template file located here: https://gitlab.com/gitlab-com/support/support-training/-/blob/main/.gitlab/issue_templates/Code%20Contributions.md

When loaded, it indicates an error and triggers a 500 in the backend. We can see in Kibana that this will routinely return an error, where it looks to check for epics under a UserNamespace:

# some values removed for brevity
"json": {
  "meta.client_id": "user/10369602",
  "db_main_replica_txn_max_duration_s": 0,
  "controller": "Projects::BlobController",
  "exception.cause_class": "NoMethodError",
  "meta.feature_category": "source_code_management",
  "exception.class": "ActionView::Template::Error",
  "meta.project": "gitlab-com/support/support-training",
  "meta.caller_id": "Projects::BlobController#show",
  "exception.backtrace": [
    "ee/lib/ee/banzai/filter/references/epic_reference_filter.rb:49:in `parent_records'",
    "lib/banzai/filter/references/reference_cache.rb:152:in `block in load_records_per_parent'",
    "lib/banzai/filter/references/reference_cache.rb:149:in `each'",
    "lib/banzai/filter/references/reference_cache.rb:149:in `load_records_per_parent'",
    "lib/banzai/filter/references/reference_cache.rb:19:in `load_reference_cache'",
    "lib/banzai/filter/references/abstract_reference_filter.rb:124:in `call'",
    "lib/banzai/filter/concerns/timeout_filter_handler.rb:37:in `block in call'",
    "lib/gitlab/render_timeout.rb:11:in `timeout'",
    "lib/banzai/filter/concerns/timeout_filter_handler.rb:37:in `call'",
    "lib/banzai/filter/concerns/pipeline_timing_check.rb:26:in `call'",
    "lib/banzai/filter/references/reference_filter.rb:43:in `block in call_and_update_nodes'",
    "lib/banzai/filter/references/reference_filter.rb:298:in `with_update_nodes'",
    "lib/banzai/filter/references/reference_filter.rb:43:in `call_and_update_nodes'",
    "lib/banzai/filter/references/reference_filter.rb:31:in `call'",
    "lib/banzai/pipeline/base_pipeline.rb:26:in `block (2 levels) in singleton class'",
    "lib/banzai/renderer.rb:131:in `block in render_result'",
    "lib/banzai/renderer.rb:221:in `instrument_filters'",
    "lib/banzai/renderer.rb:129:in `render_result'",
    "lib/banzai/renderer.rb:165:in `cacheless_render'",
    "lib/banzai/renderer.rb:28:in `block in render'",
    "lib/banzai/renderer.rb:27:in `render'",
    "lib/banzai.rb:16:in `render'",
    "app/services/markup/rendering_service.rb:40:in `markdown_unsafe'",
    "app/services/markup/rendering_service.rb:29:in `markup_unsafe'",
    "app/services/markup/rendering_service.rb:16:in `execute'",
    "app/helpers/markup_helper.rb:116:in `markup'",
    "app/views/projects/blob/viewers/_markup.html.haml:3",
    "app/views/projects/blob/_viewer.html.haml:24",
    "app/controllers/application_controller.rb:370:in `view_to_html_string'",
    "app/controllers/concerns/renders_blob.rb:17:in `blob_viewer_json'",
    "app/controllers/projects/blob_controller.rb:271:in `show_json'",
    "app/controllers/projects/blob_controller.rb:76:in `block (2 levels) in show'",
    "app/controllers/projects/blob_controller.rb:68:in `show'",
    "app/controllers/application_controller.rb:554:in `block in allow_gitaly_ref_name_caching'",
    "lib/gitlab/gitaly_client.rb:478:in `allow_ref_name_caching'",
    "app/controllers/application_controller.rb:553:in `allow_gitaly_ref_name_caching'",
    "lib/gitlab/ip_address_state.rb:11:in `with'",
    "ee/app/controllers/ee/application_controller.rb:45:in `set_current_ip_address'",
    "app/controllers/application_controller.rb:505:in `set_current_admin'",
    "lib/gitlab/session.rb:11:in `with_session'",
    "app/controllers/application_controller.rb:496:in `set_session_storage'",
    "lib/gitlab/i18n.rb:114:in `with_locale'",
    "lib/gitlab/i18n.rb:120:in `with_user_locale'",
    "app/controllers/application_controller.rb:487:in `set_locale'",
    "app/controllers/application_controller.rb:480:in `set_current_context'",
    "ee/app/controllers/ee/projects/blob_controller.rb:27:in `repair_blobs_index'",
    "lib/gitlab/middleware/action_controller_static_context.rb:23:in `call'",
    "ee/lib/omni_auth/strategies/group_saml.rb:41:in `other_phase'",
    "lib/gitlab/metrics/elasticsearch_rack_middleware.rb:16:in `call'",
    "lib/gitlab/middleware/sidekiq_shard_awareness_validation.rb:20:in `block in call'",
    "lib/gitlab/sidekiq_sharding/validator.rb:42:in `enabled'",
    "lib/gitlab/middleware/sidekiq_shard_awareness_validation.rb:20:in `call'",
    "lib/gitlab/middleware/memory_report.rb:13:in `call'",
    "lib/gitlab/middleware/speedscope.rb:13:in `call'",
    "lib/gitlab/database/load_balancing/rack_middleware.rb:23:in `call'",
    "lib/gitlab/middleware/rails_queue_duration.rb:33:in `call'",
    "lib/gitlab/etag_caching/middleware.rb:21:in `call'",
    "lib/gitlab/metrics/rack_middleware.rb:16:in `block in call'",
    "lib/gitlab/metrics/web_transaction.rb:46:in `run'",
    "lib/gitlab/metrics/rack_middleware.rb:16:in `call'",
    "lib/gitlab/middleware/go.rb:21:in `call'",
    "lib/gitlab/middleware/query_analyzer.rb:11:in `block in call'",
    "lib/gitlab/database/query_analyzer.rb:83:in `within'",
    "lib/gitlab/middleware/query_analyzer.rb:11:in `call'",
    "lib/ci/job_token/middleware.rb:11:in `call'",
    "lib/gitlab/middleware/multipart.rb:173:in `call'",
    "lib/gitlab/middleware/read_only/controller.rb:50:in `call'",
    "lib/gitlab/middleware/read_only.rb:18:in `call'",
    "lib/gitlab/middleware/unauthenticated_session_expiry.rb:18:in `call'",
    "lib/gitlab/middleware/same_site_cookies.rb:27:in `call'",
    "lib/gitlab/middleware/path_traversal_check.rb:40:in `call'",
    "lib/gitlab/middleware/handle_malformed_strings.rb:21:in `call'",
    "lib/gitlab/middleware/basic_health_check.rb:25:in `call'",
    "lib/gitlab/middleware/handle_ip_spoof_attack_error.rb:25:in `call'",
    "lib/gitlab/middleware/request_context.rb:15:in `call'",
    "lib/gitlab/middleware/webhook_recursion_detection.rb:15:in `call'",
    "config/initializers/fix_local_cache_middleware.rb:11:in `call'",
    "lib/gitlab/middleware/compressed_json.rb:44:in `call'",
    "lib/gitlab/middleware/rack_multipart_tempfile_factory.rb:19:in `call'",
    "lib/gitlab/middleware/sidekiq_web_static.rb:20:in `call'",
    "lib/gitlab/metrics/requests_rack_middleware.rb:79:in `call'",
    "lib/gitlab/middleware/release_env.rb:12:in `call'"
  ],
  "exception.message": "undefined method `epics' for #<Namespaces::UserNamespace id:465491 @gitlab>",
  "correlation_id": "01JF97283J5BCSDTJ56CAN1Q87",
},

Strangley, it appears to be calling ``Namespaces::UserNamespace, and referneces an id 465491` which belongs to the `@gitlab` user account: https://gitlab.com/gitlab.

We've seen this only begin to occur in the last 24 hours:

Kibana (7 days): https://log.gprd.gitlab.net/app/r/s/gNPXR image

Sentry (thanks @anton) https://new-sentry.gitlab.net/organizations/gitlab/issues/1244599/?project=3&query=is%3Aunresolved+correlation_id%3A01JF97283J5BCSDTJ56CAN1Q87&referrer=issue-stream&statsPeriod=14d&stream_index=0

image

Steps to reproduce

Example Project

As mentioned above: https://gitlab.com/gitlab-com/support/support-training/-/blob/main/.gitlab/issue_templates/Code%20Contributions.md

What is the current bug behavior?

The content cannot be rendered.

What is the expected correct behavior?

The content can be rendered

Output of checks

This bug happens on GitLab.com

Possible fixes

Is it possible that a recent change is trying to check for a user account and check epics of the user? Understandably, the error fails as a User Namespace does not have epics.

Edited by Anton Smith