18.6.2 occasionally fails with NameError: uninitialized constant Grape::Validations::Validators::Base::SingleAttributeIterator

18.6.2 occasionally fails with NameError: uninitialized constant Grape::Validations::Validators::Base::SingleAttributeIterator

This is the relevant log entry from api_json.log:

{
  "time": "2026-01-27T08:13:43.152Z",
  "severity": "INFO",
  "duration_s": 0.00244,
  "db_duration_s": 0,
  "view_duration_s": 0.00244,
  "status": 500,
  "method": "GET",
  "path": "/api/v4/projects/1140/merge_requests/197/award_emoji",
  "params": [
    {
      "key": "per_page",
      "value": "100"
    },
    {
      "key": "page",
      "value": "1"
    }
  ],
  "host": "gitlab.his.de",
  "remote_ip": "10.1.100.111, 127.0.0.1",
  "ua": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
  "route": "/api/:version/projects/:id/merge_requests/:merge_request_iid/award_emoji",
  "exception.class": "NameError",
  "exception.message": "uninitialized constant Grape::Validations::Validators::Base::SingleAttributeIterator",
  "exception.backtrace": [
    "grape (2.0.0) lib/grape/validations/validators/base.rb:44:in `validate!'",
    "grape (2.0.0) lib/grape/validations/validators/base.rb:35:in `validate'",
    "grape (2.0.0) lib/grape/endpoint.rb:353:in `block (2 levels) in run_validators'",
    "grape (2.0.0) lib/grape/endpoint.rb:398:in `block in validations'",
    "grape (2.0.0) lib/grape/endpoint.rb:397:in `each'",
    "grape (2.0.0) lib/grape/endpoint.rb:397:in `validations'",
    "grape (2.0.0) lib/grape/endpoint.rb:352:in `each'",
    "grape (2.0.0) lib/grape/endpoint.rb:352:in `block in run_validators'",
    "activesupport (7.1.6) lib/active_support/notifications.rb:208:in `instrument'",
    "grape (2.0.0) lib/grape/endpoint.rb:351:in `run_validators'",
    "grape (2.0.0) lib/grape/endpoint.rb:258:in `block in run'",
    "activesupport (7.1.6) lib/active_support/notifications.rb:208:in `instrument'",
    "grape (2.0.0) lib/grape/endpoint.rb:240:in `run'",
    "grape (2.0.0) lib/grape/endpoint.rb:316:in `block in build_stack'",
    "grape (2.0.0) lib/grape/middleware/base.rb:36:in `call!'",
    "grape (2.0.0) lib/grape/middleware/base.rb:29:in `call'",
    "grape (2.0.0) lib/grape/middleware/base.rb:36:in `call!'",
    "grape (2.0.0) lib/grape/middleware/base.rb:29:in `call'",
    "lib/gitlab/middleware/ip_address.rb:14:in `block in call'",
    "lib/gitlab/ip_address_state.rb:11:in `with'",
    "lib/gitlab/middleware/ip_address.rb:13:in `call'",
    "grape (2.0.0) lib/grape/middleware/base.rb:36:in `call!'",
    "grape (2.0.0) lib/grape/middleware/base.rb:29:in `call'",
    "grape (2.0.0) lib/grape/middleware/base.rb:36:in `call!'",
    "grape (2.0.0) lib/grape/middleware/base.rb:29:in `call'",
    "lib/api/api_guard.rb:272:in `call'",
    "grape (2.0.0) lib/grape/middleware/base.rb:36:in `call!'",
    "grape (2.0.0) lib/grape/middleware/base.rb:29:in `call'",
    "rack-oauth2 (2.2.1) lib/rack/oauth2/server/resource.rb:20:in `_call'",
    "rack-oauth2 (2.2.1) lib/rack/oauth2/server/resource/bearer.rb:8:in `_call'",
    "rack-oauth2 (2.2.1) lib/rack/oauth2/server/abstract/handler.rb:17:in `call'",
    "grape (2.0.0) lib/grape/middleware/error.rb:39:in `block in call!'",
    "grape (2.0.0) lib/grape/middleware/error.rb:38:in `catch'",
    "grape (2.0.0) lib/grape/middleware/error.rb:38:in `call!'",
    "grape (2.0.0) lib/grape/middleware/base.rb:29:in `call'",
    "grape_logging (1.8.4) lib/grape_logging/middleware/request_logger.rb:60:in `block in call!'",
    "grape_logging (1.8.4) lib/grape_logging/middleware/request_logger.rb:58:in `catch'",
    "grape_logging (1.8.4) lib/grape_logging/middleware/request_logger.rb:58:in `call!'",
    "grape (2.0.0) lib/grape/middleware/base.rb:29:in `call'",
    "rack (2.2.21) lib/rack/head.rb:12:in `call'",
    "grape (2.0.0) lib/grape/endpoint.rb:224:in `call!'",
    "grape (2.0.0) lib/grape/endpoint.rb:218:in `call'",
    "grape (2.0.0) lib/grape/router/route.rb:58:in `exec'",
    "grape (2.0.0) lib/grape/router.rb:120:in `process_route'",
    "grape (2.0.0) lib/grape/router.rb:74:in `block in identity'",
    "grape (2.0.0) lib/grape/router.rb:94:in `transaction'",
    "grape (2.0.0) lib/grape/router.rb:72:in `identity'",
    "grape (2.0.0) lib/grape/router.rb:56:in `block in call'",
    "grape (2.0.0) lib/grape/router.rb:136:in `with_optimization'",
    "grape (2.0.0) lib/grape/router.rb:55:in `call'",
    "grape (2.0.0) lib/grape/api/instance.rb:165:in `call'",
    "grape (2.0.0) lib/grape/api/instance.rb:70:in `call!'",
    "grape (2.0.0) lib/grape/api/instance.rb:65:in `call'",
    "actionpack (7.1.6) lib/action_dispatch/routing/mapper.rb:31:in `block in <class:Constraints>'",
    "actionpack (7.1.6) lib/action_dispatch/routing/mapper.rb:60:in `serve'",
    "actionpack (7.1.6) lib/action_dispatch/journey/router.rb:51:in `block in serve'",
    "config/initializers/action_dispatch_journey_router.rb:52:in `block in find_routes'",
    "config/initializers/action_dispatch_journey_router.rb:25:in `map!'",
    "config/initializers/action_dispatch_journey_router.rb:25:in `find_routes'",
    "actionpack (7.1.6) lib/action_dispatch/journey/router.rb:32:in `serve'",
    "actionpack (7.1.6) lib/action_dispatch/routing/route_set.rb:882:in `call'",
    "gitlab-experiment (1.0.0) lib/gitlab/experiment/middleware.rb:19:in `call'",
    "omniauth (2.1.4) lib/omniauth/strategy.rb:202:in `call!'",
    "omniauth (2.1.4) lib/omniauth/strategy.rb:169:in `call'",
    "flipper (0.28.3) lib/flipper/middleware/memoizer.rb:72:in `memoized_call'",
    "flipper (0.28.3) lib/flipper/middleware/memoizer.rb:37: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/go.rb:21:in `call'",
    "lib/gitlab/etag_caching/middleware.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'",
    "batch-loader (2.0.5) lib/batch_loader/middleware.rb:11:in `call'",
    "rack-attack (6.8.0) lib/rack/attack.rb:105:in `call'",
    "apollo_upload_server (2.1.6) lib/apollo_upload_server/middleware.rb:19:in `call'",
    "lib/gitlab/middleware/multipart.rb:177:in `call'",
    "lib/gitlab/middleware/rack_attack_headers.rb:42:in `call'",
    "rack-attack (6.8.0) lib/rack/attack.rb:129:in `call'",
    "warden (1.2.9) lib/warden/manager.rb:36:in `block in call'",
    "warden (1.2.9) lib/warden/manager.rb:34:in `catch'",
    "warden (1.2.9) lib/warden/manager.rb:34:in `call'",
    "rack-cors (2.0.2) lib/rack/cors.rb:102:in `call'",
    "rack (2.2.21) lib/rack/tempfile_reaper.rb:15:in `call'",
    "rack (2.2.21) lib/rack/etag.rb:27:in `call'",
    "rack (2.2.21) lib/rack/conditional_get.rb:27:in `call'",
    "rack (2.2.21) lib/rack/head.rb:12:in `call'",
    "actionpack (7.1.6) lib/action_dispatch/http/permissions_policy.rb:36:in `call'",
    "actionpack (7.1.6) lib/action_dispatch/http/content_security_policy.rb:36:in `call'",
    "lib/gitlab/middleware/read_only/controller.rb:40:in `call'",
    "lib/gitlab/middleware/read_only.rb:18:in `call'",
    "lib/gitlab/middleware/unauthenticated_session_expiry.rb:18:in `call'",
    "rack (2.2.21) lib/rack/session/abstract/id.rb:266:in `context'",
    "rack (2.2.21) lib/rack/session/abstract/id.rb:260:in `call'",
    "lib/gitlab/middleware/secure_headers.rb:11:in `call'",
    "actionpack (7.1.6) lib/action_dispatch/middleware/cookies.rb:689:in `call'",
    "lib/gitlab/middleware/same_site_cookies.rb:27:in `call'",
    "actionpack (7.1.6) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'",
    "activesupport (7.1.6) lib/active_support/callbacks.rb:101:in `run_callbacks'",
    "actionpack (7.1.6) lib/action_dispatch/middleware/callbacks.rb:28:in `call'",
    "sentry-rails (5.23.0) lib/sentry/rails/rescued_exception_interceptor.rb:14:in `call'",
    "actionpack (7.1.6) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'",
    "lib/gitlab/middleware/path_traversal_check.rb:40:in `call'",
    "lib/gitlab/middleware/handle_malformed_strings.rb:19:in `call'",
    "lib/gitlab/middleware/json_validation.rb:165:in `call'",
    "sentry-ruby (5.23.0) lib/sentry/rack/capture_exceptions.rb:30:in `block (2 levels) in call'",
    "sentry-ruby (5.23.0) lib/sentry/hub.rb:299:in `with_session_tracking'",
    "sentry-ruby (5.23.0) lib/sentry-ruby.rb:428:in `with_session_tracking'",
    "sentry-ruby (5.23.0) lib/sentry/rack/capture_exceptions.rb:21:in `block in call'",
    "sentry-ruby (5.23.0) lib/sentry/hub.rb:89:in `with_scope'",
    "sentry-ruby (5.23.0) lib/sentry-ruby.rb:408:in `with_scope'",
    "sentry-ruby (5.23.0) lib/sentry/rack/capture_exceptions.rb:20:in `call'",
    "actionpack (7.1.6) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'",
    "lib/gitlab/middleware/basic_health_check.rb:25:in `call'",
    "lograge (0.11.2) lib/lograge/rails_ext/rack/logger.rb:15:in `call_app'",
    "railties (7.1.6) lib/rails/rack/logger.rb:24:in `block in call'",
    "activesupport (7.1.6) lib/active_support/tagged_logging.rb:139:in `block in tagged'",
    "activesupport (7.1.6) lib/active_support/tagged_logging.rb:39:in `tagged'",
    "activesupport (7.1.6) lib/active_support/tagged_logging.rb:139:in `tagged'",
    "activesupport (7.1.6) lib/active_support/broadcast_logger.rb:241:in `method_missing'",
    "railties (7.1.6) lib/rails/rack/logger.rb:24:in `call'",
    "actionpack (7.1.6) lib/action_dispatch/middleware/remote_ip.rb:92: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'",
    "request_store (1.7.0) lib/request_store/middleware.rb:19:in `call'",
    "rack (2.2.21) lib/rack/method_override.rb:24:in `call'",
    "rack (2.2.21) lib/rack/runtime.rb:22:in `call'",
    "rack-timeout (0.7.0) lib/rack/timeout/core.rb:154:in `block in call'",
    "rack-timeout (0.7.0) lib/rack/timeout/support/timeout.rb:19:in `timeout'",
    "rack-timeout (0.7.0) lib/rack/timeout/core.rb:153:in `call'",
    "config/initializers/fix_local_cache_middleware.rb:11:in `call'",
    "lib/gitlab/middleware/compressed_json.rb:44:in `call'",
    "actionpack (7.1.6) lib/action_dispatch/middleware/executor.rb:14:in `call'",
    "lib/gitlab/middleware/rack_multipart_tempfile_factory.rb:19:in `call'",
    "rack (2.2.21) lib/rack/sendfile.rb:127:in `call'",
    "lib/gitlab/middleware/sidekiq_web_static.rb:28:in `call'",
    "lib/gitlab/metrics/requests_rack_middleware.rb:83:in `call'",
    "gitlab-labkit (0.42.2) lib/labkit/middleware/rack.rb:22:in `block in call'",
    "gitlab-labkit (0.42.2) lib/labkit/context.rb:43:in `with_context'",
    "gitlab-labkit (0.42.2) lib/labkit/middleware/rack.rb:21:in `call'",
    "actionpack (7.1.6) lib/action_dispatch/middleware/request_id.rb:28:in `call'",
    "lib/gitlab/middleware/cors_static_assets.rb:19:in `call'",
    "railties (7.1.6) lib/rails/engine.rb:536:in `call'",
    "railties (7.1.6) lib/rails/railtie.rb:226:in `public_send'",
    "railties (7.1.6) lib/rails/railtie.rb:226:in `method_missing'",
    "lib/gitlab/middleware/release_env.rb:12:in `call'",
    "rack (2.2.21) lib/rack/urlmap.rb:74:in `block in call'",
    "rack (2.2.21) lib/rack/urlmap.rb:58:in `each'",
    "rack (2.2.21) lib/rack/urlmap.rb:58:in `call'",
    "puma (6.6.1) lib/puma/configuration.rb:279:in `call'",
    "puma (6.6.1) lib/puma/request.rb:99:in `block in handle_request'",
    "puma (6.6.1) lib/puma/thread_pool.rb:390:in `with_force_shutdown'",
    "puma (6.6.1) lib/puma/request.rb:98:in `handle_request'",
    "puma (6.6.1) lib/puma/server.rb:472:in `process_client'",
    "puma (6.6.1) lib/puma/server.rb:254:in `block in run'",
    "puma (6.6.1) lib/puma/thread_pool.rb:167:in `block in spawn_thread'"
  ],
  "redis_calls": 5,
  "redis_allowed_cross_slot_calls": 1,
  "redis_duration_s": 0.000519,
  "redis_read_bytes": 279,
  "redis_write_bytes": 751,
  "redis_db_load_balancing_calls": 2,
  "redis_db_load_balancing_duration_s": 0.000133,
  "redis_db_load_balancing_write_bytes": 106,
  "redis_sessions_calls": 3,
  "redis_sessions_allowed_cross_slot_calls": 1,
  "redis_sessions_duration_s": 0.000386,
  "redis_sessions_read_bytes": 279,
  "redis_sessions_write_bytes": 645,
  "db_count": 1,
  "db_write_count": 0,
  "db_cached_count": 0,
  "db_txn_count": 0,
  "db_replica_txn_count": 0,
  "db_primary_txn_count": 0,
  "db_replica_count": 0,
  "db_primary_count": 1,
  "db_replica_write_count": 0,
  "db_primary_write_count": 0,
  "db_replica_cached_count": 0,
  "db_primary_cached_count": 0,
  "db_replica_wal_count": 0,
  "db_primary_wal_count": 0,
  "db_replica_wal_cached_count": 0,
  "db_primary_wal_cached_count": 0,
  "db_replica_txn_max_duration_s": 0,
  "db_primary_txn_max_duration_s": 0,
  "db_replica_txn_duration_s": 0,
  "db_primary_txn_duration_s": 0,
  "db_replica_duration_s": 0,
  "db_primary_duration_s": 0.001,
  "db_main_txn_count": 0,
  "db_ci_txn_count": 0,
  "db_main_replica_txn_count": 0,
  "db_ci_replica_txn_count": 0,
  "db_main_count": 1,
  "db_ci_count": 0,
  "db_main_replica_count": 0,
  "db_ci_replica_count": 0,
  "db_main_write_count": 0,
  "db_ci_write_count": 0,
  "db_main_replica_write_count": 0,
  "db_ci_replica_write_count": 0,
  "db_main_cached_count": 0,
  "db_ci_cached_count": 0,
  "db_main_replica_cached_count": 0,
  "db_ci_replica_cached_count": 0,
  "db_main_wal_count": 0,
  "db_ci_wal_count": 0,
  "db_main_replica_wal_count": 0,
  "db_ci_replica_wal_count": 0,
  "db_main_wal_cached_count": 0,
  "db_ci_wal_cached_count": 0,
  "db_main_replica_wal_cached_count": 0,
  "db_ci_replica_wal_cached_count": 0,
  "db_main_txn_max_duration_s": 0,
  "db_ci_txn_max_duration_s": 0,
  "db_main_replica_txn_max_duration_s": 0,
  "db_ci_replica_txn_max_duration_s": 0,
  "db_main_txn_duration_s": 0,
  "db_ci_txn_duration_s": 0,
  "db_main_replica_txn_duration_s": 0,
  "db_ci_replica_txn_duration_s": 0,
  "db_main_duration_s": 0.001,
  "db_ci_duration_s": 0,
  "db_main_replica_duration_s": 0,
  "db_ci_replica_duration_s": 0,
  "path_traversal_check_duration_s": 0.000244,
  "cpu_s": 0.015407,
  "mem_objects": 9891,
  "mem_bytes": 674808,
  "mem_mallocs": 2503,
  "mem_total_bytes": 1070448,
  "pid": 2899560,
  "worker_id": "puma_2",
  "rate_limiting_gates": [],
  "correlation_id": "01KFZ880TYH9X2PXP2Y8SXGHJB",
  "meta.caller_id": "GET /api/:version/projects/:id/merge_requests/:merge_request_iid/award_emoji",
  "meta.remote_ip": "10.1.100.111",
  "meta.feature_category": "code_review_workflow",
  "meta.client_id": "ip/10.1.100.111",
  "request_urgency": "default",
  "target_duration_s": 1
}

The error is occasionally triggered by the following line from a pipeline script running on our Jenkins instance:

updateGitlabCommitStatus name: 'jenkins', state: 'success'

Observed Weirdness: Even though the Jenkins plugin is calling the Commit Status API, the GitLab log records a 500 error on the award_emoji route.

Edited Jan 28, 2026 by 🤖 GitLab Bot 🤖
Assignee Loading
Time tracking Loading