git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sam Vilain <sam.vilain@catalyst.net.nz>
To: git@vger.kernel.org
Cc: "René Scharfe" <rene.scharfe@lsrfire.ath.cx>,
	"Johannes Sixt" <j6t@kdbg.org>,
	"Junio C Hamano" <gitster@pobox.com>
Subject: [PATCH 097/104] Fix checkout of large files to network shares on Windows XP
Date: Wed, 26 May 2010 18:01:07 +1200	[thread overview]
Message-ID: <1274853674-18521-97-git-send-email-sam.vilain@catalyst.net.nz> (raw)
In-Reply-To: <1274853674-18521-1-git-send-email-sam.vilain@catalyst.net.nz>

From: René Scharfe <rene.scharfe@lsrfire.ath.cx>

Bigger writes to network drives on Windows XP fail.  Cap them at 31MB to
allow them to succeed.  Callers need to be prepared for write() calls
that do less work than requested anyway.

On local drives, write() calls are translated to WriteFile() calls with
a cap of 64KB on Windows XP and 256KB on Vista.  Thus a cap of 31MB won't
affect the number of WriteFile() calls which do the actual work.  There's
still room for some other version of Windows to use a chunk size of 1MB
without increasing the number of system calls.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 compat/mingw.c       |   17 +++++++++++++++++
 compat/mingw.h       |    3 +++
 t/t5705-clone-2gb.sh |   12 +++++++++---
 3 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/compat/mingw.c b/compat/mingw.c
index f90a114..9a8e336 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -140,6 +140,23 @@ int mingw_open (const char *filename, int oflags, ...)
 	return fd;
 }
 
+#undef write
+ssize_t mingw_write(int fd, const void *buf, size_t count)
+{
+	/*
+	 * While write() calls to a file on a local disk are translated
+	 * into WriteFile() calls with a maximum size of 64KB on Windows
+	 * XP and 256KB on Vista, no such cap is placed on writes to
+	 * files over the network on Windows XP.  Unfortunately, there
+	 * seems to be a limit of 32MB-28KB on X64 and 64MB-32KB on x86;
+	 * bigger writes fail on Windows XP.
+	 * So we cap to a nice 31MB here to avoid write failures over
+	 * the net without changing the number of WriteFile() calls in
+	 * the local case.
+	 */
+	return write(fd, buf, min(count, 31 * 1024 * 1024));
+}
+
 #undef fopen
 FILE *mingw_fopen (const char *filename, const char *otype)
 {
diff --git a/compat/mingw.h b/compat/mingw.h
index 7c2ab64..0e3e743 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -170,6 +170,9 @@ int link(const char *oldpath, const char *newpath);
 int mingw_open (const char *filename, int oflags, ...);
 #define open mingw_open
 
+ssize_t mingw_write(int fd, const void *buf, size_t count);
+#define write mingw_write
+
 FILE *mingw_fopen (const char *filename, const char *otype);
 #define fopen mingw_fopen
 
diff --git a/t/t5705-clone-2gb.sh b/t/t5705-clone-2gb.sh
index adfaae8..8afbdd4 100755
--- a/t/t5705-clone-2gb.sh
+++ b/t/t5705-clone-2gb.sh
@@ -12,7 +12,7 @@ test_expect_success 'setup' '
 
 	git config pack.compression 0 &&
 	git config pack.depth 0 &&
-	blobsize=$((20*1024*1024)) &&
+	blobsize=$((100*1024*1024)) &&
 	blobcount=$((2*1024*1024*1024/$blobsize+1)) &&
 	i=1 &&
 	(while test $i -le $blobcount
@@ -36,9 +36,15 @@ test_expect_success 'setup' '
 
 '
 
-test_expect_success 'clone' '
+test_expect_success 'clone - bare' '
 
-	git clone --bare --no-hardlinks . clone
+	git clone --bare --no-hardlinks . clone-bare
+
+'
+
+test_expect_success 'clone - with worktree, file:// protocol' '
+
+	git clone file://. clone-wt
 
 '
 
-- 
1.7.1.rc2.333.gb2668

  parent reply	other threads:[~2010-05-26  6:07 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1274853674-18521-1-git-send-email-sam.vilain@catalyst.net.nz>
2010-05-26  6:00 ` [PATCH 075/104] tests: chmod +x t5150 Sam Vilain
2010-05-26  6:00 ` [PATCH 076/104] t7604-merge-custom-message: shift expected output creation Sam Vilain
2010-05-26  6:00 ` [PATCH 082/104] fmt-merge-msg: add function to append shortlog only Sam Vilain
2010-05-26  6:00 ` [PATCH 084/104] autocrlf: Make it work also for un-normalized repositories Sam Vilain
2010-05-26  6:00 ` [PATCH 086/104] gitweb: Use @diff_opts while using format-patch Sam Vilain
2010-05-26  6:00 ` [PATCH 087/104] hash_object: correction for zero length file Sam Vilain
2010-05-26  6:00 ` [PATCH 088/104] for-each-ref: Field with abbreviated objectname Sam Vilain
2010-05-26  6:01 ` [PATCH 090/104] Documentation: rebase -i ignores options passed to "git am" Sam Vilain
2010-05-26  6:01 ` [PATCH 091/104] Documentation: fix minor inconsistency Sam Vilain
2010-05-26  6:01 ` [PATCH 092/104] Documentation/gitdiffcore: fix order in pickaxe description Sam Vilain
2010-05-26  6:01 ` [PATCH 093/104] post-receive-email: document command-line mode Sam Vilain
2010-05-26  6:01 ` [PATCH 094/104] diff: fix coloring of extended diff headers Sam Vilain
2010-05-26  6:01 ` [PATCH 095/104] Fix "Out of memory? mmap failed" for files larger than 4GB on Windows Sam Vilain
2010-05-26  6:01 ` [PATCH 096/104] start_command: close cmd->err descriptor when fork/spawn fails Sam Vilain
2010-05-26  6:01 ` Sam Vilain [this message]
2010-05-26  6:01 ` [PATCH 098/104] mingw: use _commit to implement fsync Sam Vilain
2010-05-26  6:01 ` [PATCH 099/104] Recent MinGW has a C99 implementation of snprintf functions Sam Vilain
2010-05-26  6:01 ` [PATCH 100/104] Complete prototype of git_config_from_parameters() Sam Vilain
2010-05-26  6:01 ` [PATCH 101/104] test get_git_work_tree() return value for NULL Sam Vilain
2010-05-26  6:01 ` [PATCH 102/104] t7502-commit: fix spelling Sam Vilain
2010-05-26  6:01 ` [PATCH 103/104] show-branch: use DEFAULT_ABBREV instead of 7 Sam Vilain
2010-05-26  6:01 ` [PATCH 104/104] Documentation/SubmittingPatches: clarify GMail section and SMTP Sam Vilain
     [not found] ` <1274853674-18521-22-git-send-email-sam.vilain@catalyst.net.nz>
2010-05-26  7:46   ` [PATCH 022/104] Gitweb: ignore built file Sverre Rabbelier

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=1274853674-18521-97-git-send-email-sam.vilain@catalyst.net.nz \
    --to=sam.vilain@catalyst.net.nz \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=j6t@kdbg.org \
    --cc=rene.scharfe@lsrfire.ath.cx \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).