summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSitaram Chamarty <sitaram@atc.tcs.com>2017-09-18 21:54:04 +0530
committerSitaram Chamarty <sitaram@atc.tcs.com>2017-09-18 21:54:15 +0530
commit66966bd9c1ee870926b0786e91e333890cdb853a (patch)
tree54f1390745f3c8a9ae55db8633aa9823437a331f /src
parent2bc9ab3741895f7ca0b4a927402d8e0c1326c78e (diff)
Revert "reduce stat() and other calls for huge installs"
This reverts commit 41b7885b77cfe992ad3c96d0b021ece51ce1b3e3. Some parts of this change may come back later, but the caching logic will not.
Diffstat (limited to 'src')
-rw-r--r--src/lib/Gitolite/Conf/Store.pm35
1 files changed, 7 insertions, 28 deletions
diff --git a/src/lib/Gitolite/Conf/Store.pm b/src/lib/Gitolite/Conf/Store.pm
index 6809f67..c7f9ab5 100644
--- a/src/lib/Gitolite/Conf/Store.pm
+++ b/src/lib/Gitolite/Conf/Store.pm
@@ -25,8 +25,6 @@ use Exporter 'import';
use Data::Dumper;
$Data::Dumper::Indent = 1;
$Data::Dumper::Sortkeys = 1;
-use Fcntl;
-use GDBM_File;
use Gitolite::Rc;
use Gitolite::Common;
@@ -43,11 +41,6 @@ my %groups;
my %configs;
my %split_conf;
-# reduce the number of unnecessary stat() calls for installations like Fedora,
-# which have (as of 2017-08) about 42000 repos. Each compile will only
-# *really* change a few repos so this helps us not to touch the others.
-my %gl_conf_cache;
-
my @repolist; # current repo list; reset on each 'repo ...' line
my $subconf = 'master';
my $nextseq = 0;
@@ -195,13 +188,10 @@ sub new_repos {
next unless $repo =~ $REPONAME_PATT; # skip repo patterns
next if $repo =~ m(^\@|EXTCMD/); # skip groups and fake repos
- # use gl-conf as a sentinel; if it exists, all is well
- next if -f "$repo.git/gl-conf";
+ # use gl-conf as a sentinel
+ hook_1($repo) if -d "$repo.git" and not -f "$repo.git/gl-conf";
- if (-d "$repo.git") {
- # directory exists but sentinel missing? Maybe a freshly imported repo?
- hook_1($repo);
- } else {
+ if ( not -d "$repo.git" ) {
push @{ $rc{NEW_REPOS_CREATED} }, $repo;
trigger( 'PRE_CREATE', $repo );
new_repo($repo);
@@ -247,24 +237,16 @@ sub hook_repos {
sub store {
trace(3);
- my $dbf = "$rc{GL_ADMIN_BASE}/gl-conf.cache";
- tie(%gl_conf_cache, 'GDBM_File', $dbf, O_RDWR|O_CREAT, 0666) or _die "Tie '$dbf' failed: $!";
-
# first write out the ones for the physical repos
_chdir( $rc{GL_REPO_BASE} );
+ my $phy_repos = list_phy_repos(1);
- # list of repos (union of keys of %repos plus %configs)
- my %kr_kc;
- @kr_kc{ keys %repos } = ();
- @kr_kc{ keys %configs } = ();
- for my $repo ( keys %kr_kc ) {
+ for my $repo ( @{$phy_repos} ) {
store_1($repo);
}
_chdir( $rc{GL_ADMIN_BASE} );
store_common();
-
- untie %gl_conf_cache;
}
sub parse_done {
@@ -302,7 +284,7 @@ sub store_1 {
# warning: writes and *deletes* it from %repos and %configs
my ($repo) = shift;
trace( 3, $repo );
- return unless -d "$repo.git";
+ return unless ( $repos{$repo} or $configs{$repo} ) and -d "$repo.git";
my ( %one_repo, %one_config );
@@ -319,10 +301,7 @@ sub store_1 {
$dumped_data .= Data::Dumper->Dump( [ \%one_config ], [qw(*one_config)] );
}
- if ( ($gl_conf_cache{$repo} || '') ne $dumped_data ) {
- _print( "$repo.git/gl-conf", $dumped_data );
- $gl_conf_cache{$repo} = $dumped_data;
- }
+ _print( "$repo.git/gl-conf", $dumped_data );
$split_conf{$repo} = 1;
}