From: "Kristian Høgsberg" <krh@redhat.com>
To: Brandon Casey <casey@nrlssc.navy.mil>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Git Mailing List <git@vger.kernel.org>,
drafnel@gmail.com, Junio C Hamano <gitster@pobox.com>,
Alex Riesen <raa.lkml@gmail.com>
Subject: Re: git-commit fatal: Out of memory? mmap failed: Bad file descriptor
Date: Tue, 15 Jan 2008 15:00:02 -0500 [thread overview]
Message-ID: <1200427202.5821.7.camel@gaara.boston.redhat.com> (raw)
In-Reply-To: <478D0CDA.5050709@nrlssc.navy.mil>
On Tue, 2008-01-15 at 13:43 -0600, Brandon Casey wrote:
> Linus Torvalds wrote:
> >
> > On Tue, 15 Jan 2008, Brandon Casey wrote:
> >> Linus Torvalds wrote:
> >>> It would obviously be interesting to see the base repository and the
> >>> commit you are trying to do - is that possibly publicly available?
> >> I wish it was.
> >
> > It's ok, I found the bug in your full strace.
>
> Good catch, but that wasn't it. Still getting the same error.
>
> > and now it's trying to close that fd *again*
>
> In that same vein, just above your changes in prepare_index() is:
>
> if (!pathspec || !*pathspec) {
> fd = hold_locked_index(&index_lock, 1);
> refresh_cache(REFRESH_QUIET);
> if (write_cache(fd, active_cache, active_nr) ||
> close(fd) || commit_locked_index(&index_lock))
> die("unable to write new_index file");
> commit_style = COMMIT_AS_IS;
> return get_index_file();
> }
>
> If I followed hold_locked_index() correctly, then fd and index_lock.fd
> are equal, and commit_locked_index() does a close(lk->fd) making the
> close(fd) above, redundant (or vice-versa).
To my defense, the lockfile API is used a little inconsitently in git.
Many places in git does a close(fd) and the call commit_locked_index(),
which will close the fd again. Normally that will just cause an EBADFD
which we ignore, but the problem here is that there's a longer time
between close(fd) and the commit/rollback of the lock file. I guess the
correct way to use the API is to never close the fd manually, but I
copied and pasted the lockfile use in builtin-commit.c from somewhere
else and along with it the double close.
There's four close(fd) calls in prepare_index() and they're all
incorrect. The open fd's are cleaned up in rollback_index_files() and
shouldn't be closed manually. The patch below gets rid of the extra
close() calls and should fix the problem.
cheers,
Kristian
diff --git a/builtin-commit.c b/builtin-commit.c
index 73f1e35..4494c9c 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -212,7 +212,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
int fd = hold_locked_index(&index_lock, 1);
add_files_to_cache(0, also ? prefix : NULL, pathspec);
refresh_cache(REFRESH_QUIET);
- if (write_cache(fd, active_cache, active_nr) || close(fd))
+ if (write_cache(fd, active_cache, active_nr))
die("unable to write new_index file");
commit_style = COMMIT_NORMAL;
return index_lock.filename;
@@ -231,7 +231,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
fd = hold_locked_index(&index_lock, 1);
refresh_cache(REFRESH_QUIET);
if (write_cache(fd, active_cache, active_nr) ||
- close(fd) || commit_locked_index(&index_lock))
+ commit_locked_index(&index_lock))
die("unable to write new_index file");
commit_style = COMMIT_AS_IS;
return get_index_file();
@@ -273,7 +273,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
fd = hold_locked_index(&index_lock, 1);
add_remove_files(&partial);
refresh_cache(REFRESH_QUIET);
- if (write_cache(fd, active_cache, active_nr) || close(fd))
+ if (write_cache(fd, active_cache, active_nr))
die("unable to write new_index file");
fd = hold_lock_file_for_update(&false_lock,
@@ -289,7 +289,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
add_remove_files(&partial);
refresh_cache(REFRESH_QUIET);
- if (write_cache(fd, active_cache, active_nr) || close(fd))
+ if (write_cache(fd, active_cache, active_nr))
die("unable to write temporary index file");
return false_lock.filename;
}
next prev parent reply other threads:[~2008-01-15 20:03 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-11 22:11 git-commit fatal: Out of memory? mmap failed: Bad file descriptor Brandon Casey
2008-01-11 22:18 ` Charles Bailey
2008-01-12 4:56 ` Jeff King
2008-01-11 22:19 ` Marco Costalba
2008-01-11 22:47 ` Brandon Casey
2008-01-11 23:48 ` Junio C Hamano
2008-01-12 0:43 ` Brandon Casey
2008-01-12 1:08 ` Junio C Hamano
2008-01-12 20:16 ` Alex Riesen
2008-01-14 23:22 ` Brandon Casey
2008-01-15 2:42 ` Brandon Casey
2008-01-15 5:42 ` Linus Torvalds
2008-01-15 17:26 ` Brandon Casey
2008-01-15 17:36 ` Linus Torvalds
2008-01-15 18:27 ` Brandon Casey
2008-01-15 18:50 ` Linus Torvalds
2008-01-15 19:43 ` Brandon Casey
2008-01-15 20:00 ` Kristian Høgsberg [this message]
2008-01-15 20:27 ` Brandon Casey
2008-01-15 20:39 ` Brandon Casey
2008-01-15 20:09 ` Linus Torvalds
2008-01-15 20:20 ` Linus Torvalds
2008-01-15 23:10 ` Junio C Hamano
2008-01-16 1:27 ` Junio C Hamano
2008-01-16 2:11 ` Brandon Casey
2008-01-16 19:00 ` [PATCH 1/2] Document lockfile API Junio C Hamano
2008-01-16 19:05 ` [PATCH 2/2] close_lock_file(): new function in the " Junio C Hamano
2008-01-16 20:08 ` Linus Torvalds
2008-01-16 20:36 ` Junio C Hamano
2008-01-16 20:46 ` Brandon Casey
2008-01-16 21:57 ` Junio C Hamano
2008-01-16 22:46 ` Brandon Casey
2008-01-16 22:55 ` Junio C Hamano
2008-01-16 23:08 ` Brandon Casey
2008-01-16 23:16 ` Brandon Casey
2008-01-16 23:19 ` Junio C Hamano
2008-01-16 23:28 ` Brandon Casey
2008-01-16 7:53 ` git-commit fatal: Out of memory? mmap failed: Bad file descriptor Johannes Sixt
2008-01-15 12:21 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1200427202.5821.7.camel@gaara.boston.redhat.com \
--to=krh@redhat.com \
--cc=casey@nrlssc.navy.mil \
--cc=drafnel@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=raa.lkml@gmail.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).