آسف لعدم اتباع القالب.
تم العثور على هذه المشكلة _ المحتملة من خلال مراجعة التعليمات البرمجية.
الكود المعني:
ج
if (scan_ds_queue_contains (scn، ds1-> ds_object، & mintxg)) {
scan_ds_queue_remove (scn ، ds1-> ds_object) ؛
scan_ds_queue_insert (scn ، ds2-> ds_object ، mintxg) ؛
}
if (scan_ds_queue_contains (scn، ds2-> ds_object، & mintxg)) {
scan_ds_queue_remove (scn ، ds2-> ds_object) ؛
scan_ds_queue_insert (scn ، ds1-> ds_object ، mintxg) ؛
}
""
أرى مشكلتين محتملتين.
إذا كان الشرط الأول صحيحًا ، فسيكون الشرط الثاني دائمًا صحيحًا أيضًا.
هذا لأن الكتلة الأولى تستبدل ds1->ds_object
بـ ds2->ds_object
في قائمة الانتظار.
لذا ، فإن الكتلة الثانية ستقوم باستبدال عكسي.
أشعر أنه من غير المحتمل أن يكون هذا هو السلوك المقصود.
أيضًا ، أعتقد أنه من الممكن أن يكون كلا من ds1->ds_object
و ds2->ds_object
موجودًا بالفعل في قائمة الانتظار. إذا كان الأمر كذلك ، فسيحاول الرمز إجراء إدراج مكرر.
ربما يجب أن يتحقق الرمز أولاً مما إذا كانت معرفات الكائنات موجودة في قائمة الانتظار وتذكر النتائج.
ثم قم بإجراء عمليات الإزالة الضرورية (إذا كان أي من المعرّفين موجودًا ، فيجب إزالة كلا المعرّفين؟).
ثم قم بإجراء عمليات الإدراج الضرورية (أدخل المعرف الآخر لكل معرف موجود أصلاً).
CC:ahrenstcaputi
أعتقد أن خطأ FreeBSD 239566 هو نفس المشكلة. يحدث هذا الانهيار عندما يكون كل من ds1
و ds2
قائمة الانتظار بالفعل عندما يتم استدعاء dsl_scan_ds_clone_swapped()
.
أعتقد أنك على صواب. ربما يجب أن يكون لدينا فقط عبارات if / else منفصلة لكل حالة.
مرحبًا بالجميع - متابعة فقط. هذه ليست قضية نظرية. يحدث بدون الإصلاح. لذا شكرا للاعتناء بها!
VERIFY3(avl_find(&scn->scn_queue, sds, &where) == ((void *)0)) failed (00000000185a2639 == (null))
2020-05-26T11:59:00.867230+00:00 kern.emerg usw2-bfyii-307 kernel: [6444694.715839] PANIC at dsl_scan.c:1101:scan_ds_queue_insert()
1 7ddba5456e65ef9403f3e1c6d4ae2eb9 /proc/23127/stack
[<0>] spl_panic+0xfa/0x110 [spl]
[<0>] scan_ds_queue_insert+0x8e/0xc0 [zfs]
[<0>] dsl_scan_ds_clone_swapped+0x2dc/0x3c0 [zfs]
[<0>] dsl_dataset_clone_swap_sync_impl+0x9a2/0xa50 [zfs]
[<0>] dmu_recv_end_sync+0xd7/0x480 [zfs]
[<0>] dsl_sync_task_sync+0x11c/0x120 [zfs]
[<0>] dsl_pool_sync+0x295/0x340 [zfs]
[<0>] spa_sync+0x3d6/0x8c0 [zfs]
[<0>] txg_sync_thread+0x29b/0x340 [zfs]
[<0>] thread_generic_wrapper+0x74/0x90 [spl]
[<0>] kthread+0x105/0x140
[<0>] ret_from_fork+0x35/0x40
[<0>] 0xffffffffffffffff
التعليق الأكثر فائدة
مرحبًا بالجميع - متابعة فقط. هذه ليست قضية نظرية. يحدث بدون الإصلاح. لذا شكرا للاعتناء بها!