From c7bfbffd31afcd78b783df3d1068d0707d140e3c Mon Sep 17 00:00:00 2001 From: Vishesh Garg Date: Mon, 11 Mar 2024 18:30:34 +0530 Subject: [PATCH] Correct the API used to fetch the version for a GCS object (#16097) Current API used to fetch the version for a GCS object is incorrect. This PR fixes that API. (cherry picked from commit 2dd8b16467e97fb51fd6d3985424f9521ef6cb36) --- .../apache/druid/storage/google/GoogleStorage.java | 13 +++++++++++-- .../google/GoogleTimestampVersionedDataFinder.java | 2 +- .../druid/storage/google/GoogleStorageTest.java | 6 +++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/extensions-core/google-extensions/src/main/java/org/apache/druid/storage/google/GoogleStorage.java b/extensions-core/google-extensions/src/main/java/org/apache/druid/storage/google/GoogleStorage.java index 57c2ac1843bf..6a5d17f7c242 100644 --- a/extensions-core/google-extensions/src/main/java/org/apache/druid/storage/google/GoogleStorage.java +++ b/extensions-core/google-extensions/src/main/java/org/apache/druid/storage/google/GoogleStorage.java @@ -198,13 +198,22 @@ public long size(final String bucket, final String path) throws IOException return blob.getSize(); } + /** + * Return the etag for an object. This is a value that changes whenever the object's data or metadata changes and is + * typically but not always the MD5 hash of the object. Ref: + * ETags + * @param bucket + * @param path + * @return + * @throws IOException + */ public String version(final String bucket, final String path) throws IOException { - Blob blob = storage.get().get(bucket, path, Storage.BlobGetOption.fields(Storage.BlobField.GENERATION)); + Blob blob = storage.get().get(bucket, path, Storage.BlobGetOption.fields(Storage.BlobField.ETAG)); if (blob == null) { throw new IOE("Failed to fetch google cloud storage object from bucket [%s] and path [%s].", bucket, path); } - return blob.getGeneratedId(); + return blob.getEtag(); } /*** diff --git a/extensions-core/google-extensions/src/main/java/org/apache/druid/storage/google/GoogleTimestampVersionedDataFinder.java b/extensions-core/google-extensions/src/main/java/org/apache/druid/storage/google/GoogleTimestampVersionedDataFinder.java index 01ae094912cf..d95577d5be6e 100644 --- a/extensions-core/google-extensions/src/main/java/org/apache/druid/storage/google/GoogleTimestampVersionedDataFinder.java +++ b/extensions-core/google-extensions/src/main/java/org/apache/druid/storage/google/GoogleTimestampVersionedDataFinder.java @@ -76,7 +76,7 @@ public URI getLatestVersion(URI descriptorBase, @Nullable Pattern pattern) return latest; } catch (IOException e) { - throw new RuntimeException(); + throw new RuntimeException(e); } } } diff --git a/extensions-core/google-extensions/src/test/java/org/apache/druid/storage/google/GoogleStorageTest.java b/extensions-core/google-extensions/src/test/java/org/apache/druid/storage/google/GoogleStorageTest.java index 0a6d346d1c40..15fbde3c5211 100644 --- a/extensions-core/google-extensions/src/test/java/org/apache/druid/storage/google/GoogleStorageTest.java +++ b/extensions-core/google-extensions/src/test/java/org/apache/druid/storage/google/GoogleStorageTest.java @@ -203,18 +203,18 @@ public void testSize() throws IOException @Test public void testVersion() throws IOException { - final String version = "7"; + final String etag = "abcd"; EasyMock.expect(mockStorage.get( EasyMock.eq(BUCKET), EasyMock.eq(PATH), EasyMock.anyObject(Storage.BlobGetOption.class) )).andReturn(blob); - EasyMock.expect(blob.getGeneratedId()).andReturn(version); + EasyMock.expect(blob.getEtag()).andReturn(etag); EasyMock.replay(mockStorage, blob); - assertEquals(version, googleStorage.version(BUCKET, PATH)); + assertEquals(etag, googleStorage.version(BUCKET, PATH)); } @Test