On Tue, Jul 21, 2015 at 4:37 PM, Doug Kelly <[email protected]> wrote:
> On Tue, Jul 21, 2015 at 3:48 PM, Junio C Hamano <[email protected]> wrote:
>> Junio C Hamano <[email protected]> writes:
>>
>>> While I still think that it is more important to prevent such a
>>> situation from occurring in the first place, ignoring .idx that lack
>>> corresponding .pack should be fairly simple, perhaps like this.
>>> ...
>>
>> Sorry for the noise, but this patch is worthless. We already have
>> an equivalent test in add_packed_git() that is called from this same
>> place.
>
> And a few extra updates from me: we found that this appears to occur
> even after update to 1.9.5, and setting core.fscache on 2.4.6 has no
> appreciable impact on the time it takes to run "git fetch", either.
> Our thought was antivirus (or something else?) might have the file
> open when git attempts to unlink the .idx, but perhaps it's something
> else, too? In one case, we had ~560 orphaned .idx files, but 150
> seems sufficient to slow a fetch operation for a few minutes until it
> actually begins transferring objects.
>
> The "git gc" approach to cleaning up the mess is certainly looking
> more and more attractive... :)
Here's a change to prune.c that at least addresses the issue by removing
.idx files without an associated pack, but it's by no means pretty. If anyone
has any feedback before I turn this into a formal patch, it's more than welcome!
diff --git a/builtin/prune.c b/builtin/prune.c
index 10b03d3..8a60282 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -1,6 +1,7 @@
#include "cache.h"
#include "commit.h"
#include "diff.h"
+#include "dir.h"
#include "revision.h"
#include "builtin.h"
#include "reachable.h"
@@ -85,15 +86,31 @@ static void remove_temporary_files(const char *path)
{
DIR *dir;
struct dirent *de;
+ struct strbuf idx, pack;
dir = opendir(path);
if (!dir) {
fprintf(stderr, "Unable to open directory %s\n", path);
return;
}
- while ((de = readdir(dir)) != NULL)
+ while ((de = readdir(dir)) != NULL) {
if (starts_with(de->d_name, "tmp_"))
prune_tmp_file(mkpath("%s/%s", path, de->d_name));
+ if (ends_with(de->d_name, ".idx")) {
+ strbuf_init(&idx, 0);
+ strbuf_init(&pack, 0);
+ strbuf_addstr(&idx, de->d_name);
+ strbuf_addbuf(&pack, &idx);
+ if (strbuf_strip_suffix(&pack, ".idx")) {
+ strbuf_addstr(&pack, ".pack");
+ if (!file_exists(mkpath("%s/%s", path,
pack.buf)))
+ prune_tmp_file(mkpath("%s/%s",
path, idx.buf));
+ }
+ strbuf_release(&idx);
+ strbuf_release(&pack);
+ }
+
+ }
closedir(dir);
}
--
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html