diff --git a/gcloud-java-contrib/gcloud-java-nio/src/main/java/com/google/cloud/storage/contrib/nio/CloudStorageReadChannel.java b/gcloud-java-contrib/gcloud-java-nio/src/main/java/com/google/cloud/storage/contrib/nio/CloudStorageReadChannel.java index 5b5e2b649e0d..bb03e53fc362 100644 --- a/gcloud-java-contrib/gcloud-java-nio/src/main/java/com/google/cloud/storage/contrib/nio/CloudStorageReadChannel.java +++ b/gcloud-java-contrib/gcloud-java-nio/src/main/java/com/google/cloud/storage/contrib/nio/CloudStorageReadChannel.java @@ -118,7 +118,7 @@ public SeekableByteChannel position(long newPosition) throws IOException { if (newPosition == position) { return this; } - channel.seek((int) newPosition); + channel.seek(newPosition); position = newPosition; return this; } diff --git a/gcloud-java-core/src/main/java/com/google/cloud/ReadChannel.java b/gcloud-java-core/src/main/java/com/google/cloud/ReadChannel.java index 2afb8b2d5b32..1ac45902b27d 100644 --- a/gcloud-java-core/src/main/java/com/google/cloud/ReadChannel.java +++ b/gcloud-java-core/src/main/java/com/google/cloud/ReadChannel.java @@ -38,7 +38,7 @@ public interface ReadChannel extends ReadableByteChannel, Closeable, Restorable< @Override void close(); - void seek(int position) throws IOException; + void seek(long position) throws IOException; /** * Sets the minimum size that will be read by a single RPC. diff --git a/gcloud-java-examples/src/main/java/com/google/cloud/examples/nio/ParallelCountBytes.java b/gcloud-java-examples/src/main/java/com/google/cloud/examples/nio/ParallelCountBytes.java index f2b0959acee8..0f268ddb72ca 100644 --- a/gcloud-java-examples/src/main/java/com/google/cloud/examples/nio/ParallelCountBytes.java +++ b/gcloud-java-examples/src/main/java/com/google/cloud/examples/nio/ParallelCountBytes.java @@ -74,7 +74,7 @@ public WorkUnit(SeekableByteChannel chan, int blockSize, int blockIndex) { @Override public WorkUnit call() throws IOException { - int pos = blockSize * blockIndex; + long pos = ((long)blockSize) * blockIndex; if (pos > chan.size()) { return this; } @@ -90,6 +90,7 @@ public WorkUnit resetForIndex(int blockIndex) { return this; } + public void close() throws IOException { chan.close(); } diff --git a/gcloud-java-storage/src/main/java/com/google/cloud/storage/BlobReadChannel.java b/gcloud-java-storage/src/main/java/com/google/cloud/storage/BlobReadChannel.java index 0352e8a9d550..04b085574844 100644 --- a/gcloud-java-storage/src/main/java/com/google/cloud/storage/BlobReadChannel.java +++ b/gcloud-java-storage/src/main/java/com/google/cloud/storage/BlobReadChannel.java @@ -45,7 +45,7 @@ class BlobReadChannel implements ReadChannel { private final BlobId blob; private final Map requestOptions; private String lastEtag; - private int position; + private long position; private boolean isOpen; private boolean endOfStream; private int chunkSize = DEFAULT_CHUNK_SIZE; @@ -99,7 +99,7 @@ private void validateOpen() throws ClosedChannelException { } @Override - public void seek(int position) throws IOException { + public void seek(long position) throws IOException { validateOpen(); this.position = position; buffer = null; @@ -164,7 +164,7 @@ static class StateImpl implements RestorableState, Serializable { private final BlobId blob; private final Map requestOptions; private final String lastEtag; - private final int position; + private final long position; private final boolean isOpen; private final boolean endOfStream; private final int chunkSize; @@ -185,7 +185,7 @@ static class Builder { private final BlobId blob; private final Map requestOptions; private String lastEtag; - private int position; + private long position; private boolean isOpen; private boolean endOfStream; private int chunkSize; @@ -201,7 +201,7 @@ Builder lastEtag(String lastEtag) { return this; } - Builder position(int position) { + Builder position(long position) { this.position = position; return this; } diff --git a/gcloud-java-storage/src/main/java/com/google/cloud/storage/spi/DefaultStorageRpc.java b/gcloud-java-storage/src/main/java/com/google/cloud/storage/spi/DefaultStorageRpc.java index 65d540458c7c..883ce80003bb 100644 --- a/gcloud-java-storage/src/main/java/com/google/cloud/storage/spi/DefaultStorageRpc.java +++ b/gcloud-java-storage/src/main/java/com/google/cloud/storage/spi/DefaultStorageRpc.java @@ -31,6 +31,7 @@ import static com.google.cloud.storage.spi.StorageRpc.Option.PREFIX; import static com.google.cloud.storage.spi.StorageRpc.Option.VERSIONS; import static com.google.common.base.MoreObjects.firstNonNull; +import static com.google.common.base.Preconditions.checkArgument; import static java.net.HttpURLConnection.HTTP_NOT_FOUND; import static javax.servlet.http.HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE; @@ -467,10 +468,11 @@ public Tuple read(StorageObject from, Map options, lo .setIfMetagenerationNotMatch(IF_METAGENERATION_NOT_MATCH.getLong(options)) .setIfGenerationMatch(IF_GENERATION_MATCH.getLong(options)) .setIfGenerationNotMatch(IF_GENERATION_NOT_MATCH.getLong(options)); + checkArgument(position >= 0, "Position should be non-negative, is %d", position); StringBuilder range = new StringBuilder(); range.append("bytes=").append(position).append("-").append(position + bytes - 1); req.getRequestHeaders().setRange(range.toString()); - ByteArrayOutputStream output = new ByteArrayOutputStream(); + ByteArrayOutputStream output = new ByteArrayOutputStream(bytes); req.executeMedia().download(output); String etag = req.getLastResponseHeaders().getETag(); return Tuple.of(etag, output.toByteArray());