Проблема с ревизиями постов после обновления до 2.8.6 stable или 2.9.0.beta7

Мы заметили некоторые посты, в которых не отображаются предыдущие версии:

(текста нет вообще, обратите внимание на NaN в посте с тремя версиями)

В консоли я вижу ошибку 500 на /posts/X/revisions/latest.json.

В /logs я вижу ошибку ниже. Это на версии 2.8.6. Мы заметили это только после обновления вчера с версии 2.8.4, но я не могу гарантировать, что это связано, так как мы заметили это только в нескольких постах. Я пытался пересобрать контейнер, но это не помогло.

Psych::DisallowedClass (Попытка загрузить неуказанный класс: Symbol)
app/serializers/post_revision_serializer.rb:233:in `block in all_revisions'
app/serializers/post_revision_serializer.rb:228:in `each'
app/serializers/post_revision_serializer.rb:228:in `all_revisions'
app/serializers/post_revision_serializer.rb:187:in `revisions'
app/serializers/post_revision_serializer.rb:254:in `previous'
app/serializers/post_revision_serializer.rb:50:in `previous_hidden'
(eval):5:in `_fast_attributes'
app/controllers/application_controller.rb:510:in `render_json_dump'
app/controllers/posts_controller.rb:425:in `latest_revision'
app/controllers/application_controller.rb:387:in `block in with_resolved_locale'
app/controllers/application_controller.rb:387:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:361:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
lib/middleware/enforce_hostname.rb:23:in `call'
lib/middleware/request_tracker.rb:198:in `call'

Трассировка стека:

