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 14, 2008, 15:29 UTC
Message-ID
<m38x0lxr1k.fsf@localhost.localdomain>
In-Reply-To
<76718490803131707g34fd40d4q21c69391c2597bc@mail.gmail.com>
"Jay Soffian" <jaysoffian@gmail.com> writes:
Show 26 quoted lines
> On Thu, Mar 13, 2008 at 7:14 PM, Petr Baudis <pasky@suse.cz> wrote:
> 
> ...
> 
> >  +               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.
What should the code for this look like? Like below?
        use File::Temp;
        
        my ($fh, $temp_file) = tempfile();
        ...
        close $fh;
        rename $temp_file, $cache_file;
-- 
Jakub Narebski
Poland
ShadeHawk on #git
Previous: Jakub NarebskiNext: Jay Soffian
Message 13 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.