Merge branch 'jc/racy'
authorJunio C Hamano <junkio@cox.net>
Wed, 16 Aug 2006 21:00:34 +0000 (14:00 -0700)
committerJunio C Hamano <junkio@cox.net>
Wed, 16 Aug 2006 21:00:34 +0000 (14:00 -0700)
* jc/racy:
Remove the "delay writing to avoid runtime penalty of racy-git avoidance"
Add check program "git-check-racy"
Documentation/technical/racy-git.txt
avoid nanosleep(2)

1  2 
Makefile
read-cache.c
diff --combined Makefile
index 56a915e13f6304bc1a6781eafc8182b5b5b7cde6,04ed84d09437022c7dde067a23506c2add71f25e..23cd8a017ba05986c309c605ae06fba6a98e5c07
+++ b/Makefile
@@@ -126,7 -126,6 +126,7 @@@ GITWEB_CONFIG = gitweb_config.per
  GITWEB_HOME_LINK_STR = projects
  GITWEB_SITENAME =
  GITWEB_PROJECTROOT = /pub/git
 +GITWEB_BASE_URL =
  GITWEB_LIST =
  GITWEB_HOMETEXT = indextext.html
  GITWEB_CSS = gitweb.css
@@@ -195,7 -194,11 +195,11 @@@ PROGRAMS = 
        git-update-server-info$X \
        git-upload-pack$X git-verify-pack$X \
        git-pack-redundant$X git-var$X \
-       git-describe$X git-merge-tree$X git-blame$X git-imap-send$X
+       git-describe$X git-merge-tree$X git-blame$X git-imap-send$X \
+       $(EXTRA_PROGRAMS)
+ # Empty...
+ EXTRA_PROGRAMS =
  
  BUILT_INS = \
        git-format-patch$X git-show$X git-whatchanged$X \
@@@ -332,12 -335,10 +336,12 @@@ ifeq ($(uname_S),SunOS
                NEEDS_LIBICONV = YesPlease
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
 +              NO_C99_FORMAT = YesPlease
        endif
        ifeq ($(uname_R),5.9)
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
 +              NO_C99_FORMAT = YesPlease
        endif
        INSTALL = ginstall
        TAR = gtar
@@@ -623,7 -624,6 +627,7 @@@ gitweb/gitweb.cgi: gitweb/gitweb.per
            -e 's|++GITWEB_HOME_LINK_STR++|$(GITWEB_HOME_LINK_STR)|g' \
            -e 's|++GITWEB_SITENAME++|$(GITWEB_SITENAME)|g' \
            -e 's|++GITWEB_PROJECTROOT++|$(GITWEB_PROJECTROOT)|g' \
 +          -e 's|++GITWEB_BASE_URL++|$(GITWEB_BASE_URL)|g' \
            -e 's|++GITWEB_LIST++|$(GITWEB_LIST)|g' \
            -e 's|++GITWEB_HOMETEXT++|$(GITWEB_HOMETEXT)|g' \
            -e 's|++GITWEB_CSS++|$(GITWEB_CSS)|g' \
diff --combined read-cache.c
index 3228ffb3001fa360dbd4f5a0907fd0b204382423,be81ac2d2b9a68bfcc1b02b339ced49f44517efe..6bec833eecae934af1dce18683c70522481b002a
@@@ -5,7 -5,6 +5,6 @@@
   */
  #include "cache.h"
  #include "cache-tree.h"
- #include <time.h>
  
  /* Index extensions.
   *
  #define CACHE_EXT(s) ( (s[0]<<24)|(s[1]<<16)|(s[2]<<8)|(s[3]) )
  #define CACHE_EXT_TREE 0x54524545     /* "TREE" */
  
 -struct cache_entry **active_cache = NULL;
 +struct cache_entry **active_cache;
  static time_t index_file_timestamp;
 -unsigned int active_nr = 0, active_alloc = 0, active_cache_changed = 0;
 +unsigned int active_nr, active_alloc, active_cache_changed;
  
 -struct cache_tree *active_cache_tree = NULL;
 +struct cache_tree *active_cache_tree;
  
 -int cache_errno = 0;
 +int cache_errno;
  
 -static void *cache_mmap = NULL;
 -static size_t cache_mmap_size = 0;
 +static void *cache_mmap;
 +static size_t cache_mmap_size;
  
  /*
   * This only updates the "non-critical" parts of the directory
@@@ -170,9 -169,11 +169,11 @@@ static int ce_match_stat_basic(struct c
        return changed;
  }
  
- int ce_match_stat(struct cache_entry *ce, struct stat *st, int ignore_valid)
+ int ce_match_stat(struct cache_entry *ce, struct stat *st, int options)
  {
        unsigned int changed;
+       int ignore_valid = options & 01;
+       int assume_racy_is_modified = options & 02;
  
        /*
         * If it's marked as always valid in the index, it's
         */
        if (!changed &&
            index_file_timestamp &&
-           index_file_timestamp <= ntohl(ce->ce_mtime.sec))
-               changed |= ce_modified_check_fs(ce, st);
+           index_file_timestamp <= ntohl(ce->ce_mtime.sec)) {
+               if (assume_racy_is_modified)
+                       changed |= DATA_CHANGED;
+               else
+                       changed |= ce_modified_check_fs(ce, st);
+       }
  
        return changed;
  }
@@@ -954,9 -959,7 +959,7 @@@ int write_cache(int newfd, struct cache
  {
        SHA_CTX c;
        struct cache_header hdr;
-       int i, removed, recent;
-       struct stat st;
-       time_t now;
+       int i, removed;
  
        for (i = removed = 0; i < entries; i++)
                if (!cache[i]->ce_mode)
                        return -1;
                }
        }
-       /*
-        * To prevent later ce_match_stat() from always falling into
-        * check_fs(), if we have too many entries that can trigger
-        * racily clean check, we are better off delaying the return.
-        * We arbitrarily say if more than 20 paths or 25% of total
-        * paths are very new, we delay the return until the index
-        * file gets a new timestamp.
-        *
-        * NOTE! NOTE! NOTE!
-        *
-        * This assumes that nobody is touching the working tree while
-        * we are updating the index.
-        */
-       /* Make sure that the new index file has st_mtime
-        * that is current enough -- ce_write() batches the data
-        * so it might not have written anything yet.
-        */
-       ce_write_flush(&c, newfd);
-       now = fstat(newfd, &st) ? 0 : st.st_mtime;
-       if (now) {
-               recent = 0;
-               for (i = 0; i < entries; i++) {
-                       struct cache_entry *ce = cache[i];
-                       time_t entry_time = (time_t) ntohl(ce->ce_mtime.sec);
-                       if (!ce->ce_mode)
-                               continue;
-                       if (now && now <= entry_time)
-                               recent++;
-               }
-               if (20 < recent && entries <= recent * 4) {
- #if 0
-                       fprintf(stderr, "entries    %d\n", entries);
-                       fprintf(stderr, "recent     %d\n", recent);
-                       fprintf(stderr, "now        %lu\n", now);
- #endif
-                       while (!fstat(newfd, &st) && st.st_mtime <= now) {
-                               struct timespec rq, rm;
-                               off_t where = lseek(newfd, 0, SEEK_CUR);
-                               rq.tv_sec = 0;
-                               rq.tv_nsec = 250000000;
-                               nanosleep(&rq, &rm);
-                               if ((where == (off_t) -1) ||
-                                   (write(newfd, "", 1) != 1) ||
-                                   (lseek(newfd, -1, SEEK_CUR) != where) ||
-                                   ftruncate(newfd, where))
-                                       break;
-                       }
-               }
-       }
        return ce_flush(&c, newfd);
  }