/usr/local/lib/ruby/2.7.0/psych/class_loader.rb:97:in `find'
/usr/local/lib/ruby/2.7.0/psych/class_loader.rb:28:in `load'
/usr/local/lib/ruby/2.7.0/psych/class_loader.rb:39:in `block (2 levels) in <class:ClassLoader>'
/usr/local/lib/ruby/2.7.0/psych/class_loader.rb:32:in `symbolize'
/usr/local/lib/ruby/2.7.0/psych/class_loader.rb:82:in `symbolize'
/usr/local/lib/ruby/2.7.0/psych/scalar_scanner.rb:74:in `tokenize'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:60:in `deserialize'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:123:in `visit_Psych_Nodes_Scalar'
/usr/local/lib/ruby/2.7.0/psych/visitors/visitor.rb:16:in `visit'
/usr/local/lib/ruby/2.7.0/psych/visitors/visitor.rb:6:in `accept'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:32:in `accept'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:339:in `block in revive_hash'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:338:in `each'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:338:in `each_slice'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:338:in `revive_hash'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:162:in `visit_Psych_Nodes_Mapping'
/usr/local/lib/ruby/2.7.0/psych/visitors/visitor.rb:16:in `visit'
/usr/local/lib/ruby/2.7.0/psych/visitors/visitor.rb:6:in `accept'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:32:in `accept'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:332:in `block in register_empty'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:332:in `each'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:332:in `register_empty'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:141:in `visit_Psych_Nodes_Sequence'
/usr/local/lib/ruby/2.7.0/psych/visitors/visitor.rb:16:in `visit'
/usr/local/lib/ruby/2.7.0/psych/visitors/visitor.rb:6:in `accept'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:32:in `accept'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:340:in `block in revive_hash'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:338:in `each'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:338:in `each_slice'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:338:in `revive_hash'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:162:in `visit_Psych_Nodes_Mapping'
/usr/local/lib/ruby/2.7.0/psych/visitors/visitor.rb:16:in `visit'
/usr/local/lib/ruby/2.7.0/psych/visitors/visitor.rb:6:in `accept'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:32:in `accept'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:313:in `visit_Psych_Nodes_Document'
/usr/local/lib/ruby/2.7.0/psych/visitors/visitor.rb:16:in `visit'
/usr/local/lib/ruby/2.7.0/psych/visitors/visitor.rb:6:in `accept'
/usr/local/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:32:in `accept'
/usr/local/lib/ruby/2.7.0/psych.rb:360:in `safe_load'
activerecord (6.1.6.1) lib/active_record/coders/yaml_column.rb:50:in `yaml_load'
activerecord (6.1.6.1) lib/active_record/coders/yaml_column.rb:26:in `load'
activerecord (6.1.6.1) lib/active_record/type/serialized.rb:22:in `deserialize'
activemodel (6.1.6.1) lib/active_model/type/helpers/mutable.rb:8:in `cast'
activemodel (6.1.6.1) lib/active_model/attribute.rb:175:in `type_cast'
activemodel (6.1.6.1) lib/active_model/attribute.rb:43:in `value'
activemodel (6.1.6.1) lib/active_model/attribute_set.rb:42:in `fetch_value'
activerecord (6.1.6.1) lib/active_record/attribute_methods/read.rb:36:in `_read_attribute'
activemodel (6.1.6.1) lib/active_model/attribute_methods.rb:254:in `modifications'
app/serializers/post_revision_serializer.rb:233:in `block in all_revisions'
app/serializers/post_revision_serializer.rb:228:in `each'
app/serializers/post_revision_serializer.rb:228:in `all_revisions'
app/serializers/post_revision_serializer.rb:187:in `revisions'
app/serializers/post_revision_serializer.rb:254:in `previous'
app/serializers/post_revision_serializer.rb:50:in `previous_hidden'
(eval):5:in `_fast_attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:456:in `attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:480:in `_serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:359:in `serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:347:in `as_json'
activesupport (6.1.6.1) lib/active_support/json/encoding.rb:22:in `encode'
activesupport (6.1.6.1) lib/active_support/json/encoding.rb:22:in `encode'
activesupport (6.1.6.1) lib/active_support/core_ext/object/json.rb:43:in `to_json'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:331:in `to_json'
multi_json (1.15.0) lib/multi_json/adapters/oj.rb:56:in `dump'
multi_json (1.15.0) lib/multi_json/adapters/oj.rb:56:in `dump'
multi_json (1.15.0) lib/multi_json/adapter.rb:25:in `dump'
multi_json (1.15.0) lib/multi_json.rb:139:in `dump'
app/controllers/application_controller.rb:510:in `render_json_dump'
app/controllers/posts_controller.rb:425:in `latest_revision'
actionpack (6.1.6.1) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (6.1.6.1) lib/abstract_controller/base.rb:228:in `process_action'
actionpack (6.1.6.1) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (6.1.6.1) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport (6.1.6.1) lib/active_support/callbacks.rb:117:in `block in run_callbacks'
app/controllers/application_controller.rb:387:in `block in with_resolved_locale'
i18n (1.8.11) lib/i18n.rb:314:in `with_locale'
app/controllers/application_controller.rb:387:in `with_resolved_locale'
activesupport (6.1.6.1) lib/active_support/callbacks.rb:126:in `block in run_callbacks'
activesupport (6.1.6.1) lib/active_support/callbacks.rb:137:in `run_callbacks'
actionpack (6.1.6.1) lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack (6.1.6.1) lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack (6.1.6.1) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
activesupport (6.1.6.1) lib/active_support/notifications.rb:203:in `block in instrument'
activesupport (6.1.6.1) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport (6.1.6.1) lib/active_support/notifications.rb:203:in `instrument'
actionpack (6.1.6.1) lib/action_controller/metal/instrumentation.rb:33:in `process_action'
actionpack (6.1.6.1) lib/action_controller/metal/params_wrapper.rb:249:in `process_action'
activerecord (6.1.6.1) lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack (6.1.6.1) lib/abstract_controller/base.rb:165:in `process'
actionview (6.1.6.1) lib/action_view/rendering.rb:39:in `process'
rack-mini-profiler (2.3.3) lib/mini_profiler/profiling_methods.rb:111:in `block in profile_method'
actionpack (6.1.6.1) lib/action_controller/metal.rb:190:in `dispatch'
actionpack (6.1.6.1) lib/action_controller/metal.rb:254:in `dispatch'
actionpack (6.1.6.1) lib/action_dispatch/routing/route_set.rb:50:in `dispatch'
actionpack (6.1.6.1) lib/action_dispatch/routing/route_set.rb:33:in `serve'
actionpack (6.1.6.1) lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack (6.1.6.1) lib/action_dispatch/journey/router.rb:32:in `each'
actionpack (6.1.6.1) lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack (6.1.6.1) lib/action_dispatch/routing/route_set.rb:842:in `call'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
rack (2.2.3) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.2.3) lib/rack/conditional_get.rb:27:in `call'
rack (2.2.3) lib/rack/head.rb:12:in `call'
actionpack (6.1.6.1) lib/action_dispatch/http/permissions_policy.rb:22:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:361:in `call'
rack (2.2.3) lib/rack/session/abstract/id.rb:266:in `context'
rack (2.2.3) lib/rack/session/abstract/id.rb:260:in `call'
actionpack (6.1.6.1) lib/action_dispatch/middleware/cookies.rb:689:in `call'
actionpack (6.1.6.1) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport (6.1.6.1) lib/active_support/callbacks.rb:98:in `run_callbacks'
actionpack (6.1.6.1) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack (6.1.6.1) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'
actionpack (6.1.6.1) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'
actionpack (6.1.6.1) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
logster (2.10.1) lib/logster/middleware/reporter.rb:43:in `call'
railties
2 лайка

Это публичный сайт? Можете ли вы предоставить ссылку на затронутые сообщения? (Если предпочитаете, можно через личные сообщения).

3 лайка

Отправлено через личные сообщения. Готов отправить другим, если потребуется.

2 лайка

