Skip to content

.pack and .idx file descriptors left open #304

Closed
@jantman

Description

@jantman

Sorry, but I believe I found another issue. It appears (maybe I'm missing something here, because this seems very strange to me) that file descriptors are left open after the Repo object is unused or destroyed.

(foo)jantman@jarvis:pts/8:~/tmp/foo$ cat test.py
#!/usr/bin/env python

import git
import commands
import os
import time

pid = os.getpid()

def show_lsof():
    global pid
    cmd = "lsof -p {p} | grep -v /usr/lib".format(p=pid)
    print("=============================")
    print("running {c}:".format(c=cmd))
    print(commands.getoutput(cmd))
    print("=============================")

for rname in ['testrepo', 'testrepo2', 'testrepo3']:
    print("=> Creating repo object for {rname}:".format(rname=rname))
    r = git.Repo(rname)
    show_lsof()

    print("=> iterating commits")
    for c in r.iter_commits():
        pass
    show_lsof()

    time.sleep(2)
    print("=> del r")
    del r
    time.sleep(2)

    show_lsof()
(foo)jantman@jarvis:pts/8:~/tmp/foo$ ./test.py  
=> Creating repo object for testrepo:
=============================
running lsof -p 5325 | grep -v /usr/lib:
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  5325 jantman  cwd    DIR   0,30      200  73513 /tmp/jantman/foo
python  5325 jantman  rtd    DIR    8,5     4096      2 /
python  5325 jantman  txt    REG   0,30     6240  73547 /tmp/jantman/foo/bin/python2
python  5325 jantman  mem    REG   0,30    33020  73600 /tmp/jantman/foo/lib/python2.7/site-packages/gitdb/_perf.so
python  5325 jantman    0u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    1u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    2u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    3r  FIFO    0,8      0t0  88651 pipe
=============================
=> iterating commits
=============================
running lsof -p 5325 | grep -v /usr/lib:
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  5325 jantman  cwd    DIR   0,30      200  73513 /tmp/jantman/foo
python  5325 jantman  rtd    DIR    8,5     4096      2 /
python  5325 jantman  txt    REG   0,30     6240  73547 /tmp/jantman/foo/bin/python2
python  5325 jantman  mem    REG   0,30    33020  73600 /tmp/jantman/foo/lib/python2.7/site-packages/gitdb/_perf.so
python  5325 jantman  mem    REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    0u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    1u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    2u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    3r  FIFO    0,8      0t0  91431 pipe
python  5325 jantman    4r   REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    5r   REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
=============================
=> del r
=============================
running lsof -p 5325 | grep -v /usr/lib:
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  5325 jantman  cwd    DIR   0,30      200  73513 /tmp/jantman/foo
python  5325 jantman  rtd    DIR    8,5     4096      2 /
python  5325 jantman  txt    REG   0,30     6240  73547 /tmp/jantman/foo/bin/python2
python  5325 jantman  mem    REG   0,30    33020  73600 /tmp/jantman/foo/lib/python2.7/site-packages/gitdb/_perf.so
python  5325 jantman  mem    REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    0u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    1u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    2u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    3r  FIFO    0,8      0t0  91434 pipe
python  5325 jantman    4r   REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    5r   REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
=============================
=> Creating repo object for testrepo2:
=============================
running lsof -p 5325 | grep -v /usr/lib:
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  5325 jantman  cwd    DIR   0,30      200  73513 /tmp/jantman/foo
python  5325 jantman  rtd    DIR    8,5     4096      2 /
python  5325 jantman  txt    REG   0,30     6240  73547 /tmp/jantman/foo/bin/python2
python  5325 jantman  mem    REG   0,30    33020  73600 /tmp/jantman/foo/lib/python2.7/site-packages/gitdb/_perf.so
python  5325 jantman  mem    REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    0u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    1u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    2u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    3r  FIFO    0,8      0t0  91435 pipe
python  5325 jantman    4r   REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    5r   REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
=============================
=> iterating commits
=============================
running lsof -p 5325 | grep -v /usr/lib:
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  5325 jantman  cwd    DIR   0,30      200  73513 /tmp/jantman/foo
python  5325 jantman  rtd    DIR    8,5     4096      2 /
python  5325 jantman  txt    REG   0,30     6240  73547 /tmp/jantman/foo/bin/python2
python  5325 jantman  mem    REG   0,30    33020  73600 /tmp/jantman/foo/lib/python2.7/site-packages/gitdb/_perf.so
python  5325 jantman  mem    REG   0,30     3032  89334 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  89333 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman  mem    REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    0u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    1u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    2u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    3r  FIFO    0,8      0t0  87601 pipe
python  5325 jantman    4r   REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    5r   REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman    6r   REG   0,30    42220  89333 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    7r   REG   0,30     3032  89334 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
=============================
=> del r
=============================
running lsof -p 5325 | grep -v /usr/lib:
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  5325 jantman  cwd    DIR   0,30      200  73513 /tmp/jantman/foo
python  5325 jantman  rtd    DIR    8,5     4096      2 /
python  5325 jantman  txt    REG   0,30     6240  73547 /tmp/jantman/foo/bin/python2
python  5325 jantman  mem    REG   0,30    33020  73600 /tmp/jantman/foo/lib/python2.7/site-packages/gitdb/_perf.so
python  5325 jantman  mem    REG   0,30     3032  89334 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  89333 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman  mem    REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    0u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    1u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    2u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    3r  FIFO    0,8      0t0  90605 pipe
python  5325 jantman    4r   REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    5r   REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman    6r   REG   0,30    42220  89333 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    7r   REG   0,30     3032  89334 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
=============================
=> Creating repo object for testrepo3:
=============================
running lsof -p 5325 | grep -v /usr/lib:
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  5325 jantman  cwd    DIR   0,30      200  73513 /tmp/jantman/foo
python  5325 jantman  rtd    DIR    8,5     4096      2 /
python  5325 jantman  txt    REG   0,30     6240  73547 /tmp/jantman/foo/bin/python2
python  5325 jantman  mem    REG   0,30    33020  73600 /tmp/jantman/foo/lib/python2.7/site-packages/gitdb/_perf.so
python  5325 jantman  mem    REG   0,30     3032  89334 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  89333 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman  mem    REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    0u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    1u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    2u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    3r  FIFO    0,8      0t0  87612 pipe
python  5325 jantman    4r   REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    5r   REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman    6r   REG   0,30    42220  89333 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    7r   REG   0,30     3032  89334 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
=============================
=> iterating commits
=============================
running lsof -p 5325 | grep -v /usr/lib:
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  5325 jantman  cwd    DIR   0,30      200  73513 /tmp/jantman/foo
python  5325 jantman  rtd    DIR    8,5     4096      2 /
python  5325 jantman  txt    REG   0,30     6240  73547 /tmp/jantman/foo/bin/python2
python  5325 jantman  mem    REG   0,30    33020  73600 /tmp/jantman/foo/lib/python2.7/site-packages/gitdb/_perf.so
python  5325 jantman  mem    REG   0,30     3032  79855 /tmp/jantman/foo/testrepo3/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  79854 /tmp/jantman/foo/testrepo3/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman  mem    REG   0,30     3032  89334 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  89333 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman  mem    REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    0u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    1u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    2u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    3r  FIFO    0,8      0t0  87616 pipe
python  5325 jantman    4r   REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    5r   REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman    6r   REG   0,30    42220  89333 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    7r   REG   0,30     3032  89334 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman    8r   REG   0,30    42220  79854 /tmp/jantman/foo/testrepo3/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    9r   REG   0,30     3032  79855 /tmp/jantman/foo/testrepo3/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
=============================
=> del r
=============================
running lsof -p 5325 | grep -v /usr/lib:
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  5325 jantman  cwd    DIR   0,30      200  73513 /tmp/jantman/foo
python  5325 jantman  rtd    DIR    8,5     4096      2 /
python  5325 jantman  txt    REG   0,30     6240  73547 /tmp/jantman/foo/bin/python2
python  5325 jantman  mem    REG   0,30    33020  73600 /tmp/jantman/foo/lib/python2.7/site-packages/gitdb/_perf.so
python  5325 jantman  mem    REG   0,30     3032  79855 /tmp/jantman/foo/testrepo3/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  79854 /tmp/jantman/foo/testrepo3/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman  mem    REG   0,30     3032  89334 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  89333 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman  mem    REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman  mem    REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    0u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    1u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    2u   CHR  136,8      0t0     11 /dev/pts/8
python  5325 jantman    3r  FIFO    0,8      0t0  88654 pipe
python  5325 jantman    4r   REG   0,30    42220  83920 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    5r   REG   0,30     3032  83921 /tmp/jantman/foo/testrepo/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman    6r   REG   0,30    42220  89333 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    7r   REG   0,30     3032  89334 /tmp/jantman/foo/testrepo2/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
python  5325 jantman    8r   REG   0,30    42220  79854 /tmp/jantman/foo/testrepo3/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.pack
python  5325 jantman    9r   REG   0,30     3032  79855 /tmp/jantman/foo/testrepo3/.git/objects/pack/pack-bfea6cfc8edeb84afcc3c9f4d36ce56ed8945db3.idx
=============================

The same thing happens if I explicitly r = None. This is a real problem for me, as I'm trying to write an analysis script that looks at commits in about 450 repositories. On Linux with a default open file handle limit of 1024, the script ends up crashing as every repository I examine results in open file handles for the pack and index files, that appear to never be cleaned up.

I feel like I have to be doing something wrong here, as I don't understand why these aren't cleaned up even after I'm done using the Repo object, and I set it to None or del it.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions