Skip to content

Commit

Permalink
git-gui: search 4 directories to improve statistic of gc hint
Browse files Browse the repository at this point in the history
On Windows, git-gui suggests running the garbage collector if it finds
1 or more files in .git/objects/42 (as opposed to 8 files on other
platforms). The probability of that happening if the repo contains
about 100 loose objects is 32%. The probability for the same to happen
when searching 4 directories is only 8%, which is bit more reasonable.

Also remove $objects_limit from the message, because we already know
that we are above (or close to) that limit. Telling the user about
that number does not really give him any useful information.

The following octave script shows the probability for at least m*q
objects to be found in q subdirectories of .git/objects if n is the
total number of objects.

q = 4;
m = [1 2 8];
n = 0:10:2000;

P = zeros(length(n), length(m));
for k = 1:length(n)
        P(k, :) = 1-binocdf(q*m-1, n(k), q/(256-q));
end
plot(n, P);

n \ q   1       4
50      18%     1%
100     32%     8%
200     54%     39%
500     86%     96%

Signed-off-by: Clemens Buchacher <drizzd@aon.at>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
  • Loading branch information
Clemens Buchacher authored and Shawn O. Pearce committed Dec 5, 2009
1 parent c0d1532 commit 88520ca
Showing 1 changed file with 10 additions and 11 deletions.
21 changes: 10 additions & 11 deletions lib/database.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -89,27 +89,26 @@ proc do_fsck_objects {} {
}

proc hint_gc {} {
set object_limit 8
set ndirs 1
set limit 8
if {[is_Windows]} {
set object_limit 1
set ndirs 4
set limit 1
}

set objects_current [llength [glob \
-directory [gitdir objects 42] \
set count [llength [glob \
-nocomplain \
-tails \
-- \
*]]
[gitdir objects 4\[0-[expr {$ndirs-1}]\]/*]]]

if {$objects_current >= $object_limit} {
set objects_current [expr {$objects_current * 250}]
set object_limit [expr {$object_limit * 250}]
if {$count >= $limit * $ndirs} {
set objects_current [expr {$count * 256/$ndirs}]
if {[ask_popup \
[mc "This repository currently has approximately %i loose objects.
To maintain optimal performance it is strongly recommended that you compress the database when more than %i loose objects exist.
To maintain optimal performance it is strongly recommended that you compress the database.
Compress the database now?" $objects_current $object_limit]] eq yes} {
Compress the database now?" $objects_current]] eq yes} {
do_gc
}
}
Expand Down

0 comments on commit 88520ca

Please sign in to comment.