أحاول دمج حسابات المستخدمين

أنا مسؤول عن منتدى. طلب أحد المستخدمين دمج حسابه القديم مع حسابه الجديد.
النشاط الخاص به هو كالتالي:

عندما حاولت دمج الحسابات، علق الموقع على “جارٍ دمج الحسابات…”. تركته لمدة 10 دقائق ولكن لم يحدث شيء.
ماذا أفعل هنا؟

هل تم دمجه عن طريق الخطأ ولم يتم تحديث واجهة المستخدم؟ حاول فتح صفحة المسؤول للمستخدم الذي كان يجب حذفه في علامة تبويب أخرى.

أتذكر أن هذا حدث لي بشكل متقطع عندما قمت بدمج الحسابات، وأظهر إعادة التحميل أنه تم دمج الحساب المعني، لكن الصفحة لم تقم بإعادة التوجيه لتعكس ذلك.

للأسف لا - كلا الحسابين لا يزالان نشطين.
أرى إخلاء مسؤولية مفاده “لا يمكن حذف المستخدمين إذا كان لديهم منشورات”… هذا الرجل لديه 4 آلاف منشور تم إنشاؤها…
أي نصيحة هناك؟

لا ينبغي أن يكون ذلك مشكلة بما أنك تقوم بالدمج… هل هناك أي أخطاء في وحدة تحكم المتصفح أو أخطاء ذات صلة في /logs؟

إعجاب واحد (1)

لقد واجهت مشكلة كهذه واعتقدت أنه يجب علي مشاركة النتائج التي توصلت إليها هنا في حال كان ذلك قد يساعد أي شخص آخر يواجهها.

في حالتي، علقت عملية دمج الحساب إلى الأبد مع ظهور مربع حوار “تقدم الدمج” يتنقل ذهابًا وإيابًا بين رسالتي “تغيير ملكية المنشورات…” و"تحديث اسم المستخدم…".

من خلال النظر إلى سجلات إجراءات الموظفين (/admin/logs/staff_action_logs
يمكنني أن أرى أنه على الرغم من نقل ملكية العديد من المنشورات فورًا بعد أن قمت بتشغيل الدمج، لم تكن هناك إجراءات إضافية، مما يثبت أن العملية قد علقت بالفعل بدلاً من أن تستغرق وقتًا طويلاً جدًا لمعالجة جميع المنشورات.

عندما تحققت من سجلات الأخطاء (/logs/)، رأيت أن خطأ “Job exception: topic” كان يتم إنتاجه بشكل دوري، مع تتبع المكدس:

/var/www/discourse/app/services/post_owner_changer.rb:12:in `block in initialize'
/var/www/discourse/app/services/post_owner_changer.rb:11:in `each'
/var/www/discourse/app/services/post_owner_changer.rb:11:in `initialize'
/var/www/discourse/app/services/user_merger.rb:84:in `new'
/var/www/discourse/app/services/user_merger.rb:84:in `change_post_owner'
/var/www/discourse/app/services/user_merger.rb:72:in `block in move_posts'
/var/www/discourse/app/services/user_merger.rb:70:in `each'
/var/www/discourse/app/services/user_merger.rb:70:in `move_posts'
/var/www/discourse/app/services/user_merger.rb:14:in `merge!'
/var/www/discourse/app/jobs/regular/merge_user.rb:15:in `execute'
/var/www/discourse/app/jobs/base.rb:316:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:303:in `block in perform'
/var/www/discourse/app/jobs/base.rb:299:in `each'
/var/www/discourse/app/jobs/base.rb:299:in `perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:220:in `execute_job'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:185:in `block (4 levels) in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:180:in `traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/lib/sidekiq/discourse_event.rb:6:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/lib/sidekiq/pausable.rb:131:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job/interrupt_handler.rb:9:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:26:in `track'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:134:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:173:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:184:in `block (3 levels) in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:145:in `block (6 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_retry.rb:118:in `local'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:144:in `block (5 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/config.rb:39:in `block in <class:Config>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:139:in `block (4 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:281:in `stats'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:134:in `block (3 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_logger.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:133:in `block (2 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_retry.rb:85:in `global'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:132:in `block in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_logger.rb:40:in `prepare'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:131:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:183:in `block (2 levels) in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `block in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:86:in `process_one'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:76:in `run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/component.rb:10:in `watchdog'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/component.rb:19:in `block in safe_thread'

والبيئة كالتالي:

hostname    [...]
process_id    701
application_version    3146142c2ed2c880d53b2f8c136af9f46df99b59
current_db    default
current_hostname    forum.arduino.cc
job    Jobs::MergeUser
problem_db    default
time    8:15 am
opts
user_id    42
target_user_id    123
current_user_id    456
current_site_id    default

أخيرًا، توصلت إلى أن التعليق كان ناتجًا عن حساب المستخدم “من” الذي لديه منشورات “يتيمة”. بقصد “يتيمة”، أعني أنه كان هناك إدخال في قاعدة البيانات للمنشور، ولكن لم يكن هناك إدخال للموضوع المرتبط بهذا المنشور.

يمكنك التحقق من وجود “منشورات يتيمة” في حساب مستخدم معين عن طريق تشغيل استعلام Data Explorer هذا:

-- [params]
-- integer :user_id

SELECT
  posts.id,
  posts.topic_id
FROM
  posts
WHERE
  posts.user_id = :user_id
  AND posts.topic_id NOT IN (
    SELECT
      topics.id
    FROM
      topics
  )

بعد إزالة المنشورات اليتيمة من قاعدة البيانات (بفضل المساعدة من فريق Discourse نظرًا لأننا نستخدم خطة استضافة)، تمكنت من إكمال عملية دمج الحساب بنجاح.

3 إعجابات

شكرًا @per1234 لمشاركة خطوات استكشاف الأخطاء وإصلاحها!

@Nick_Torres هل تمكنت من حل مشكلتك؟

لقد أضفت علامة merge-user للمساعدة في الفرز المستقبلي. يبدو أن هناك بعض الحالات الشاذة التي يتم فيها مقاطعة الدمج بدون رسالة خطأ مفيدة.