Details
-
Bug
-
Resolution: Fixed
-
Major
-
Lustre 2.6.0, Lustre 2.4.2
-
3
-
14785
Description
One of our customers hits a crash when mounting OST targets. Here is the system log and backtrace.
LustreError: 5048:0:(obd_class.h:1008:obd_connect()) Device 35 not setup LustreError: 5048:0:(obd_config.c:619:class_cleanup()) Device 35 not setup LustreError: 5048:0:(obd_mount_server.c:1635:osd_start()) ASSERTION( obd->obd_lu_dev ) failed: LustreError: 5048:0:(obd_mount_server.c:1635:osd_start()) LBUG crash> bt PID: 5048 TASK: ffff88085be42b00 CPU: 7 COMMAND: "mount.lustre" #0 [ffff8807c8189ac0] machine_kexec at ffffffff81035f1b #1 [ffff8807c8189b20] crash_kexec at ffffffff810c0f12 #2 [ffff8807c8189bf0] panic at ffffffff8150e884 #3 [ffff8807c8189c70] lbug_with_loc at ffffffffa047deeb [libcfs] #4 [ffff8807c8189c90] server_fill_super at ffffffffa0717673 [obdclass] #5 [ffff8807c8189d70] lustre_fill_super at ffffffffa06e76f8 [obdclass] #6 [ffff8807c8189da0] get_sb_nodev at ffffffff81184bcf #7 [ffff8807c8189de0] lustre_get_sb at ffffffffa06df175 [obdclass] #8 [ffff8807c8189e00] vfs_kern_mount at ffffffff8118420b #9 [ffff8807c8189e50] do_kern_mount at ffffffff811843b2 #10 [ffff8807c8189ea0] do_mount at ffffffff811a4572 #11 [ffff8807c8189f20] sys_mount at ffffffff811a4c00 #12 [ffff8807c8189f80] system_call_fastpath at ffffffff8100b072 RIP: 00000030ce4e909a RSP: 00007fff59ccbb70 RFLAGS: 00010202 RAX: 00000000000000a5 RBX: ffffffff8100b072 RCX: 00002b58cacf1006 RDX: 0000000000408bbf RSI: 00007fff59cd4f28 RDI: 00000000012a3170 RBP: 0000000000000000 R8: 00000000012a3190 R9: 0000000000000000 R10: 0000000001000000 R11: 0000000000000206 R12: 000000000060db18 R13: 000000000060db10 R14: 00000000012a3190 R15: 0000000000000000 ORIG_RAX: 00000000000000a5 CS: 0033 SS: 002b
Lustre release is lustre-2.4.2.
The issue occured on several OSSs, after a first centralized mount of OSTs was interrupted (shine start ... Ctr^C) and relaunched.
I have been able to reproduce the issue on lustre-2.4.2, by launching mount of the same OST target in parallel.
# mntpoint=/mnt/fs1/ost/4 # mntdev=/dev/mapper/mpathe # umount $mntpoint # for i in $(seq 1 10); do dd if=$mntdev of=/dev/null bs=4k count=1M & done ; # /bin/mount -t lustre -o errors=panic $mntdev $mntpoint & \ /bin/mount -t lustre -o errors=panic $mntdev $mntpoint
Launching read IOs on the device in backgroung may help reproduce the issue, since ldiskfs_get_sb() calls set_blocksize() (via get_sb_bdev() and sb_set_blocksize()), which serializes with IOs on the device.
... /* Prevent starting I/O or mapping the device */ percpu_down_write(&bdev->bd_block_size_semaphore);
This probably opens a larger window for a potential race between the two mount operations.
This ticket is certainly related to LU-2134, which is currently unresolved.
I have reproduced the issue on Lustre 2.5.60 with a sligthly different assertion.
<3>[264188.026108] LustreError: 22665:0:(obd_class.h:954:obd_connect()) Device 1 not setup <3>[264188.033999] LustreError: 22665:0:(obd_config.c:615:class_cleanup()) Device 1 not setup <3>[264188.042166] LustreError: 22665:0:(obd_mount_server.c:1735:server_fill_super()) Unable to start osd on /dev/ram0: -19 <3>[264188.052925] LustreError: 22665:0:(obd_mount.c:1335:lustre_fill_super()) Unable to mount (-19) <6>[264189.997203] LDISKFS-fs (ram0): mounted filesystem with ordered data mode. quota=on. Opts: <0>[264190.065537] LustreError: 22664:0:(obd_mount_server.c:1690:osd_start()) ASSERTION( obd ) failed: <0>[264190.074554] LustreError: 22664:0:(obd_mount_server.c:1690:osd_start()) LBUG <4>[264190.081682] Pid: 22664, comm: mount.lustre <4>[264190.085933] <4>[264190.085935] Call Trace: <4>[264190.090213] [<ffffffffa04fd895>] libcfs_debug_dumpstack+0x55/0x80 [libcfs] <4>[264190.097358] [<ffffffffa04fde97>] lbug_with_loc+0x47/0xb0 [libcfs] <4>[264190.103765] [<ffffffffa066e522>] server_fill_super+0x1082/0x1620 [obdclass] <4>[264190.111014] [<ffffffffa0605a6e>] ? obd_zombie_is_idle+0x1e/0x70 [obdclass] <4>[264190.118183] [<ffffffffa0639a68>] lustre_fill_super+0x1d8/0x530 [obdclass] <4>[264190.125268] [<ffffffffa0639890>] ? lustre_fill_super+0x0/0x530 [obdclass] <4>[264190.132326] [<ffffffff8118c7bf>] get_sb_nodev+0x5f/0xa0 <4>[264190.137847] [<ffffffffa06317b5>] lustre_get_sb+0x25/0x30 [obdclass] <4>[264190.144370] [<ffffffff8118be1b>] vfs_kern_mount+0x7b/0x1b0 <4>[264190.150108] [<ffffffff8118bfc2>] do_kern_mount+0x52/0x130 <4>[264190.155751] [<ffffffff811acf9b>] do_mount+0x2fb/0x930 <4>[264190.162326] [<ffffffff811ad660>] sys_mount+0x90/0xe0 <4>[264190.167536] [<ffffffff8100b072>] system_call_fastpath+0x16/0x1b <4>[264190.173699]
In both cases, there is a lack of synchronisation in osd_start() when osd is retrieved from class_name2obd(). Obd device may still be in initialization phase while second mount.lustre process reaches this portion of code.
static int osd_start(struct lustre_sb_info *lsi, unsigned long mflags) { struct lustre_mount_data *lmd = lsi->lsi_lmd; struct obd_device *obd; struct dt_device_param p; char flagstr[16]; int rc; ENTRY; CDEBUG(D_MOUNT, "Attempting to start %s, type=%s, lsifl=%x, mountfl=%lx\n", lsi->lsi_svname, lsi->lsi_osd_type, lsi->lsi_flags, mflags); sprintf(lsi->lsi_osd_obdname, "%s-osd", lsi->lsi_svname); strcpy(lsi->lsi_osd_uuid, lsi->lsi_osd_obdname); strcat(lsi->lsi_osd_uuid, "_UUID"); sprintf(flagstr, "%lu:%lu", mflags, (unsigned long) lmd->lmd_flags); obd = class_name2obd(lsi->lsi_osd_obdname); if (obd == NULL) { rc = lustre_start_simple(lsi->lsi_osd_obdname, lsi->lsi_osd_type, lsi->lsi_osd_uuid, lmd->lmd_dev, flagstr, lsi->lsi_lmd->lmd_opts, lsi->lsi_svname); if (rc) GOTO(out, rc); obd = class_name2obd(lsi->lsi_osd_obdname); LASSERT(obd); } rc = obd_connect(NULL, &lsi->lsi_osd_exp, obd, &obd->obd_uuid, NULL, NULL); if (rc) { obd->obd_force = 1; class_manual_cleanup(obd); lsi->lsi_dt_dev = NULL; } /* XXX: to keep support old components relying on lsi_srv_mnt * we get this info from OSD just started */ LASSERT(obd->obd_lu_dev); lsi->lsi_dt_dev = lu2dt_dev(obd->obd_lu_dev); LASSERT(lsi->lsi_dt_dev); dt_conf_get(NULL, lsi->lsi_dt_dev, &p); lsi->lsi_srv_mnt = p.ddp_mnt; out: RETURN(rc); }
Additional data from the crash dumps is available if needed.
Attachments
Issue Links
- is related to
-
LU-5573 Test timeout conf-sanity test_41c
-
- Resolved
-
-
LU-6553 Recurrence of LU-5299: obd_mount_server.c:1690:osd_start()) ASSERTION( obd ) failed
-
- Resolved
-
-
LU-5606 Interop 2.5.2<->2.6 conf-sanity test_41c: mount MDS failed, Input/output error
-
- Resolved
-
-
LU-5921 conf-sanity test_41c: unexpected concurent OST mounts result, rc=0 rc2=1
-
- Resolved
-
Bruno,
I have tested patch #11139 (patchset 6) on lustre 2.4.3 Bull's branch.
It prevents the crash with the reproducer testcase.
One of the two mount commands fails with the following output message:
Here are the Lustre logs with D_SUPER "super" component log enabled.
So I think the patch is good and fixes the initial issue. Thanks.
We are now waiting positive code reviews.
Note that the lustre 2.4.3 Bull's branch now includes the RETURN() call at the end of error handling of obd_connect() in osd_start() routine. It came from the patch for
LU-2059that has been integrated in our repository several weeks ago.