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

Re: [PATCH] gitweb: Support caching projects list

From
Jay Soffian <jaysoffian@gmail.com>
Date
Mar 14, 2008, 00:07 UTC
Message-ID
<76718490803131707g34fd40d4q21c69391c2597bc@mail.gmail.com>
In-Reply-To
<20080313231413.27966.3383.stgit@rover>
On Thu, Mar 13, 2008 at 7:14 PM, Petr Baudis <pasky@suse.cz> wrote:
Show 17 quoted lines
>  diff --git a/gitweb/gitweb.css b/gitweb/gitweb.css
>  index 8e2bf3d..673077a 100644
>  --- a/gitweb/gitweb.css
>  +++ b/gitweb/gitweb.css
>  @@ -85,6 +85,12 @@ div.title, a.title {
>         color: #000000;
>   }
>
>  +div.stale_info {
>  +       display: block;
>  +       text-align: right;
>  +       font-style: italic;
>  +}
>  +
>   div.readme {
>         padding: 8px;
>   }
What does this have to do with it?
Show 5 quoted lines
>  diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
>  index bcb6193..0eee195 100755
>  --- a/gitweb/gitweb.perl
>  +++ b/gitweb/gitweb.perl
>  @@ -122,6 +122,15 @@ our $fallback_encoding = 'latin1';
...
Show 6 quoted lines
>  +               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;
>  +               }

Race condition. I don't see any locking. Nothing keeps multiple instances from regenerating the cache concurrently...

>  +               @projects = git_get_projects_details($projlist, $check_forks);
>  +               if ($cache_lifetime and open (my $fd, '>'.$cache_file)) {
...and then clobbering each other here. You have two choices:
1) Use a lock file for the critical section.
2) Assume the race condition is rare enough, but you still need to account for
it. In that case, you want to write to a temporary file and then rename to the
cache file name. The rename is atomic, so though N instances of gitweb may
regenerate the cache (at some CPU/IO overhead), at least the cache file won't
get corrupted.

Out of curiosity, repo.or.cz isn't running this as a CGI is it? If so, wouldn't running it as a FastCGI or modperl be a vast improvement?

j.
Previous: Petr BaudisNext: Petr Baudis
Message 2 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.