Skip to content

Commit 2471d91

Browse files
test: drop old databases from instance before running integration tests. (#1861)
This commit aims to resolve the RESOURCE_EXHAUSTED errors due to number of databases in an instance reaching the maximum limit. We drop only those DBs which are created through automated tests, at least 24 hours ago. Co-authored-by: Knut Olav Løite <[email protected]>
1 parent 6e1aa8e commit 2471d91

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

google-cloud-spanner/src/test/java/com/google/cloud/spanner/IntegrationTestEnv.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@
1919
import static com.google.common.base.Preconditions.checkState;
2020

2121
import com.google.api.gax.longrunning.OperationFuture;
22+
import com.google.api.gax.paging.Page;
23+
import com.google.cloud.Timestamp;
2224
import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
2325
import com.google.cloud.spanner.testing.RemoteSpannerHelper;
2426
import com.google.common.collect.Iterators;
2527
import com.google.spanner.admin.instance.v1.CreateInstanceMetadata;
2628
import io.grpc.Status;
2729
import java.util.Random;
30+
import java.util.concurrent.TimeUnit;
2831
import java.util.logging.Level;
2932
import java.util.logging.Logger;
3033
import org.junit.rules.ExternalResource;
@@ -53,6 +56,7 @@ public class IntegrationTestEnv extends ExternalResource {
5356

5457
private TestEnvConfig config;
5558
private InstanceAdminClient instanceAdminClient;
59+
private DatabaseAdminClient databaseAdminClient;
5660
private boolean isOwnedInstance;
5761
private RemoteSpannerHelper testHelper;
5862

@@ -93,9 +97,12 @@ protected void before() throws Throwable {
9397
}
9498
testHelper = createTestHelper(options, instanceId);
9599
instanceAdminClient = testHelper.getClient().getInstanceAdminClient();
100+
databaseAdminClient = testHelper.getClient().getDatabaseAdminClient();
96101
logger.log(Level.FINE, "Test env endpoint is {0}", options.getHost());
97102
if (isOwnedInstance) {
98103
initializeInstance(instanceId);
104+
} else {
105+
cleanUpOldDatabases(instanceId);
99106
}
100107
}
101108

@@ -162,6 +169,35 @@ private void initializeInstance(InstanceId instanceId) {
162169
logger.log(Level.INFO, "Created test instance: {0}", createdInstance.getId());
163170
}
164171

172+
private void cleanUpOldDatabases(InstanceId instanceId) {
173+
long OLD_DB_THRESHOLD_SECS = TimeUnit.SECONDS.convert(24L, TimeUnit.HOURS);
174+
Timestamp currentTimestamp = Timestamp.now();
175+
int numDropped = 0;
176+
Page<Database> page = databaseAdminClient.listDatabases(instanceId.getInstance());
177+
String TEST_DB_REGEX = "(testdb_(.*)_(.*))|(mysample-(.*))";
178+
179+
logger.log(Level.INFO, "Dropping old test databases from {0}", instanceId.getName());
180+
while (page != null) {
181+
for (Database db : page.iterateAll()) {
182+
try {
183+
long timeDiff = db.getCreateTime().getSeconds() - currentTimestamp.getSeconds();
184+
// Delete all databases which are more than OLD_DB_THRESHOLD_SECS seconds
185+
// old.
186+
if ((db.getId().getDatabase().matches(TEST_DB_REGEX))
187+
&& (timeDiff > OLD_DB_THRESHOLD_SECS)) {
188+
logger.log(Level.INFO, "Dropping test database {0}", db.getId());
189+
db.drop();
190+
++numDropped;
191+
}
192+
} catch (SpannerException e) {
193+
logger.log(Level.SEVERE, "Failed to drop test database " + db.getId(), e);
194+
}
195+
}
196+
page = page.getNextPage();
197+
}
198+
logger.log(Level.INFO, "Dropped {0} test database(s)", numDropped);
199+
}
200+
165201
private void cleanUpInstance() {
166202
try {
167203
if (isOwnedInstance) {

0 commit comments

Comments
 (0)