Skip to content

Commit 04e5166

Browse files
authored
fix: properly implement GrpcBlobReadChannel#isOpen (#1733)
* fix: fix GrpcBlobReadChannel#isOpen Previously a subbed method was still being used, now it will check the lazy channel. Removed duplicate memoization of channel factory * chore: update assertion for possible RPO values via gRPC
1 parent d5e937f commit 04e5166

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcBlobReadChannel.java

+27-17
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,18 @@ final class GrpcBlobReadChannel implements ReadChannel {
4949
boolean autoGzipDecompression) {
5050
this.lazyReadChannel =
5151
new LazyReadChannel(
52-
Suppliers.memoize(
53-
() -> {
54-
ReadObjectRequest req =
55-
seekReadObjectRequest(request, position, sub(limit, position));
56-
return ResumableMedia.gapic()
57-
.read()
58-
.byteChannel(read)
59-
.setHasher(Hasher.noop())
60-
.setAutoGzipDecompression(autoGzipDecompression)
61-
.buffered(BufferHandle.allocate(chunkSize))
62-
.setReadObjectRequest(req)
63-
.build();
64-
}));
52+
() -> {
53+
ReadObjectRequest req =
54+
seekReadObjectRequest(request, position, sub(limit, position));
55+
return ResumableMedia.gapic()
56+
.read()
57+
.byteChannel(read)
58+
.setHasher(Hasher.noop())
59+
.setAutoGzipDecompression(autoGzipDecompression)
60+
.buffered(BufferHandle.allocate(chunkSize))
61+
.setReadObjectRequest(req)
62+
.build();
63+
});
6564
}
6665

6766
@Override
@@ -72,7 +71,7 @@ public void setChunkSize(int chunkSize) {
7271

7372
@Override
7473
public boolean isOpen() {
75-
return false;
74+
return lazyReadChannel.isOpen() && lazyReadChannel.getChannel().isOpen();
7675
}
7776

7877
@Override
@@ -81,8 +80,8 @@ public void close() {
8180
try {
8281
lazyReadChannel.getChannel().close();
8382
} catch (IOException e) {
84-
// TODO: why does ReadChannel remove IOException?!
85-
throw new RuntimeException(e);
83+
// why does ReadChannel remove IOException?!
84+
throw StorageException.coalesce(e);
8685
}
8786
}
8887
}
@@ -149,13 +148,24 @@ private static final class LazyReadChannel {
149148
private final Supplier<BufferedReadableByteChannelSession<Object>> session;
150149
private final Supplier<BufferedReadableByteChannel> channel;
151150

151+
private boolean open = false;
152+
152153
public LazyReadChannel(Supplier<BufferedReadableByteChannelSession<Object>> session) {
153154
this.session = session;
154-
this.channel = Suppliers.memoize(() -> session.get().open());
155+
this.channel =
156+
Suppliers.memoize(
157+
() -> {
158+
open = true;
159+
return session.get().open();
160+
});
155161
}
156162

157163
public BufferedReadableByteChannel getChannel() {
158164
return channel.get();
159165
}
166+
167+
public boolean isOpen() {
168+
return open;
169+
}
160170
}
161171
}

google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITReadMaskTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ public static Iterable<Args<BucketField, BucketInfo>> parameters() {
183183
BucketField.RPO,
184184
(jsonT, grpcT) -> {
185185
assertThat(jsonT.getRpo()).isEqualTo(Rpo.DEFAULT);
186-
assertThat(grpcT.getRpo()).isNull();
186+
// TODO: cleanup allowed null value in mid nov
187+
assertThat(grpcT.getRpo()).isAnyOf(Rpo.DEFAULT, null);
187188
}),
188189
new Args<>(
189190
BucketField.SELF_LINK,

0 commit comments

Comments
 (0)