Project

General

Profile

Actions

Bug #1317

closed

deadlocks modifying ceph.ko-mounted filesystem on osd (and mon?)

Added by Alexandre Oliva almost 13 years ago. Updated almost 13 years ago.

Status:
Won't Fix
Priority:
Normal
Assignee:
-
Category:
-
Target version:
-
% Done:

0%

Source:
Tags:
Backport:
Regression:
Severity:
Reviewed:
Affected Versions:
ceph-qa-suite:
Pull request ID:
Crash signature (v1):
Crash signature (v2):

Description

I've observed frequent system deadlocks while writing lots of data to the kernel-mounted ceph filesystem, which do not occur if I disable the osd on that host while uploading the files.

I suspect it has to do with sync() filesystem calls, that end up partially-blocking the osd and/or the monitor that calls sync() until it completes, which in turn prevents the ceph filesystem from flushing all data to disk: deadlock.

I suspect the new syncfs() calls may be a solution to this, but other than separating mon/osd and clients on separate (virtual?) machines, are there any other ways around this? Or is there more to the problem than just sync() calls?

E.g., at times I can't kill the monitor that ceph.ko has bound to, but even after kill -9 it keeps the channel to other monitors open, so they don't regard it as dead. I think this happens when the monitor calls sync() but the filesystem was not active due to a recovering mds. Recovery will only progress if I restart one of the other monitors, so that it starts and completes an election, taking over from the zombine monitor. (It doesn't help keep things running smoothly that the kernel client often fails to reconnect in time, and then its reconnect is denied, which leads to long waits, oopses and need for reboots).

This all was last observed with kernel 2.6.38.8, ceph 0.31, all btrfs, using separate volumes or separate filesystems for mon and osd.

Actions #1

Updated by Greg Farnum almost 13 years ago

  • Status changed from New to Won't Fix

Circular syncs are definitely one problem, which syncfs should solve. If you have a sufficiently new libc and kernel syncfs ought to work for you.

However, there's a more serious problem in that if you have an OSD and a kernel client running on the same server: if the system runs out of memory and tries to page out data then the kernel client can try and flush out its buffer to the OSD, and the OSD can try to allocate memory to satisfy the requirements, but the system doesn't have any free memory...deadlock!

Actions

Also available in: Atom PDF