From: Jeff King <peff@peff.net>
To: steve.norman@thomsonreuters.com
Cc: pclouds@gmail.com, git@vger.kernel.org,
Michael Haggerty <mhagger@alum.mit.edu>
Subject: [PATCH 1/3] stat_validity: handle non-regular files
Date: Fri, 22 May 2015 19:51:43 -0400 [thread overview]
Message-ID: <20150522235143.GA4818@peff.net> (raw)
In-Reply-To: <20150522235116.GA4300@peff.net>
The stat_validity code was originally written to avoid
re-reading the packed-refs file when it has not changed. It
makes sure that the file continues to match S_ISREG() when
we check it.
However, we can use the same concept on a directory to see
whether it has been modified. Even though we still have to
touch the filesystem to do the stat, this can provide a
speedup even over opendir/readdir/closedir, especially on
high-latency filesystems like NFS.
This patch adds a "mode" field to stat_validity, which lets
us check that the mode has stayed the same (rather than
explicitly checking that it is a regular file).
As a bonus cleanup, we can stop allocating the embedded
"stat_data" on the heap. Prior to this patch, we needed to
represent the case where the file did not exist, and we used
"sv->sd == NULL" for that. Now we can simply check that
"sv->mode" is 0.
Signed-off-by: Jeff King <peff@peff.net>
---
cache.h | 3 ++-
read-cache.c | 16 ++++++----------
2 files changed, 8 insertions(+), 11 deletions(-)
diff --git a/cache.h b/cache.h
index c97d807..2941e7e 100644
--- a/cache.h
+++ b/cache.h
@@ -1660,7 +1660,8 @@ int sane_execvp(const char *file, char *const argv[]);
* for the index.
*/
struct stat_validity {
- struct stat_data *sd;
+ struct stat_data sd;
+ unsigned mode;
};
void stat_validity_clear(struct stat_validity *sv);
diff --git a/read-cache.c b/read-cache.c
index 36ff89f..115b000 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -2279,8 +2279,7 @@ void *read_blob_data_from_index(struct index_state *istate, const char *path, un
void stat_validity_clear(struct stat_validity *sv)
{
- free(sv->sd);
- sv->sd = NULL;
+ memset(sv, 0, sizeof(*sv));
}
int stat_validity_check(struct stat_validity *sv, const char *path)
@@ -2288,21 +2287,18 @@ int stat_validity_check(struct stat_validity *sv, const char *path)
struct stat st;
if (stat(path, &st) < 0)
- return sv->sd == NULL;
- if (!sv->sd)
- return 0;
- return S_ISREG(st.st_mode) && !match_stat_data(sv->sd, &st);
+ return sv->mode == 0;
+ return sv->mode == st.st_mode && !match_stat_data(&sv->sd, &st);
}
void stat_validity_update(struct stat_validity *sv, int fd)
{
struct stat st;
- if (fstat(fd, &st) < 0 || !S_ISREG(st.st_mode))
+ if (fstat(fd, &st) < 0)
stat_validity_clear(sv);
else {
- if (!sv->sd)
- sv->sd = xcalloc(1, sizeof(struct stat_data));
- fill_stat_data(sv->sd, &st);
+ sv->mode = st.st_mode;
+ fill_stat_data(&sv->sd, &st);
}
}
--
2.4.1.538.g69ac333
next prev parent reply other threads:[~2015-05-22 23:51 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-21 13:13 Troubleshoot clone issue to NFS steve.norman
2015-05-21 14:00 ` Christian Couder
2015-05-21 14:31 ` Duy Nguyen
2015-05-21 14:38 ` Duy Nguyen
2015-05-21 15:53 ` steve.norman
2015-05-22 0:16 ` Duy Nguyen
2015-05-22 7:12 ` Jeff King
2015-05-22 8:35 ` steve.norman
2015-05-22 10:05 ` Duy Nguyen
2015-05-22 14:37 ` Junio C Hamano
2015-05-22 15:02 ` steve.norman
2015-05-22 23:51 ` [PATCH/RFC 0/3] using stat() to avoid re-scanning pack dir Jeff King
2015-05-22 23:51 ` Jeff King [this message]
2015-05-23 11:00 ` [PATCH 1/3] stat_validity: handle non-regular files Michael Haggerty
2015-05-24 8:29 ` Jeff King
2015-05-22 23:52 ` [PATCH 2/3] cache.h: move stat_validity definition up Jeff King
2015-05-22 23:54 ` [PATCH 3/3] prepare_packed_git: use stat_validity to avoid re-reading packs Jeff King
2015-05-23 1:19 ` [PATCH/RFC 0/3] using stat() to avoid re-scanning pack dir Duy Nguyen
2015-05-23 1:21 ` Duy Nguyen
2015-05-24 8:20 ` Jeff King
2015-05-24 9:00 ` Troubleshoot clone issue to NFS Duy Nguyen
2015-06-05 12:01 ` steve.norman
2015-06-05 12:18 ` Jeff King
2015-06-05 12:29 ` [PATCH] index-pack: avoid excessive re-reading of pack directory Jeff King
2015-06-09 17:24 ` Jeff King
2015-06-09 17:41 ` Jeff King
2015-06-10 3:46 ` Shawn Pearce
2015-06-10 14:00 ` Jeff King
2015-06-10 14:36 ` Duy Nguyen
2015-06-10 21:34 ` Shawn Pearce
2015-06-05 14:20 ` Troubleshoot clone issue to NFS steve.norman
2015-06-16 20:50 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150522235143.GA4818@peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=mhagger@alum.mit.edu \
--cc=pclouds@gmail.com \
--cc=steve.norman@thomsonreuters.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.