write_index(): update index_state->timestamp after flushing to disk
Since this timestamp is used to check for racy-clean files, it is important to keep it uptodate. For the 'git checkout' command without the '-q' option, this make a huge difference. Before, each and every file which was updated, was racy-clean after the call to unpack_trees() and write_index() but before the GIT process ended. And because of the call to show_local_changes() in builtin-checkout.c, we ended up reading those files back into memory, doing a SHA1 to check if the files was really different from the index. And, of course, no file was different. With this fix, 'git checkout' without the '-q' option should now be almost as fast as with the '-q' option, but not quite, as we still do some few lstat(2) calls more without the '-q' option. Below is some average numbers for 10 checkout's to v2.6.27 and 10 to v2.6.25 of the Linux kernel, to show the difference: before (git version 1.6.2.rc1.256.g58a87): 7.860 user 2.427 sys 19.465 real 52.8% CPU faults: 0 major 95331 minor after: 6.184 user 2.160 sys 17.619 real 47.4% CPU faults: 0 major 38994 minor Signed-off-by: Kjetil Barvik <barvik@broadpark.no> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									1dcafcc0e6
								
							
						
					
					
						commit
						e1afca4fd3
					
				
							
								
								
									
										2
									
								
								cache.h
								
								
								
								
							
							
						
						
									
										2
									
								
								cache.h
								
								
								
								
							|  | @ -430,7 +430,7 @@ extern int read_index_preload(struct index_state *, const char **pathspec); | |||
| extern int read_index_from(struct index_state *, const char *path); | ||||
| extern int is_index_unborn(struct index_state *); | ||||
| extern int read_index_unmerged(struct index_state *); | ||||
| extern int write_index(const struct index_state *, int newfd); | ||||
| extern int write_index(struct index_state *, int newfd); | ||||
| extern int discard_index(struct index_state *); | ||||
| extern int unmerged_index(const struct index_state *); | ||||
| extern int verify_path(const char *path); | ||||
|  |  | |||
							
								
								
									
										12
									
								
								read-cache.c
								
								
								
								
							
							
						
						
									
										12
									
								
								read-cache.c
								
								
								
								
							|  | @ -1528,13 +1528,14 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce) | |||
| 	return ce_write(c, fd, ondisk, size); | ||||
| } | ||||
|  | ||||
| int write_index(const struct index_state *istate, int newfd) | ||||
| int write_index(struct index_state *istate, int newfd) | ||||
| { | ||||
| 	git_SHA_CTX c; | ||||
| 	struct cache_header hdr; | ||||
| 	int i, err, removed, extended; | ||||
| 	struct cache_entry **cache = istate->cache; | ||||
| 	int entries = istate->cache_nr; | ||||
| 	struct stat st; | ||||
|  | ||||
| 	for (i = removed = extended = 0; i < entries; i++) { | ||||
| 		if (cache[i]->ce_flags & CE_REMOVE) | ||||
|  | @ -1578,7 +1579,14 @@ int write_index(const struct index_state *istate, int newfd) | |||
| 		if (err) | ||||
| 			return -1; | ||||
| 	} | ||||
| 	return ce_flush(&c, newfd); | ||||
|  | ||||
| 	if (ce_flush(&c, newfd) || fstat(newfd, &st)) | ||||
| 		return -1; | ||||
| 	istate->timestamp.sec = (unsigned int)st.st_ctime; | ||||
| #ifdef USE_NSEC | ||||
| 	istate->timestamp.nsec = (unsigned int)st.st_ctim.tv_nsec; | ||||
| #endif | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Kjetil Barvik
						Kjetil Barvik