Я быстро просмотрел ссылки, которые вы предоставили, и, похоже, что посты с отсутствующими версиями редактирования — это те, у которых в заголовке темы указаны даты. У вас есть компонент темы, который их добавляет?

4 лайка

Не совсем понятно, имеете ли вы в виду заголовок темы или что-то другое. Заголовки тем, несмотря на их внешний вид, добавляются вручную. Хотя, да, обе проблемные посты, похоже, находятся в общей родительской категории, где люди организуют встречи.

Мы используем плагин paviliondev/discourse-events, и у тем в этой категории есть связанное событие в первом посте (именно там возникает эта проблема). Однако отключение плагина через безопасный режим не помогло вернуть работу ревизий.

Что ещё я мог бы попробовать?

3 лайка

Я думаю, это должно быть связано с SECURITY: Bump Rails to 6.1.6.1 (stable) (#17470) · discourse/discourse@bb287c6 · GitHub. Я сейчас просматриваю некоторые из наших собственных сайтов, и кажется, что у нас есть несколько похожих записей об ошибках в логах. Исправлю это и обновлю информацию здесь, когда всё будет готово :eyes:

6 лайков

Это должно быть исправлено в FIX: Allow Time objects to be deserialized in PostRevision (#17501) · discourse/discourse@7d9b98a · GitHub

а также в стабильной ветке FIX: Allow Time objects to be deserialized in PostRevision (stable) (… · discourse/discourse@5d2ecce · GitHub

Чтобы обновить стандартную установку, перейдите по адресу /admin/upgrade

7 лайков

После обновления я всё ещё сталкиваюсь с этой проблемой.


Это происходит реже, но всё ещё случается время от времени.

3 лайка

Спасибо за быструю работу. Но, боюсь, это не решило проблему для нас. Два упомянутых мной поста ведут себя так же — видимых версий нет. Пробовал и /admin/upgrade, и полную пересборку.

2 лайка

Извините за это! Это исправление помогло устранить похожие ошибки, которые мы наблюдали на нашем хостинге, поэтому на вашем сайте, скорее всего, есть ещё какие-то дополнительные факторы. Скорее всего, это связано с плагином или импортом.

Пожалуйста, перейдите в /logs и проверьте наличие ошибок, подобных этой:

Psych::DisallowedClass (Tried to load unspecified class: Time)

Версия с “Time” — единственная, которую мы наблюдали, и она теперь должна быть исправлена. Какие ещё ошибки “unspecified class” вы видите в своих логах?

1 лайк

А, значит, возможно, это не та же проблема.

Все ошибки Psych::DisallowedClass, которые мы наблюдали, касаются класса unspecified class: Symbol, как указано в стеке вызовов, опубликованном ранее.

Я попытался отключить события (из плагина paviliondev/discourse-events) для этой конкретной категории, но это само по себе, похоже, ничего не изменило.

Даёт ли вышеуказанная ошибка какие-либо подсказки, прежде чем я перейду к попытке отключить плагин на всём форуме (что потребует пересборки)?

2 лайка

К сожалению, я не думаю, что отключение плагина что-то изменит. Проблемные данные уже хранятся в базе данных, так что они останутся там. Я считаю, что мы можем безопасно добавить Symbol в список разрешённых классов. Я это сделаю :eyes:

Редактирование: для ясности, это не совсем вина плагина. Ранее в PostRevision разрешалось хранить данные любого типа. Проблема безопасности в Rails вынудила нас внезапно изменить поведение и ограничить разрешённые типы данных.

3 лайка

Пожалуйста, попробуйте обновить снова, @mentalstring — я только что отправил FIX: Allow Symbol objects to be deserialized in PostRevision (stable)… · discourse/discourse@f0ef186 · GitHub

3 лайка

Вот и всё — теперь всё работает как ожидалось! :+1:

Спасибо, что так быстро занялись этим вопросом.

3 лайка

Привет, после обновления это всё ещё не работает.

@darkpixlz, пожалуйста, выполните следующие шаги и сообщите, что вы обнаружите:


Я вижу только это.

Хм, хорошо, похоже, у вас есть ошибки для User и Group. Можете ли вы предоставить список установленных на сайте плагинов?

1 лайк

Плагины:
Discourse-Akismet
Discourse Apple Login
Discourse BCC
Discourse Cakeday
Discourse Calendar
Discourse Chat
Discourse Custom Wizard
Discourse follow
Discourse Gamification
Discourse Mate
Discourse Microsoft login
Discourse ImgFlip
Discourse Promethehus
Discourse Ratings
Discourse Solved
Discourse Spoiler
Discourse Steam Login
Discourse Tickets
Discourse Userr Network
Discourse User Notes
Discourse Voting
Discourse QA
Discourse Who’s online
Discourse Yearly Review
Discourse Manager
Styleguide
Я могу предоставить компоненты, если вы хотите.

1 лайк

То есть, у нас есть практически все работающие плагины :rofl:

1 лайк