From 23ec819e708cac7fec6a0f68f845ce86a46ac87c Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 19 Aug 2022 11:30:46 +0100 Subject: [PATCH] DEV: Introduce debugging rake task for PostRevision issues (#17998) See https://meta.discourse.org/t/232885 for context. This rake task enumerates problematic records and prints out a sample of each failure. --- lib/tasks/revisions.rake | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 lib/tasks/revisions.rake diff --git a/lib/tasks/revisions.rake b/lib/tasks/revisions.rake new file mode 100644 index 0000000000000..722d67471decb --- /dev/null +++ b/lib/tasks/revisions.rake @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +desc 'Print debug information about post_revisions which cannot be deserialized' +task 'revisions:debug_deserialization' => :environment do + puts "Checking #{PostRevision.count} PostRevision records in batches of 1000... this may take some time..." + sleep 1 + + counts = Hash.new(0) + examples = Hash.new() + + PostRevision.find_each do |revision| + revision.modifications + rescue Psych::DisallowedClass => e + class_name = e.message.sub("Tried to load unspecified class: ", "") + counts[class_name] += 1 + examples[class_name] ||= revision + puts "#{Discourse.base_url}/p/#{revision.post_id} (revision number:#{revision.number} id:#{revision.id}) #{e.message}" + end + + puts + puts "Done" + puts + + puts "---- Summary ----" + puts "Checked records: #{PostRevision.count}" + counts.each_pair { |k, v| puts " #{k}: #{v}" } + + puts + puts "---- Examples ----" + puts + examples.each_pair do |class_name, revision| + puts "-- BEGIN Example #{class_name} --" + puts + puts revision.modifications_before_type_cast + puts + puts "-- END Example #{class_name} --" + end +end