Describe the bug
When an email address is set in a dynamic segment, the action gets stuck in executing
To Reproduce
Email API action with a dynamic email address:
the triggered emails are stuck in executing:
Expected behavior
It should either fail or execute
Additional context
Could be related to our recent API actions to sidekiq migration. Sidekiq retries 3 times before discarding jobs: https://github.com/restarone/violet_rails/blob/master/config/sidekiq.yml#L3 --
@alis-khadka @Pralish we should implement error tracking for sidekiq https://github.com/mperham/sidekiq/wiki/Error-Handling?source=post_page---------------------------#error-handlers
we are currently doing it via exception notification: https://github.com/restarone/violet_rails/blob/master/config/environments/staging.rb#L139-L151
@Pralish @alis-khadka I added exception notification for sidekiq jobs, here's the error that happens when the email is being parsed:
A SyntaxError occurred in background at 2022-08-23 19:26:39 UTC :
(erb):3: unknown type of %string
...?name=".freeze; _erbout.<<((%20api_resource.properties%5B'na...
... ^~~
(erb):3: syntax error, unexpected end-of-input
...?name=".freeze; _erbout.<<((%20api_resource.properties%5B'na...
... ^~~
/home/ubuntu/.rbenv/versions/2.6.6/lib/ruby/2.6.0/erb.rb:901:in `eval'
-------------------------------
Backtrace:
-------------------------------
/home/ubuntu/.rbenv/versions/2.6.6/lib/ruby/2.6.0/erb.rb:901:in `eval'
/home/ubuntu/.rbenv/versions/2.6.6/lib/ruby/2.6.0/erb.rb:901:in `result'
/var/www/violet/releases/20220823191858/app/models/concerns/dynamic_attribute.rb:26:in `parse_dynamic_attribute'
/var/www/violet/releases/20220823191858/app/models/concerns/dynamic_attribute.rb:53:in `block (2 levels) in attr_dynamic'
/var/www/violet/releases/20220823191858/app/views/api_action_mailer/send_email.html.erb:7:in `_app_views_api_action_mailer_send_email_html_erb___2672076131284978545_46991628538720'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/base.rb:247:in `public_send'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/base.rb:247:in `_run'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/template.rb:154:in `block in render'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/notifications.rb:205:in `instrument'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/template.rb:345:in `instrument_render_template'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/template.rb:152:in `render'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/renderer/template_renderer.rb:61:in `block (2 levels) in render_template'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/notifications.rb:203:in `block in instrument'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/notifications.rb:203:in `instrument'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/renderer/template_renderer.rb:56:in `block in render_template'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/renderer/template_renderer.rb:75:in `render_with_layout'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/renderer/template_renderer.rb:55:in `render_template'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/renderer/template_renderer.rb:11:in `render'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/renderer/renderer.rb:61:in `render_template_to_object'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/renderer/renderer.rb:29:in `render_to_object'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/rendering.rb:117:in `block in _render_template'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/base.rb:273:in `in_rendering_context'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/rendering.rb:116:in `_render_template'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/rendering.rb:103:in `render_to_body'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionpack-6.1.5/lib/abstract_controller/rendering.rb:25:in `render'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/base.rb:958:in `block in collect_responses_from_templates'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/base.rb:955:in `each'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/base.rb:955:in `each'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/base.rb:955:in `map'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/base.rb:955:in `collect_responses_from_templates'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/base.rb:933:in `collect_responses'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/base.rb:841:in `mail'
/var/www/violet/releases/20220823191858/app/mailers/api_action_mailer.rb:10:in `send_email'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionpack-6.1.5/lib/abstract_controller/base.rb:228:in `process_action'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionpack-6.1.5/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/callbacks.rb:117:in `block in run_callbacks'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actiontext-6.1.5/lib/action_text/rendering.rb:20:in `with_renderer'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actiontext-6.1.5/lib/action_text/engine.rb:59:in `block (4 levels) in <class:Engine>'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/callbacks.rb:126:in `instance_exec'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/callbacks.rb:126:in `block in run_callbacks'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/callbacks.rb:137:in `run_callbacks'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionpack-6.1.5/lib/abstract_controller/callbacks.rb:41:in `process_action'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionpack-6.1.5/lib/abstract_controller/base.rb:165:in `process'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/rescuable.rb:25:in `block in process'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/rescuable.rb:17:in `handle_exceptions'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/rescuable.rb:24:in `process'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionview-6.1.5/lib/action_view/rendering.rb:39:in `process'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/base.rb:615:in `block in process'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/notifications.rb:203:in `block in instrument'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/notifications.rb:203:in `instrument'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/base.rb:614:in `process'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/message_delivery.rb:128:in `block in processed_mailer'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/message_delivery.rb:127:in `tap'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/message_delivery.rb:127:in `processed_mailer'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/actionmailer-6.1.5/lib/action_mailer/message_delivery.rb:118:in `deliver_now'
/var/www/violet/releases/20220823191858/app/models/api_action.rb:54:in `send_email'
/var/www/violet/releases/20220823191858/app/models/api_action.rb:43:in `execute_action'
/var/www/violet/releases/20220823191858/app/models/api_resource.rb:85:in `block (2 levels) in execute_model_context_api_actions'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activerecord-6.1.5/lib/active_record/relation/delegation.rb:88:in `each'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activerecord-6.1.5/lib/active_record/relation/delegation.rb:88:in `each'
/var/www/violet/releases/20220823191858/app/models/api_resource.rb:84:in `block in execute_model_context_api_actions'
/var/www/violet/releases/20220823191858/app/models/api_resource.rb:72:in `each'
/var/www/violet/releases/20220823191858/app/models/api_resource.rb:72:in `execute_model_context_api_actions'
/var/www/violet/releases/20220823191858/app/sidekiq/fire_api_actions_job.rb:11:in `block in perform'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/current_attributes.rb:188:in `set'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/current_attributes.rb:135:in `set'
/var/www/violet/releases/20220823191858/app/sidekiq/fire_api_actions_job.rb:8:in `perform'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:196:in `execute_job'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/middleware/chain.rb:138:in `block in invoke'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/ros-apartment-sidekiq-1.2.0/lib/apartment/sidekiq/middleware/server.rb:5:in `block in call'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/ros-apartment-2.9.0/lib/apartment/adapters/abstract_adapter.rb:89:in `switch'
/home/ubuntu/.rbenv/versions/2.6.6/lib/ruby/2.6.0/forwardable.rb:230:in `switch'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/ros-apartment-sidekiq-1.2.0/lib/apartment/sidekiq/middleware/server.rb:4:in `call'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/middleware/chain.rb:140:in `block in invoke'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/middleware/chain.rb:143:in `invoke'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:163:in `block in process'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/job_retry.rb:114:in `local'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/rails.rb:14:in `block in call'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/execution_wrapper.rb:91:in `wrap'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/reloader.rb:72:in `block in wrap'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/execution_wrapper.rb:91:in `wrap'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/reloader.rb:71:in `wrap'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/rails.rb:13:in `call'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:257:in `stats'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/job_logger.rb:13:in `call'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/job_retry.rb:81:in `global'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:124:in `block in dispatch'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/job_logger.rb:39:in `prepare'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:123:in `dispatch'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:162:in `process'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:78:in `process_one'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/processor.rb:68:in `run'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/util.rb:56:in `watchdog'
/var/www/violet/shared/bundle/ruby/2.6.0/gems/sidekiq-6.4.1/lib/sidekiq/util.rb:65:in `block in safe_thread'
here lies the problem @Ayon95 -- it looks like your code got sanitized somehow (notice the extra characters). @Pralish @alis-khadka how can we prevent this from happening? It works intermittently.