All of lore.kernel.org
 help / color / mirror / Atom feed
* [JGIT PATCH 1/2] Add getLong to RepositoryConfig
@ 2009-06-12 23:23 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:57 ` [JGIT PATCH 1/2] Add getLong to RepositoryConfig Ferry Huberts
  0 siblings, 2 replies; 7+ messages in thread
From: Shawn O. Pearce @ 2009-06-12 23:23 UTC (permalink / raw)
  To: Robin Rosenberg; +Cc: git

This supports parsing 64 bit configuration values.  We want to use
it for values like core.packedGitLimit where a 64 bit JVM may want
to support a very large value, well past the 2 GiB barrier.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../org/spearce/jgit/lib/RepositoryConfigTest.java |   26 ++++++++++++++++++++
 .../src/org/spearce/jgit/lib/RepositoryConfig.java |   26 ++++++++++++++++++-
 2 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java
index ed573e1..5e2328b 100644
--- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java
+++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java
@@ -233,6 +233,32 @@ public void testReadBoolean_OnOff2() throws IOException {
 		assertFalse(c.getBoolean("s", "b", true));
 	}
 
+	public void testReadLong() throws IOException {
+		assertReadLong(1L);
+		assertReadLong(-1L);
+		assertReadLong(Long.MIN_VALUE);
+		assertReadLong(Long.MAX_VALUE);
+		assertReadLong(4L * 1024 * 1024 * 1024, "4g");
+		assertReadLong(3L * 1024 * 1024, "3 m");
+		assertReadLong(8L * 1024, "8 k");
+
+		try {
+			assertReadLong(-1, "1.5g");
+			fail("incorrectly accepted 1.5g");
+		} catch (IllegalArgumentException e) {
+			assertEquals("Invalid integer value: s.a=1.5g", e.getMessage());
+		}
+	}
+
+	private void assertReadLong(long exp) throws IOException {
+		assertReadLong(exp, String.valueOf(exp));
+	}
+
+	private void assertReadLong(long exp, String act) throws IOException {
+		final RepositoryConfig c = read("[s]\na = " + act + "\n");
+		assertEquals(exp, c.getLong("s", null, "a", 0L));
+	}
+
 	private RepositoryConfig read(final String content) throws IOException {
 		final File p = writeTrashFile(getName() + ".config", content);
 		final RepositoryConfig c = new RepositoryConfig(null, p);
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java
index b816604..a339514 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java
@@ -183,6 +183,28 @@ public int getInt(final String section, final String name,
 	 */
 	public int getInt(final String section, String subsection,
 			final String name, final int defaultValue) {
+		final long val = getLong(section, subsection, name, defaultValue);
+		if (Integer.MIN_VALUE <= val && val <= Integer.MAX_VALUE)
+			return (int) val;
+		throw new IllegalArgumentException("Integer value " + section + "."
+				+ name + " out of range");
+	}
+
+	/**
+	 * Obtain an integer value from the configuration.
+	 *
+	 * @param section
+	 *            section the key is grouped within.
+	 * @param subsection
+	 *            subsection name, such a remote or branch name.
+	 * @param name
+	 *            name of the key to get.
+	 * @param defaultValue
+	 *            default value to return if no value was present.
+	 * @return an integer value from the configuration, or defaultValue.
+	 */
+	public long getLong(final String section, String subsection,
+			final String name, final long defaultValue) {
 		final String str = getString(section, subsection, name);
 		if (str == null)
 			return defaultValue;
@@ -191,7 +213,7 @@ public int getInt(final String section, String subsection,
 		if (n.length() == 0)
 			return defaultValue;
 
-		int mul = 1;
+		long mul = 1;
 		switch (Character.toLowerCase(n.charAt(n.length() - 1))) {
 		case 'g':
 			mul = 1024 * 1024 * 1024;
@@ -209,7 +231,7 @@ public int getInt(final String section, String subsection,
 			return defaultValue;
 
 		try {
-			return mul * Integer.parseInt(n);
+			return mul * Long.parseLong(n);
 		} catch (NumberFormatException nfe) {
 			throw new IllegalArgumentException("Invalid integer value: "
 					+ section + "." + name + "=" + str);
-- 
1.6.3.2.367.gf0de

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [JGIT PATCH 2/2] Allow core.packedGitLimit to exceed "2 g"
  2009-06-12 23:23 [JGIT PATCH 1/2] Add getLong to RepositoryConfig Shawn O. Pearce
@ 2009-06-12 23:23 ` Shawn O. Pearce
  2009-06-13  7:56   ` Ferry Huberts
  2009-06-13  7:57 ` [JGIT PATCH 1/2] Add getLong to RepositoryConfig Ferry Huberts
  1 sibling, 1 reply; 7+ messages in thread
