Re: Finding and breaking client locks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Mar 21, 2016 at 11:39:14AM -0300, Christian Robottom Reis wrote:
> indeed does not return any information pertaining NFS client locks, and
> I'm not clear whether /proc/locks (on the server side obviously) does or
> not.

Somewhat OT, but I find it a PITA that /proc/locks gives inode numbers
that then need to be looked up individually. I have often been surprised
no tool exists to parse that and give you back a report of filenames, so
I just put together a small tool that just offloads the work to debugfs.

I've attached it in case others might find it useful.

(Interestingly, in a network of Ubuntu desktops, the long-term remote lock
holders are basically Spotify, Firefox and Zeitgeist, of which the
latter two are essentially sqlite.)
-- 
Christian Robottom Reis | [+55 16] 3376 0125   | http://async.com.br/~kiko
                        | [+55 16] 991 126 430 | http://launchpad.net/~kiko
#!/usr/bin/env python3
import os
import sys
import subprocess
import io

locksdb = open("/proc/locks")
device_inodes = {}
for lockline in locksdb:
    lock_inode_raw = lockline.split()[5]
    lock_inode = lock_inode_raw.split(":")
    if len(lock_inode) < 3:
        #print("Ignoring %s" % lock_inode)
        continue
    device = tuple(map(int,lock_inode[0:2]))
    try:
        target_device = os.readlink("/sys/dev/block/%s:%s" % device)
        target_device = target_device.split("/")[-1]
    except OSError:
        #print("Device %s:%s not found" % device)
        continue
    inode = lock_inode[2]
    if not device_inodes.get(target_device):
            device_inodes[target_device] = []
    device_inodes[target_device].append(inode)

for device in device_inodes:
    print("-> Inodes on %s" % device)
    inode_input = []
    for inode in device_inodes[device]:
        inode_input.append("ncheck %s" % inode)
    debugfs = subprocess.Popen(['debugfs', '/dev/%s' % device],
                     stdin=subprocess.PIPE,
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)
    debugfs_input = "\n".join(inode_input)
    out, err = debugfs.communicate(input=debugfs_input.encode())
    debugfs_output = out.decode()
    for line in debugfs_output.split("\n"):
        if line.startswith("debugfs:"):
            continue
        if line.startswith("Inode"):
            continue
        print(line)



[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux