From 93a44b0976f9d5cf487d44ea86da84bed17a550b Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Wed, 29 Jan 2020 11:32:02 +0100 Subject: [PATCH] info: add additional information to error message Any error that might occur during the listing of databases of an instance will now also include the name of the instance and the page token that was used to try to get the databases. This makes it easier to debug why a particular RPC might have failed. Closes #17 --- .../spanner/DatabaseAdminClientImpl.java | 14 +++++++- .../spanner/DatabaseAdminClientImplTest.java | 34 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseAdminClientImpl.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseAdminClientImpl.java index de24e9626de..3211c22b963 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseAdminClientImpl.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseAdminClientImpl.java @@ -28,6 +28,7 @@ import com.google.cloud.spanner.SpannerImpl.PageFetcher; import com.google.cloud.spanner.spi.v1.SpannerRpc; import com.google.cloud.spanner.spi.v1.SpannerRpc.Paginated; +import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.protobuf.Empty; import com.google.spanner.admin.database.v1.CreateDatabaseMetadata; @@ -155,7 +156,18 @@ public Page listDatabases(String instanceId, ListOption... options) { @Override public Paginated getNextPage( String nextPageToken) { - return rpc.listDatabases(instanceName, pageSize, nextPageToken); + try { + return rpc.listDatabases(instanceName, pageSize, nextPageToken); + } catch (SpannerException e) { + throw SpannerExceptionFactory.newSpannerException( + e.getErrorCode(), + String.format( + "Failed to list the databases of %s with pageToken %s: %s", + instanceName, + MoreObjects.firstNonNull(nextPageToken, ""), + e.getMessage()), + e); + } } @Override diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseAdminClientImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseAdminClientImplTest.java index 6cb0a21d4c0..260c2f77ca8 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseAdminClientImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseAdminClientImplTest.java @@ -43,6 +43,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -170,6 +171,39 @@ public void listDatabases() { assertThat(dbs.size()).isEqualTo(2); } + @Test + public void listDatabasesError() { + when(rpc.listDatabases(INSTANCE_NAME, 1, null)) + .thenThrow( + SpannerExceptionFactory.newSpannerException(ErrorCode.INVALID_ARGUMENT, "Test error")); + try { + client.listDatabases(INSTANCE_ID, Options.pageSize(1)); + Assert.fail("Missing expected exception"); + } catch (SpannerException e) { + assertThat(e.getMessage()).contains(INSTANCE_NAME); + // Assert that the call was done without a page token. + assertThat(e.getMessage()).contains("with pageToken "); + } + } + + @Test + public void listDatabaseErrorWithToken() { + String pageToken = "token"; + when(rpc.listDatabases(INSTANCE_NAME, 1, null)) + .thenReturn(new Paginated<>(ImmutableList.of(getDatabaseProto()), pageToken)); + when(rpc.listDatabases(INSTANCE_NAME, 1, pageToken)) + .thenThrow( + SpannerExceptionFactory.newSpannerException(ErrorCode.INVALID_ARGUMENT, "Test error")); + try { + Lists.newArrayList(client.listDatabases(INSTANCE_ID, Options.pageSize(1)).iterateAll()); + Assert.fail("Missing expected exception"); + } catch (SpannerException e) { + assertThat(e.getMessage()).contains(INSTANCE_NAME); + // Assert that the call was done without a page token. + assertThat(e.getMessage()).contains(String.format("with pageToken %s", pageToken)); + } + } + @Test public void getDatabaseIAMPolicy() { when(rpc.getDatabaseAdminIAMPolicy(DB_NAME))