git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] gitweb: Support caching projects list

From
Jakub Narebski <jnareb@gmail.com>
Date
Mar 15, 2008, 21:44 UTC
Message-ID
<m3ve3nwtl3.fsf@localhost.localdomain>
In-Reply-To
<20080313231413.27966.3383.stgit@rover>
Petr Baudis <pasky@suse.cz> writes:
> On repo.or.cz (permanently I/O overloaded and hosting 1050 project +
> forks), 

It looks like repo.or.cz is overwhelmed by its success. I hope that now that there are other software hosting sites with git hosting (Savannah, GitHub, Gitorious,...) the number of projects wouldn't grow as rapidly.

> the projects list (the default gitweb page) can take more than
> a minute to generate. This naive patch adds simple support for caching
> the projects list data structure so that all the projects do not need
> to get rescanned at every page access.

Another solution would be to divide projects list page into pages, perhaps adding search box for searching for a project (by name, by description and by owner).

Nevertheless even with pagination, if we want to have "sort by last update" we do need caching.

[...]
Show 8 quoted lines
> +# projects list cache for busy sites with many projects;
> +# if you set this to non-zero, it will be used as the cached
> +# index lifetime in minutes
> +# the cached list version is stored in /tmp and can be tweaked
> +# by other scripts running with the same uid as gitweb - use this
> +# only at secure installations; only single gitweb project root per
> +# system is supported!
> +our $projlist_cache_lifetime = 0;
[...]
> +sub git_project_list_body {
[...]
Show 30 quoted lines
> +	my $cache_file = '/tmp/gitweb.index.cache';
> +	use File::stat;
> +
> +	my @projects;
> +	my $stale = 0;
> +	if ($cache_lifetime and -f $cache_file
> +	    and stat($cache_file)->mtime + $cache_lifetime * 60 > time()
> +	    and open (my $fd, $cache_file)) {
> +		$stale = time() - stat($cache_file)->mtime;
> +		my @dump = <$fd>;
> +		close $fd;
> +		# Hack zone start
> +		my $VAR1;
> +		eval join("\n", @dump);
> +		@projects = @$VAR1;
> +		# Hack zone end
> +	} else {
> +		if ($cache_lifetime and -f $cache_file) {
> +			# Postpone timeout by two minutes so that we get
> +			# enough time to do our job.
> +			my $time = time() - $cache_lifetime + 120;
> +			utime $time, $time, $cache_file;
> +		}
> +		@projects = git_get_projects_details($projlist, $check_forks);
> +		if ($cache_lifetime and open (my $fd, '>'.$cache_file)) {
> +			use Data::Dumper;
> +			print $fd Dumper(\@projects);
> +			close $fd;
> +		}
> +	}

This could be much simplified with perl-cache (perl-Cache-Cache). Unfortunately this is non-standard module, not distributed (yet?) with Perl.

Warning: not tested in gitweb!

+ use Cache::FileCache; + + my $cache; + my $projects; + + if ($cache_lifetime) { + $cache = new Cache::FileCache( + { namespace => 'gitweb', + default_expires_in => $cache_lifetime + }); + $projects = $cache->get('projects_list'); + } + if (!defined $projects) { + $projects = [ git_get_projects_details($projlist, $check_forks); ]; + $cache->set('projects_list', $projects) + if defined $cache; + }

-- 
Jakub Narebski
Poland
ShadeHawk on #git
Previous: Petr BaudisNext: Miklos Vajna
Message 19 of 30 in “gitweb: Support caching projects list”
  1. gitweb: Support caching projects listPetr Baudis, Mar 13, 2008
  2. Jay SoffianMar 14, 2008
  3. Petr BaudisMar 14, 2008
  4. Jay SoffianMar 14, 2008
  5. J.H.Mar 14, 2008
  6. Jakub NarebskiMar 14, 2008
  7. J.H.Mar 14, 2008
  8. repo.or.cz renovationPetr Baudis, Mar 17, 2008
  9. Petr BaudisMar 17, 2008
  10. J.H.Mar 17, 2008
  11. Jakub NarebskiMar 17, 2008
  12. Jakub NarebskiMar 17, 2008
  13. Jakub NarebskiMar 14, 2008
  14. Jay SoffianMar 14, 2008
  15. Junio C HamanoMar 14, 2008
  16. Frank LichtenheldMar 14, 2008
  17. Jakub NarebskiMar 14, 2008
  18. Petr BaudisMar 17, 2008
  19. Jakub NarebskiMar 15, 2008
  20. Miklos VajnaMar 16, 2008
  21. Frank LichtenheldMar 16, 2008
  22. J.H.Mar 16, 2008
  23. Jakub NarebskiMar 16, 2008
  24. J.H.Mar 16, 2008
  25. Jakub NarebskiMar 16, 2008
  26. repo.or.cz renovatedPetr Baudis, Mar 17, 2008
  27. Junio C HamanoMar 17, 2008
  28. Petr BaudisMar 17, 2008
  29. Theodore TsoMar 17, 2008
  30. Petr BaudisMar 17, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.