8000 adding functions to manage life cycle of resources in ITComputeTest by neozwu · Pull Request #1768 · googleapis/google-cloud-java · GitHub
[go: up one dir, main page]

Skip to content

Conversation

@neozwu
Copy link
Contributor
@neozwu neozwu commented Mar 17, 2017

In ITComputeTest, we use "JUnit timeout rule" to specify test case timeout. Timeout rule (unlike timeout parameter in @test annotation) applies to the entire test fixture (that includes all @before methods + @test method + all @after methods). Therefore, when a test times out in the middle of execution, teardown method (@after method) won't be executed. This will result in resource leak, and accumulation of unused resources (instances, disks, snapshots, etc.) in google cloud compute engine. One approach is to use timeout parameter rather than timeout rule and properly clean up resources in @after method. However timeout parameter will force tests (@test method) to run in a different thread, thus may cause potential thread-safety issue. In this PR, a different approach is used, which registers all resources that are created by test cases in a static data structure, and try to delete all these resources after all tests are executed (i.e. in the @afterclass method). The implementation tries to be as generic as possible, but without introducing any change of existing resource objects.

created during tests can be properly deleted even if tests fail or
become timed out.
@googlebot googlebot added the cla: yes This human has signed the Contributor License Agreement. label Mar 17, 2017
@@ -0,0 +1,230 @@
/*
* Copyright 2016 Google Inc. All Rights Reserved.

This comment was marked as spam.

This comment was marked as spam.

import java.util.ArrayList;
import java.util.List;

public class ManagedResourceHelper {

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

@SuppressWarnings("unchecked")
Function<T, Void> localFunc = (Function<T, Void>) getDeleteMethod(res);

this.func = localFunc;

This comment was marked as spam.

This comment was marked as spam.

public void cleanUpResources() {
for (ManagedResource<?> r : resources) {
r.delete();
//TODO (neowu): add logging if a resource has not been deleted in test fixture

This comment was marked as spam.

@shinfan
Copy link
Contributor
shinfan commented Mar 21, 2017

Thanks for fixing this! Just a few comments.

} catch (Exception e) {

} finally {
return null;

This comment was marked as spam.

try {
Operation operation = address.delete();
operation.waitFor();
} catch (Exception e) {

This comment was marked as spam.

}

private <T> Function<?, Void> getDeleteMethod(T res) {
if (res instanceof Address) {

This comment was marked as spam.

This comment was marked as spam.

}
}

public <T> ManagedResourceHelper addManagedResource(T res) {

This comment was marked as spam.

This comment was marked as spam.

import java.util.ArrayList;
import java.util.List;

public class ManagedResourceHelper {

This comment was marked as spam.

This comment was marked as spam.

neozwu added 3 commits April 3, 2017 09:01
* implement `add` function with compile-time type checking
* add `remove` method to remove a resource from managed resources
* use Id's as handles to resources
compute.deleteAddress(addressId);
return null;
}
};

This comment was marked as spam.

This comment was marked as spam.

public ManagedResourceCleaner remove(AddressId addressId) {
resources.remove(addressId);
return this;
}

This comment was marked as spam.

This comment was marked as spam.

compute.deleteSnapshot(firstSnapshotId);
managedResourceCleaner.remove(firstSnapshotId);
compute.deleteSnapshot(secondSnapshotId);
managedResourceCleaner.remove(secondSnapshotId);

This comment was marked as spam.

This comment was marked as spam.

@neozwu
Copy link
Contributor Author
neozwu commented Apr 3, 2017

@shinfan @garrettjonesgoogle PTAL

@coveralls
Copy link

Coverage Status

Changes Unknown when pulling c047cd0 on neozwu:fix-compute-resource into ** on GoogleCloudPlatform:master**.

@coveralls
Copy link

Coverage Status

Changes Unknown when pulling f04997e on neozwu:fix-compute-resource into ** on GoogleCloudPlatform:master**.

Copy link
Contributor
@shinfan shinfan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let @garrettjonesgoogle approve as well

Copy link
Member
@garrettjonesgoogle garrettjonesgoogle left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok this should be the last set of things to take care of.

}

private class ManagedResource<T> {
final T res;

This comment was marked as spam.

This comment was marked as spam.


private class ManagedResource<T> {
final T res;
Function<T, Void> func;

This comment was marked as spam.

This comment was marked as spam.


public void cleanUp() {
for (Map.Entry<Object, ManagedResource<?>> r : resources.entrySet()) {
System.out.println("Clean up compute engine resource: " + r.getKey().toString());

This comment was marked as spam.

This comment was marked as spam.

A3E2 resources.clear();
}

public ResourceCleaner add(AddressId addressId) {

This comment was marked as spam.

This comment was marked as spam.

return this;
}

public <T> ResourceCleaner remove(T resourceId) {

This comment was marked as spam.

This comment was marked as spam.

}

@AfterClass
public static void teardown() {

This comment was marked as spam.

@coveralls
Copy link

Coverage Status

Changes Unknown when pulling c05b45b on neozwu:fix-compute-resource into ** on GoogleCloudPlatform:master**.

@neozwu neozwu changed the title WIP: adding functions to manage life cycle of resources in ITComputeTest adding functions to manage life cycle of resources in ITComputeTest Apr 4, 2017
@garrettjonesgoogle
Copy link
Member

LGTM

@neozwu neozwu merged commit a7967f4 into googleapis:master Apr 4, 2017
garrettjonesgoogle pushed a commit that referenced this pull request Apr 11, 2017
* updating 'PubSubExample' to latest api (#1808)

* updating pubsub sample to latest api

* Pubsub update (#1818)

* Update GAPIC layer
* Manual updates to support pubsub changes

* Update spi classes (#1817)

* Update README.md (#1825) [ci skip]

* Add DURABLE_REDUCED_AVAILABILITY storage class (#1834)

Otherwise we crash when servers return this value.

* logging: make flush wait for writes (#1815)

This PR still isn't completely correct,
since it does not force any RPC to immediately be issued.
However, flush should now correctly wait for RPCs
representing prior calls to publish to complete
and any failures to be reported to ErrorManager
before returning.

* use new PartitionKey implementation (#1841)

bumping gax version to 0.8.0 for the new implementation.
reflects googleapis/gapic-generator#1153 .

* Release 0.11.0

* Updating version in README files. [ci skip]

* Update version to 0.11.1-SNAPSHOT (#1843)

* Added a missing @test annotation (#1842)

* pubsub: make Subscriber use ApiService (#1824)

Fixes #1761.

* SPI: Adding @experimentalapi back to logging client classes (#1844)

* Bumping NL, Translate to beta (#1848)

* Release 0.11.1

* Updating version in README files. [ci skip]

* Update version to 0.11.2-SNAPSHOT (#1852)

* pubsub: remove obsolete doc references (#1823)

This PR removes references to the deprecated code of the docs.
The emulator section is rewritten.

Fixes #1789.

* adding functions to manage life cycle of resources in ITComputeTest (#1768)

*adding functions to ITComputeTest, in order to make sure resources
created during tests can be properly deleted even if tests fail or
become timed out.
* refactor and incorporate feedbacks
* implement `add` function with compile-time type checking
* add `remove` method to remove a resource from managed resources
* use Id's as handles to resources
* fix copyright header
* rename class name
* modify remove function, pass delete function to each add method
* address comments

* Add Speech v1. (#1858)

* Make logging overrides the default channel provider (#1820)

* Added more unit tests for SessionPool (#1862)

* Rename Translate title to Translation [ci skip] (#1867)

* Release 0.11.2

* Updating version in README files. [ci skip]

* Update pom.xml version to 0.11.3-SNAPSHOT (#1870)

* pubsub: acquire FlowController before releasing (#1831)

* Revert "pubsub: acquire FlowController before releasing (#1831)" (#1872)

This reverts commit 3717ac6.

This change brings up another serious bug.
If the number of messages we pull in one RPC is greater than the number size of the semaphore, we deadlock forever.
Will redo this later.

* pubsub: make deprecated methods package-private (#1861)

add back mistakenly deleted test

Fixes #1828.

* pubsub: rename newBuilder to defaultBuilder (#1873)

Fixes #1853.

* GAE (Flex_Java/Flex_Custom/Flex_Compat/Std_Java8), GCE, GKE testing app for gcj (#1859)

Appengine tests for #1752

* Replace a constant of type Set with ImmutableSet (#1876)

* Language v1beta2 Release (#1878)

* Language v1beta2 Release
* Language v1 update

* Regenerating SPI: use setEndpoint (#1879)

Reflects googleapis/gapic-generator#1172.
Updates #1835.

* remove last use of setPort/setServiceAddress (#1880)

Fixes #1835.

* new code snippet  for push subscription + cleanup of deprecated snippets (#1875)

* cleaning up PubSubExample
adding snippet for creating a subscription with a push endpoint

* updating start, end tags for snippets,
adding async pull snippet tag

* Release 0.12.0

* Updating version in README files. [ci skip]

* Update version to 0.12.1-SNAPSHOT (#1886)

* Update version of google-auth-java to 0.6.1 (#1888)

* Update version of google-auth-java to 0.6.1

Latest version of google-auth-java contains a fix for auth token refresh failures.

* Remove harcoded auth dependencies

* Don't use `UrlFetchTransport` in App Engine Flex environment  (#1893)

* Don't use `UrlFetchTransport` in App Engine Flex environment #1492

* Add annotations to specify GCP launch stage (#1889)

The Google Cloud Platform launch stage
(https://cloud.google.com/terms/launch-stages) is a signifier of the level of
access and support that can be expected of a particular feature. These
annotations will be used to clearly demarcate features as being in a state
other than General Availability to help set user expectations accordingly.

* Add Identity Access Management (IAM) to the Storage API (#1812)

Adds support for bucket-level IAM (currently in limited alpha). More information
about IAM in Google Cloud Storage can be found at
https://cloud.google.com/storage/docs/access-control/iam
meltsufin pushed a commit that referenced this pull request Dec 22, 2025
…1286)

This should fix release script reporting back to the release PRs
Source-Link: googleapis/synthtool@4c15ec0
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-java:latest@sha256:e62f3ea524b11c1cd6ff7f80362736d86c0056631346b5b106a421686fce2726

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla: yes This human has signed the Contributor License Agreement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

0