Итак, я пересобрал свои посты昨晚 после настройки CDN, и всё прошло гладко, за исключением одной задачи Jobs::ProcessPost в Sidekiq, которая постоянно падает и повторяется. В частности, она завершается ошибкой:
Wrapped ArgumentError: Attributes per element limit exceeded
Стек вызовов из /logs выглядит следующим образом…
Сообщение (13 записей)
Исключение в задаче: Attributes per element limit exceeded
Стек вызовов
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.13.8-x86_64-linux/lib/nokogiri/html5/document.rb:85:in `parse' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.13.8-x86_64-linux/lib/nokogiri/html5/document.rb:85:in `do_parse' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.13.8-x86_64-linux/lib/nokogiri/html5/document.rb:43:in `parse' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/nokogiri-1.13.8-x86_64-linux/lib/nokogiri/html5.rb:31:in `HTML5' /var/www/discourse/lib/retrieve_title.rb:21:in `extract_title' /var/www/discourse/lib/retrieve_title.rb:91:in `block in fetch_title' /var/www/discourse/lib/final_destination.rb:499:in `block (4 levels) in safe_get' /var/www/discourse/lib/final_destination.rb:496:in `catch' /var/www/discourse/lib/final_destination.rb:496:in `block (3 levels) in safe_get' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/net-protocol-0.1.3/lib/net/protocol.rb:498:in `call_block'
Хм, я использовал кнопку копирования на странице логов, и, похоже, стек вызовов был обрезан. Если вам понадобится больше информации, я могу её предоставить. Могу сказать точно, что выполнение доходит до cp.post_process:
cp = CookedPostProcessor.new(post, args)
cp.post_process(new_post: args[:new_post])
внутри метода execute класса ProcessPost, а оттуда переходит в post_process_oneboxes.
Теперь я провёл более глубокое расследование и смог найти конкретный пост с помощью консоли Rails. Он содержит только одну ссылку, без изображений и истории редактирования.
Хорошо, и после дополнительного анализа указанной ссылки выяснилось, что это полный и абсолютный мусор. Это пост в блоге, где весь текст был скопирован дословно и в мета-тег og:description, и в twitter:description. Но хуже всего то, и именно это, как я полагаю, вызывает проблему: текст содержит символы " (кавычки), которые не были экранированы, из-за чего оба эти тега полностью ломаются, и большая часть текста воспринимается как атрибуты.
Таким образом, содержимое конкретной ссылки — полный мусор. Возможно, было бы лучше обрабатывать такие случаи отдельно, вместо того чтобы постоянно вызывать сбои в задаче Sidekiq. Не уверен, хотите ли вы заняться этим вопросом?
В остальном у меня остаётся лишь пара вопросов. Во-первых, система в конце концов перестанет пытаться выполнить эту задачу, или мне нужно что-то сделать? Во-вторых, что-нибудь может быть повреждено из-за того, что задача не выполняется успешно, учитывая, что там только текст и одна ссылка?