All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ferry Huberts <ferry.huberts@pelagic.nl>
To: "Shawn O. Pearce" <spearce@spearce.org>
Cc: Robin Rosenberg <robin.rosenberg@dewire.com>, git@vger.kernel.org
Subject: Re: [JGIT PATCH 2/2] Allow core.packedGitLimit to exceed "2 g"
Date: Sat, 13 Jun 2009 09:56:10 +0200	[thread overview]
Message-ID: <4A335B9A.7080808@pelagic.nl> (raw)
In-Reply-To: <1244848986-10526-2-git-send-email-spearce@spearce.org>

Shawn O. Pearce wrote:
> A 64 bit JVM might actually be able to dedicate more than 2 GiB of
> memory to the window cache, and on a busy server, this may be an
> ideal configuration since JGit can't always reliably use mmap.  By
> treating the limit as a long we increase our range to 2^63, which
> is far beyond what any JVM heap would be able to actually support.
> 
> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
> ---
>  .../src/org/spearce/jgit/lib/WindowCache.java      |   13 +++++++------
>  .../org/spearce/jgit/lib/WindowCacheConfig.java    |    8 ++++----
>  2 files changed, 11 insertions(+), 10 deletions(-)
> 
> diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/WindowCache.java b/org.spearce.jgit/src/org/spearce/jgit/lib/WindowCache.java
> index 0c60853..b6a35ad 100644
> --- a/org.spearce.jgit/src/org/spearce/jgit/lib/WindowCache.java
> +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/WindowCache.java
> @@ -41,6 +41,7 @@
>  import java.io.IOException;
>  import java.lang.ref.ReferenceQueue;
>  import java.util.concurrent.atomic.AtomicInteger;
> +import java.util.concurrent.atomic.AtomicLong;
>  
>  /**
>   * Caches slices of a {@link PackFile} in memory for faster read access.
> @@ -140,7 +141,7 @@ static final void purge(final PackFile pack) {
>  
>  	private final int maxFiles;
>  
> -	private final int maxBytes;
> +	private final long maxBytes;
>  
>  	private final boolean mmap;
>  
> @@ -150,7 +151,7 @@ static final void purge(final PackFile pack) {
>  
>  	private final AtomicInteger openFiles;
>  
> -	private final AtomicInteger openBytes;
> +	private final AtomicLong openBytes;
>  
>  	private WindowCache(final WindowCacheConfig cfg) {
>  		super(tableSize(cfg), lockCount(cfg));
> @@ -161,7 +162,7 @@ private WindowCache(final WindowCacheConfig cfg) {
>  		windowSize = 1 << windowSizeShift;
>  
>  		openFiles = new AtomicInteger();
> -		openBytes = new AtomicInteger();
> +		openBytes = new AtomicLong();
>  
>  		if (maxFiles < 1)
>  			throw new IllegalArgumentException("Open files must be >= 1");
> @@ -173,7 +174,7 @@ int getOpenFiles() {
>  		return openFiles.get();
>  	}
>  
> -	int getOpenBytes() {
> +	long getOpenBytes() {
>  		return openBytes.get();
>  	}
>  
> @@ -233,12 +234,12 @@ private long toStart(final long offset) {
>  
>  	private static int tableSize(final WindowCacheConfig cfg) {
>  		final int wsz = cfg.getPackedGitWindowSize();
> -		final int limit = cfg.getPackedGitLimit();
> +		final long limit = cfg.getPackedGitLimit();
>  		if (wsz <= 0)
>  			throw new IllegalArgumentException("Invalid window size");
>  		if (limit < wsz)
>  			throw new IllegalArgumentException("Window size must be < limit");
> -		return 5 * (limit / wsz) / 2;
> +		return (int) Math.min(5 * (limit / wsz) / 2, 2000000000);

Math.min returns a long because the prototype Math.min(long,long) will
be chosen. The cast can then overflow and fail. Better change the return
type to a long:
+ return Math.min(5 * (limit / wsz) / 2, 2000000000L);

>  	}
>  
>  	private static int lockCount(final WindowCacheConfig cfg) {
> diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/WindowCacheConfig.java b/org.spearce.jgit/src/org/spearce/jgit/lib/WindowCacheConfig.java
> index ea28164..97edd3a 100644
> --- a/org.spearce.jgit/src/org/spearce/jgit/lib/WindowCacheConfig.java
> +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/WindowCacheConfig.java
> @@ -47,7 +47,7 @@
>  
>  	private int packedGitOpenFiles;
>  
> -	private int packedGitLimit;
> +	private long packedGitLimit;
>  
>  	private int packedGitWindowSize;
>  
> @@ -85,7 +85,7 @@ public void setPackedGitOpenFiles(final int fdLimit) {
>  	 * @return maximum number bytes of heap memory to dedicate to caching pack
>  	 *         file data. <b>Default is 10 MB.</b>
>  	 */
> -	public int getPackedGitLimit() {
> +	public long getPackedGitLimit() {
>  		return packedGitLimit;
>  	}
>  
> @@ -94,7 +94,7 @@ public int getPackedGitLimit() {
>  	 *            maximum number bytes of heap memory to dedicate to caching
>  	 *            pack file data.
>  	 */
> -	public void setPackedGitLimit(final int newLimit) {
> +	public void setPackedGitLimit(final long newLimit) {
>  		packedGitLimit = newLimit;
>  	}
>  
> @@ -162,7 +162,7 @@ public void setDeltaBaseCacheLimit(final int newLimit) {
>  	 */
>  	public void fromConfig(final RepositoryConfig rc) {
>  		setPackedGitOpenFiles(rc.getInt("core", null, "packedgitopenfiles", getPackedGitOpenFiles()));
> -		setPackedGitLimit(rc.getInt("core", null, "packedgitlimit", getPackedGitLimit()));
> +		setPackedGitLimit(rc.getLong("core", null, "packedgitlimit", getPackedGitLimit()));
>  		setPackedGitWindowSize(rc.getInt("core", null, "packedgitwindowsize", getPackedGitWindowSize()));
>  		setPackedGitMMAP(rc.getBoolean("core", null, "packedgitmmap", isPackedGitMMAP()));
>  		setDeltaBaseCacheLimit(rc.getInt("core", null, "deltabasecachelimit", getDeltaBaseCacheLimit()));

  reply	other threads:[~2009-06-13  7:56 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-12 23:23 [JGIT PATCH 1/2] Add getLong to RepositoryConfig Shawn O. Pearce
2009-06-12 23:23 ` [JGIT PATCH 2/2] Allow core.packedGitLimit to exceed "2 g" Shawn O. Pearce
2009-06-13  7:56   ` Ferry Huberts [this message]
2009-06-13 19:19     ` Shawn O. Pearce
2009-06-14  8:49       ` Ferry Huberts
2009-06-13  7:57 ` [JGIT PATCH 1/2] Add getLong to RepositoryConfig Ferry Huberts
2009-06-13 19:21   ` Shawn O. Pearce

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=4A335B9A.7080808@pelagic.nl \
    --to=ferry.huberts@pelagic.nl \
    --cc=git@vger.kernel.org \
    --cc=robin.rosenberg@dewire.com \
    --cc=spearce@spearce.org \
    /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.