From: Shawn O. Pearce @ 2009-06-12 23:23 UTC (permalink / raw)
  To: Robin Rosenberg; +Cc: git

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);
 	}
 
 	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()));
-- 
1.6.3.2.367.gf0de

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [JGIT PATCH 2/2] Allow core.packedGitLimit to exceed "2 g"
  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
  2009-06-13 19:19     ` Shawn O. Pearce
  0 siblings, 1 reply; 7+ messages in thread
From: Ferry Huberts @ 2009-06-13  7:56 UTC (permalink / raw)
  To: Shawn O. Pearce; +Cc: Robin Rosenberg, git

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()));

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [JGIT PATCH 1/2] Add getLong to RepositoryConfig
  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:57 ` Ferry Huberts
  2009-06-13 19:21   ` Shawn O. Pearce
  1 sibling, 1 reply; 7+ messages in thread
From: Ferry Huberts @ 2009-06-13  7:57 UTC (permalink / raw)
  To: Shawn O. Pearce; +Cc: Robin Rosenberg, git

Shawn O. Pearce wrote:
> This supports parsing 64 bit configuration values.  We want to use
> it for values like core.packedGitLimit where a 64 bit JVM may want
> to support a very large value, well past the 2 GiB barrier.
> 
> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
> ---
>  .../org/spearce/jgit/lib/RepositoryConfigTest.java |   26 ++++++++++++++++++++
>  .../src/org/spearce/jgit/lib/RepositoryConfig.java |   26 ++++++++++++++++++-
>  2 files changed, 50 insertions(+), 2 deletions(-)
> 
> diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java
> index ed573e1..5e2328b 100644
> --- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java
> +++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java
> @@ -233,6 +233,32 @@ public void testReadBoolean_OnOff2() throws IOException {
>  		assertFalse(c.getBoolean("s", "b", true));
>  	}
>  
> +	public void testReadLong() throws IOException {
> +		assertReadLong(1L);
> +		assertReadLong(-1L);
> +		assertReadLong(Long.MIN_VALUE);
> +		assertReadLong(Long.MAX_VALUE);
> +		assertReadLong(4L * 1024 * 1024 * 1024, "4g");
> +		assertReadLong(3L * 1024 * 1024, "3 m");
> +		assertReadLong(8L * 1024, "8 k");
> +
> +		try {
> +			assertReadLong(-1, "1.5g");
> +			fail("incorrectly accepted 1.5g");
> +		} catch (IllegalArgumentException e) {
> +			assertEquals("Invalid integer value: s.a=1.5g", e.getMessage());
> +		}
> +	}
> +
> +	private void assertReadLong(long exp) throws IOException {
> +		assertReadLong(exp, String.valueOf(exp));
> +	}
> +
> +	private void assertReadLong(long exp, String act) throws IOException {
> +		final RepositoryConfig c = read("[s]\na = " + act + "\n");
> +		assertEquals(exp, c.getLong("s", null, "a", 0L));
> +	}
> +
>  	private RepositoryConfig read(final String content) throws IOException {
>  		final File p = writeTrashFile(getName() + ".config", content);
>  		final RepositoryConfig c = new RepositoryConfig(null, p);
> diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java
> index b816604..a339514 100644
> --- a/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java
> +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java
> @@ -183,6 +183,28 @@ public int getInt(final String section, final String name,
>  	 */
>  	public int getInt(final String section, String subsection,
>  			final String name, final int defaultValue) {
> +		final long val = getLong(section, subsection, name, defaultValue);
> +		if (Integer.MIN_VALUE <= val && val <= Integer.MAX_VALUE)
> +			return (int) val;
> +		throw new IllegalArgumentException("Integer value " + section + "."
> +				+ name + " out of range");
> +	}
> +
> +	/**
> +	 * Obtain an integer value from the configuration.
s/integer/long/g in this (copy&paste) javadoc part

> +	 *
> +	 * @param section
> +	 *            section the key is grouped within.
> +	 * @param subsection
> +	 *            subsection name, such a remote or branch name.
> +	 * @param name
> +	 *            name of the key to get.
> +	 * @param defaultValue
> +	 *            default value to return if no value was present.
> +	 * @return an integer value from the configuration, or defaultValue.
> +	 */
> +	public long getLong(final String section, String subsection,
> +			final String name, final long defaultValue) {
>  		final String str = getString(section, subsection, name);
>  		if (str == null)
>  			return defaultValue;
> @@ -191,7 +213,7 @@ public int getInt(final String section, String subsection,
>  		if (n.length() == 0)
>  			return defaultValue;
>  
> -		int mul = 1;
> +		long mul = 1;
>  		switch (Character.toLowerCase(n.charAt(n.length() - 1))) {
>  		case 'g':
>  			mul = 1024 * 1024 * 1024;
> @@ -209,7 +231,7 @@ public int getInt(final String section, String subsection,
>  			return defaultValue;
>  
>  		try {
> -			return mul * Integer.parseInt(n);
> +			return mul * Long.parseLong(n);
>  		} catch (NumberFormatException nfe) {
>  			throw new IllegalArgumentException("Invalid integer value: "
>  					+ section + "." + name + "=" + str);

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [JGIT PATCH 2/2] Allow core.packedGitLimit to exceed "2 g"
  2009-06-13  7:56   ` Ferry Huberts
