fsck: drop inode-sorting code

Fsck tries to access loose objects in order of inode number, with the hope that this would make cold cache access faster on a spinning disk. This dates back to 7e8c174 (fsck-cache: sort entries by inode number, 2005-05-02), which predates the invention of packfiles. These days, there's not much point in trying to optimize cold cache for a large number of loose objects. You are much better off to simply pack the objects, which will reduce the disk footprint _and_ provide better locality of data access. So while you can certainly construct pathological cases where this code might help, it is not worth the trouble anymore. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Sep 24, 2015 at 17:08 UTC 144e4cf7092ee8cff44e9c7600aaa7515ad6a78f
1 file changed +2 -68
builtin/fsck.c
+2 -68
@@ -39,14 +39,6 @@ static int show_dangling = 1;
39 #define ERROR_REACHABLE 02
40 #define ERROR_PACK 04
41
42 -#ifdef NO_D_INO_IN_DIRENT
43 -#define SORT_DIRENT 0
44 -#define DIRENT_SORT_HINT(de) 0
45 -#else
46 -#define SORT_DIRENT 1
47 -#define DIRENT_SORT_HINT(de) ((de)->d_ino)
48 -#endif
49 -
42 static int fsck_config(const char *var, const char *value, void *cb)
43 {
44 if (strcmp(var, "fsck.skiplist") == 0) {
@@ -373,64 +365,6 @@ static int fsck_obj_buffer(const unsigned char *sha1, enum object_type type,
365 return fsck_obj(obj);
366 }
367
376 -/*
377 - * This is the sorting chunk size: make it reasonably
378 - * big so that we can sort well..
379 - */
380 -#define MAX_SHA1_ENTRIES (1024)
381 -
382 -struct sha1_entry {
383 - unsigned long ino;
384 - unsigned char sha1[20];
385 -};
386 -
387 -static struct {
388 - unsigned long nr;
389 - struct sha1_entry *entry[MAX_SHA1_ENTRIES];
390 -} sha1_list;
391 -
392 -static int ino_compare(const void *_a, const void *_b)
393 -{
394 - const struct sha1_entry *a = _a, *b = _b;
395 - unsigned long ino1 = a->ino, ino2 = b->ino;
396 - return ino1 < ino2 ? -1 : ino1 > ino2 ? 1 : 0;
397 -}
398 -
399 -static void fsck_sha1_list(void)
400 -{
401 - int i, nr = sha1_list.nr;
402 -
403 - if (SORT_DIRENT)
404 - qsort(sha1_list.entry, nr,
405 - sizeof(struct sha1_entry *), ino_compare);
406 - for (i = 0; i < nr; i++) {
407 - struct sha1_entry *entry = sha1_list.entry[i];
408 - unsigned char *sha1 = entry->sha1;
409 -
410 - sha1_list.entry[i] = NULL;
411 - if (fsck_sha1(sha1))
412 - errors_found |= ERROR_OBJECT;
413 - free(entry);
414 - }
415 - sha1_list.nr = 0;
416 -}
417 -
418 -static void add_sha1_list(unsigned char *sha1, unsigned long ino)
419 -{
420 - struct sha1_entry *entry = xmalloc(sizeof(*entry));
421 - int nr;
422 -
423 - entry->ino = ino;
424 - hashcpy(entry->sha1, sha1);
425 - nr = sha1_list.nr;
426 - if (nr == MAX_SHA1_ENTRIES) {
427 - fsck_sha1_list();
428 - nr = 0;
429 - }
430 - sha1_list.entry[nr] = entry;
431 - sha1_list.nr = ++nr;
432 -}
433 -
368 static inline int is_loose_object_file(struct dirent *de,
369 char *name, unsigned char *sha1)
370 {
@@ -459,7 +393,8 @@ static void fsck_dir(int i, char *path)
393 if (is_dot_or_dotdot(de->d_name))
394 continue;
395 if (is_loose_object_file(de, name, sha1)) {
462 - add_sha1_list(sha1, DIRENT_SORT_HINT(de));
396 + if (fsck_sha1(sha1))
397 + errors_found |= ERROR_OBJECT;
398 continue;
399 }
400 if (starts_with(de->d_name, "tmp_obj_"))
@@ -573,7 +508,6 @@ static void fsck_object_dir(const char *path)
508 display_progress(progress, i+1);
509 }
510 stop_progress(&progress);
576 - fsck_sha1_list();
511 }
512
513 static int fsck_head_link(void)