@ 2009-06-13 19:19     ` Shawn O. Pearce
  2009-06-14  8:49       ` Ferry Huberts
  0 siblings, 1 reply; 7+ messages in thread
From: Shawn O. Pearce @ 2009-06-13 19:19 UTC (permalink / raw)
  To: Ferry Huberts; +Cc: Robin Rosenberg, git

Ferry Huberts <ferry.huberts@pelagic.nl> wrote:
> Shawn O. Pearce wrote:
> > A 64 bit JVM might actually be able to dedicate more than 2 GiB of

Please don't quote everything if you are only replying to a tiny
part.

> >  	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);

If you looked at that, 2,000,000,000 is within the range of an int.
We select the smallest value.  The first argument expression is
computed as a long, so we shouldn't ever overflow and cause the
first argument to be negative.  If the first argument is larger
than 2 billion, then it does risk overflow, but the 2nd argument
is smaller, so it is returned.

The code is fine as is.
 
-- 
Shawn.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [JGIT PATCH 1/2] Add getLong to RepositoryConfig
  2009-06-13  7:57 ` [JGIT PATCH 1/2] Add getLong to RepositoryConfig Ferry Huberts
@ 2009-06-13 19:21   ` Shawn O. Pearce
  0 siblings, 0 replies; 7+ messages in thread
From: Shawn O. Pearce @ 2009-06-13 19:21 UTC (permalink / raw)
  To: Ferry Huberts; +Cc: Robin Rosenberg, git

Ferry Huberts <ferry.huberts@pelagic.nl> wrote:
> Shawn O. Pearce wrote:
> > This supports parsing 64 bit configuration values.
...
> > +	/**
> > +	 * Obtain an integer value from the configuration.
> s/integer/long/g in this (copy&paste) javadoc part

Its still integer as in from the integer number space, and not say
a floating point decimal.  Thus I didn't bother with this edit,
I figured the method name was clear enough that it would return
a long, but the concept of it parsing only "2g" and not "1.5g"
should go in the documentation.
 
And again, please trim parts you aren't replying to.

-- 
Shawn.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [JGIT PATCH 2/2] Allow core.packedGitLimit to exceed "2 g"
  2009-06-13 19:19     ` Shawn O. Pearce
@ 2009-06-14  8:49       ` Ferry Huberts
  0 siblings, 0 replies; 7+ messages in thread
From: Ferry Huberts @ 2009-06-14  8:49 UTC (permalink / raw)
  To: Shawn O. Pearce; +Cc: Robin Rosenberg, git

> If you looked at that, 2,000,000,000 is within the range of an int.
> We select the smallest value.  The first argument expression is
> computed as a long, so we shouldn't ever overflow and cause the
> first argument to be negative.  If the first argument is larger
> than 2 billion, then it does risk overflow, but the 2nd argument
> is smaller, so it is returned.
> 
> The code is fine as is.
>  

I stand corrected :-)

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2009-06-14  8:49 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
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

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.