diff --git a/README.md b/README.md
index 198ca69fe..175e396da 100644
--- a/README.md
+++ b/README.md
@@ -69,7 +69,7 @@ Source code for all public APIs for com.google.appengine.api.* packages.
com.google.appengine
appengine-api-1.0-sdk
- 2.0.34
+ 2.0.35
javax.servlet
@@ -89,7 +89,7 @@ Source code for all public APIs for com.google.appengine.api.* packages.
com.google.appengine
appengine-api-1.0-sdk
- 2.0.34
+ 2.0.35
jakarta.servlet
@@ -188,7 +188,7 @@ Source code for remote APIs for App Engine.
com.google.appengine
appengine-remote-api
- 2.0.34
+ 2.0.35
```
@@ -211,7 +211,7 @@ We moved `com.google.appengine.api.memcache.stdimpl` and its old dependency
com.google.appengine
appengine-api-legacy.jar/artifactId>
- 2.0.34
+ 2.0.35
```
@@ -226,19 +226,19 @@ We moved `com.google.appengine.api.memcache.stdimpl` and its old dependency
com.google.appengine
appengine-testing
- 2.0.34
+ 2.0.35
test
com.google.appengine
appengine-api-stubs
- 2.0.34
+ 2.0.35
test
com.google.appengine
appengine-tools-sdk
- 2.0.34
+ 2.0.35
test
```
diff --git a/TRYLATESTBITSINPROD.md b/TRYLATESTBITSINPROD.md
index 9b3a23bd9..86501954b 100644
--- a/TRYLATESTBITSINPROD.md
+++ b/TRYLATESTBITSINPROD.md
@@ -46,7 +46,7 @@ top of your web application and change the entrypoint to boot with these jars in
./mvnw clean install
```
-Let's assume the current build version is `2.0.35-SNAPSHOT`.
+Let's assume the current build version is `2.0.36-SNAPSHOT`.
See the output of the runtime deployment module which contains all the jars needed by the runtime:
@@ -66,7 +66,7 @@ Add the dependency for the GAE runtime jars in your application pom.xml file:
```
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
target/${project.artifactId}-${project.version}
...
diff --git a/api/pom.xml b/api/pom.xml
index 1879df126..37d303bb3 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -21,7 +21,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
true
diff --git a/api/src/main/java/com/google/appengine/api/datastore/PreparedQueryImpl.java b/api/src/main/java/com/google/appengine/api/datastore/PreparedQueryImpl.java
index 4dfa0fdce..5a4831763 100644
--- a/api/src/main/java/com/google/appengine/api/datastore/PreparedQueryImpl.java
+++ b/api/src/main/java/com/google/appengine/api/datastore/PreparedQueryImpl.java
@@ -36,11 +36,6 @@ public PreparedQueryImpl(Query query, Transaction txn, QueryRunner queryRunner)
this.txn = txn;
this.queryRunner = queryRunner;
- // TODO Move this check and the one that follows into the
- // LocalDatastoreService (it may already be there).
- checkArgument(
- txn == null || query.getAncestor() != null,
- "Only ancestor queries are allowed inside transactions.");
TransactionImpl.ensureTxnActive(txn);
}
diff --git a/api/src/main/java/com/google/appengine/api/datastore/ValidatedQuery.java b/api/src/main/java/com/google/appengine/api/datastore/ValidatedQuery.java
index 05e4346fe..5c356fc2f 100644
--- a/api/src/main/java/com/google/appengine/api/datastore/ValidatedQuery.java
+++ b/api/src/main/java/com/google/appengine/api/datastore/ValidatedQuery.java
@@ -93,13 +93,6 @@ private void validateQuery() {
}
}
- // Transaction requires ancestor
- if (query.hasTransaction() && !query.hasAncestor()) {
- throw new IllegalQueryException(
- "Only ancestor queries are allowed inside transactions.",
- IllegalQueryType.TRANSACTION_REQUIRES_ANCESTOR);
- }
-
// Filters and sort orders require kind.
if (!query.hasKind()) {
for (Filter filter : query.filters()) {
diff --git a/api_dev/pom.xml b/api_dev/pom.xml
index 51b710816..df86537b1 100644
--- a/api_dev/pom.xml
+++ b/api_dev/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/api_dev/src/main/java/com/google/appengine/api/datastore/dev/LocalDatastoreService.java b/api_dev/src/main/java/com/google/appengine/api/datastore/dev/LocalDatastoreService.java
index e33510fa6..f0c45b21e 100644
--- a/api_dev/src/main/java/com/google/appengine/api/datastore/dev/LocalDatastoreService.java
+++ b/api_dev/src/main/java/com/google/appengine/api/datastore/dev/LocalDatastoreService.java
@@ -1207,29 +1207,23 @@ public QueryResult runQuery(Status status, Query query) {
String app = query.getApp();
Profile profile = getOrCreateProfile(app);
- // The real datastore supports executing ancestor queries in transactions.
- // For now we're just going to make sure the entity group of the ancestor
- // is the same entity group with which the transaction is associated and
- // skip providing a transactionally consistent result set.
-
synchronized (profile) {
- // Having a transaction implies we have an ancestor, but having an
- // ancestor does not imply we have a transaction.
- if (query.hasTransaction() || query.hasAncestor()) {
- // Query can only have a txn if it is an ancestor query. Either way we
- // know we've got an ancestor.
+
+ if (query.hasTransaction()) {
+ if (!app.equals(query.getTransaction().getApp())) {
+ throw newError(
+ ErrorCode.INTERNAL_ERROR,
+ "Can't query app "
+ + app
+ + "in a transaction on app "
+ + query.getTransaction().getApp());
+ }
+ }
+
+ if (query.hasAncestor()) {
Path groupPath = getGroup(query.getAncestor());
Profile.EntityGroup eg = profile.getGroup(groupPath);
if (query.hasTransaction()) {
- if (!app.equals(query.getTransaction().getApp())) {
- throw newError(
- ErrorCode.INTERNAL_ERROR,
- "Can't query app "
- + app
- + "in a transaction on app "
- + query.getTransaction().getApp());
- }
-
LiveTxn liveTxn = profile.getTxn(query.getTransaction().getHandle());
// this will throw an exception if we attempt to read from
// the wrong entity group
@@ -1238,12 +1232,10 @@ public QueryResult runQuery(Status status, Query query) {
profile = eg.getSnapshot(liveTxn);
}
- if (query.hasAncestor()) {
- if (query.hasTransaction() || !query.hasFailoverMs()) {
- // Either we have a transaction or the user has requested strongly
- // consistent results. Either way, we need to apply jobs.
- eg.rollForwardUnappliedJobs();
- }
+ if (query.hasTransaction() || !query.hasFailoverMs()) {
+ // Either we have a transaction or the user has requested strongly
+ // consistent results. Either way, we need to apply jobs.
+ eg.rollForwardUnappliedJobs();
}
}
diff --git a/api_legacy/pom.xml b/api_legacy/pom.xml
index a71635f5a..a2a2812fb 100644
--- a/api_legacy/pom.xml
+++ b/api_legacy/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/appengine-api-1.0-sdk/pom.xml b/appengine-api-1.0-sdk/pom.xml
index 2705bc100..262f4ba93 100644
--- a/appengine-api-1.0-sdk/pom.xml
+++ b/appengine-api-1.0-sdk/pom.xml
@@ -20,7 +20,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
AppEngine :: appengine-api-1.0-sdk
diff --git a/appengine-api-stubs/pom.xml b/appengine-api-stubs/pom.xml
index ab8ae1050..dc6ee9ea0 100644
--- a/appengine-api-stubs/pom.xml
+++ b/appengine-api-stubs/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/appengine_init/pom.xml b/appengine_init/pom.xml
index 48c1421ac..fead941b5 100644
--- a/appengine_init/pom.xml
+++ b/appengine_init/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/appengine_jsr107/pom.xml b/appengine_jsr107/pom.xml
index 435af6300..b09383e80 100644
--- a/appengine_jsr107/pom.xml
+++ b/appengine_jsr107/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
diff --git a/appengine_resources/pom.xml b/appengine_resources/pom.xml
index 8d3f1406c..93b988c26 100644
--- a/appengine_resources/pom.xml
+++ b/appengine_resources/pom.xml
@@ -21,7 +21,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
AppEngine :: appengine-resources
diff --git a/appengine_setup/apiserver_local/pom.xml b/appengine_setup/apiserver_local/pom.xml
index cfa5edf6f..b235ba8a6 100644
--- a/appengine_setup/apiserver_local/pom.xml
+++ b/appengine_setup/apiserver_local/pom.xml
@@ -20,7 +20,7 @@
com.google.appengine
appengine_setup
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
4.0.0
diff --git a/appengine_setup/pom.xml b/appengine_setup/pom.xml
index ebce6e2fd..fd215a330 100644
--- a/appengine_setup/pom.xml
+++ b/appengine_setup/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
apiserver_local
diff --git a/appengine_setup/test/pom.xml b/appengine_setup/test/pom.xml
index 3d910c4a7..c8c0f0ba3 100644
--- a/appengine_setup/test/pom.xml
+++ b/appengine_setup/test/pom.xml
@@ -20,7 +20,7 @@
com.google.appengine
appengine_setup
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
4.0.0
com.google.appengine
diff --git a/appengine_setup/test/src/test/java/com/google/appengine/setup/test/Jetty12TestAppTest.java b/appengine_setup/test/src/test/java/com/google/appengine/setup/test/Jetty12TestAppTest.java
index 64d72df5a..30ba2420f 100644
--- a/appengine_setup/test/src/test/java/com/google/appengine/setup/test/Jetty12TestAppTest.java
+++ b/appengine_setup/test/src/test/java/com/google/appengine/setup/test/Jetty12TestAppTest.java
@@ -26,6 +26,6 @@ protected String appName() {
@Override
protected String relativePathForUserApplicationJar() {
return "../testapps/jetty12_testapp/target/"
- + "jetty12_testapp-2.0.35-SNAPSHOT-jar-with-dependencies.jar";
+ + "jetty12_testapp-2.0.36-SNAPSHOT-jar-with-dependencies.jar";
}
}
diff --git a/appengine_setup/test/src/test/java/com/google/appengine/setup/test/SpringBootTestAppTest.java b/appengine_setup/test/src/test/java/com/google/appengine/setup/test/SpringBootTestAppTest.java
index 69161fe63..55c065ae9 100644
--- a/appengine_setup/test/src/test/java/com/google/appengine/setup/test/SpringBootTestAppTest.java
+++ b/appengine_setup/test/src/test/java/com/google/appengine/setup/test/SpringBootTestAppTest.java
@@ -25,6 +25,6 @@ protected String appName() {
@Override
protected String relativePathForUserApplicationJar() {
- return "../testapps/springboot_testapp/target/" + "springboot_testapp-2.0.35-SNAPSHOT.jar";
+ return "../testapps/springboot_testapp/target/" + "springboot_testapp-2.0.36-SNAPSHOT.jar";
}
}
diff --git a/appengine_setup/test/src/test/java/com/google/appengine/setup/test/util/TestUtil.java b/appengine_setup/test/src/test/java/com/google/appengine/setup/test/util/TestUtil.java
index 8eae5d031..e1abcd607 100644
--- a/appengine_setup/test/src/test/java/com/google/appengine/setup/test/util/TestUtil.java
+++ b/appengine_setup/test/src/test/java/com/google/appengine/setup/test/util/TestUtil.java
@@ -62,7 +62,7 @@ public static HttpClient initializeHttpClient(int timeoutMillis) {
@SneakyThrows
public static Process initializeHttpApiServer() {
String apiServerRelativeJarPath =
- "../apiserver_local/target/" + "apiserver_local-2.0.35-SNAPSHOT-jar-with-dependencies.jar";
+ "../apiserver_local/target/" + "apiserver_local-2.0.36-SNAPSHOT-jar-with-dependencies.jar";
File currentDirectory = new File("").getAbsoluteFile();
File apiServerJar = new File(currentDirectory, apiServerRelativeJarPath);
ImmutableList processArgs = ImmutableList.builder()
diff --git a/appengine_setup/testapps/jetty12_testapp/pom.xml b/appengine_setup/testapps/jetty12_testapp/pom.xml
index 9629c4f7b..c7ecf36a4 100644
--- a/appengine_setup/testapps/jetty12_testapp/pom.xml
+++ b/appengine_setup/testapps/jetty12_testapp/pom.xml
@@ -20,20 +20,20 @@
testapps
com.google.appengine
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
4.0.0
com.google.appengine.setup.testapps
jetty12_testapp
- 12.0.19
+ 12.0.20
1.9.24
com.google.appengine.setup.testapps
testapps_common
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
org.eclipse.jetty
@@ -106,7 +106,7 @@
srirammahavadi-dev
GCLOUD_CONFIG
true
- ${project.build.directory}/jetty11_testapp-2.0.35-SNAPSHOT-jar-with-dependencies.jar
+ ${project.build.directory}/jetty11_testapp-2.0.36-SNAPSHOT-jar-with-dependencies.jar
diff --git a/appengine_setup/testapps/pom.xml b/appengine_setup/testapps/pom.xml
index c8bde51c9..ccdcad3bc 100644
--- a/appengine_setup/testapps/pom.xml
+++ b/appengine_setup/testapps/pom.xml
@@ -20,7 +20,7 @@
com.google.appengine
appengine_setup
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
4.0.0
com.google.appengine
diff --git a/appengine_setup/testapps/springboot_testapp/pom.xml b/appengine_setup/testapps/springboot_testapp/pom.xml
index e52b25c47..08abb7169 100644
--- a/appengine_setup/testapps/springboot_testapp/pom.xml
+++ b/appengine_setup/testapps/springboot_testapp/pom.xml
@@ -25,7 +25,7 @@
com.google.appengine.setup.testapps
springboot_testapp
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
springboot_testapp
Demo project for Spring Boot
@@ -44,12 +44,12 @@
com.google.appengine
appengine-api-1.0-sdk
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
com.google.appengine.setup.testapps
testapps_common
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/appengine_setup/testapps/testapps_common/pom.xml b/appengine_setup/testapps/testapps_common/pom.xml
index 201bce13d..4d0e0b210 100644
--- a/appengine_setup/testapps/testapps_common/pom.xml
+++ b/appengine_setup/testapps/testapps_common/pom.xml
@@ -20,7 +20,7 @@
testapps
com.google.appengine
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
4.0.0
com.google.appengine.setup.testapps
diff --git a/appengine_testing/pom.xml b/appengine_testing/pom.xml
index 4ade81c19..b71d9f4e9 100644
--- a/appengine_testing/pom.xml
+++ b/appengine_testing/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/appengine_testing_tests/pom.xml b/appengine_testing_tests/pom.xml
index bd4051fb0..f17df39d4 100644
--- a/appengine_testing_tests/pom.xml
+++ b/appengine_testing_tests/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/applications/pom.xml b/applications/pom.xml
index 29e069b32..7bac0a524 100644
--- a/applications/pom.xml
+++ b/applications/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
pom
diff --git a/applications/proberapp/pom.xml b/applications/proberapp/pom.xml
index 85708f556..3457aed1c 100644
--- a/applications/proberapp/pom.xml
+++ b/applications/proberapp/pom.xml
@@ -27,7 +27,7 @@
com.google.appengine
applications
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
@@ -38,7 +38,7 @@
us-central1
prober-user
prober_connectivity_test_database
- 2.64.0
+ 2.64.3
${project.version}
UTF-8
target/${project.artifactId}-${project.version}
@@ -58,7 +58,7 @@
com.google.cloud
google-cloud-spanner
- 6.90.0
+ 6.92.0
com.google.appengine
@@ -116,27 +116,27 @@
com.google.cloud
google-cloud-bigquery
- 2.49.0
+ 2.49.2
com.google.cloud
google-cloud-core
- 2.54.0
+ 2.54.3
com.google.cloud
google-cloud-datastore
- 2.27.1
+ 2.28.0
com.google.cloud
google-cloud-logging
- 3.22.0
+ 3.22.2
com.google.cloud
google-cloud-storage
- 2.50.0
+ 2.52.1
com.google.cloud.sql
@@ -170,7 +170,7 @@
com.mysql
mysql-connector-j
- 9.2.0
+ 9.3.0
org.apache.httpcomponents
diff --git a/applications/springboot/pom.xml b/applications/springboot/pom.xml
index f2a6a3f6d..e25fd2593 100644
--- a/applications/springboot/pom.xml
+++ b/applications/springboot/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
applications
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/devappservertests/pom.xml b/e2etests/devappservertests/pom.xml
index 4d0a9e849..4f9fabe47 100644
--- a/e2etests/devappservertests/pom.xml
+++ b/e2etests/devappservertests/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
e2etests
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/e2etests/pom.xml b/e2etests/pom.xml
index 3258f8924..3eb2a9ff3 100644
--- a/e2etests/pom.xml
+++ b/e2etests/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
AppEngine :: e2e tests
pom
diff --git a/e2etests/stagingtests/pom.xml b/e2etests/stagingtests/pom.xml
index 03855b645..0c1604d05 100644
--- a/e2etests/stagingtests/pom.xml
+++ b/e2etests/stagingtests/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
e2etests
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/e2etests/testlocalapps/allinone/pom.xml b/e2etests/testlocalapps/allinone/pom.xml
index c73e96e1d..b98eedf55 100644
--- a/e2etests/testlocalapps/allinone/pom.xml
+++ b/e2etests/testlocalapps/allinone/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/allinone_jakarta/pom.xml b/e2etests/testlocalapps/allinone_jakarta/pom.xml
index ef7fa23a5..de8cc30af 100644
--- a/e2etests/testlocalapps/allinone_jakarta/pom.xml
+++ b/e2etests/testlocalapps/allinone_jakarta/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/badcron/pom.xml b/e2etests/testlocalapps/badcron/pom.xml
index 89b0e3548..289700919 100644
--- a/e2etests/testlocalapps/badcron/pom.xml
+++ b/e2etests/testlocalapps/badcron/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/bundle_standard/pom.xml b/e2etests/testlocalapps/bundle_standard/pom.xml
index 9e981b4e0..7f9e9f776 100644
--- a/e2etests/testlocalapps/bundle_standard/pom.xml
+++ b/e2etests/testlocalapps/bundle_standard/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/bundle_standard_with_container_initializer/pom.xml b/e2etests/testlocalapps/bundle_standard_with_container_initializer/pom.xml
index 3734dc441..c9a6e2994 100644
--- a/e2etests/testlocalapps/bundle_standard_with_container_initializer/pom.xml
+++ b/e2etests/testlocalapps/bundle_standard_with_container_initializer/pom.xml
@@ -25,7 +25,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/bundle_standard_with_no_jsp/pom.xml b/e2etests/testlocalapps/bundle_standard_with_no_jsp/pom.xml
index cbb7b4257..abf4ae749 100644
--- a/e2etests/testlocalapps/bundle_standard_with_no_jsp/pom.xml
+++ b/e2etests/testlocalapps/bundle_standard_with_no_jsp/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/bundle_standard_with_weblistener_memcache/pom.xml b/e2etests/testlocalapps/bundle_standard_with_weblistener_memcache/pom.xml
index de455b1cf..748364915 100644
--- a/e2etests/testlocalapps/bundle_standard_with_weblistener_memcache/pom.xml
+++ b/e2etests/testlocalapps/bundle_standard_with_weblistener_memcache/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/cron-bad-job-age-limit/pom.xml b/e2etests/testlocalapps/cron-bad-job-age-limit/pom.xml
index bd94a56c9..f54adcee5 100644
--- a/e2etests/testlocalapps/cron-bad-job-age-limit/pom.xml
+++ b/e2etests/testlocalapps/cron-bad-job-age-limit/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/cron-good-retry-parameters/pom.xml b/e2etests/testlocalapps/cron-good-retry-parameters/pom.xml
index 9dda37f87..7daf86358 100644
--- a/e2etests/testlocalapps/cron-good-retry-parameters/pom.xml
+++ b/e2etests/testlocalapps/cron-good-retry-parameters/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/cron-negative-max-backoff/pom.xml b/e2etests/testlocalapps/cron-negative-max-backoff/pom.xml
index 70057f24a..7f6e36038 100644
--- a/e2etests/testlocalapps/cron-negative-max-backoff/pom.xml
+++ b/e2etests/testlocalapps/cron-negative-max-backoff/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/cron-negative-retry-limit/pom.xml b/e2etests/testlocalapps/cron-negative-retry-limit/pom.xml
index 1d8bde5c2..a26d303f3 100644
--- a/e2etests/testlocalapps/cron-negative-retry-limit/pom.xml
+++ b/e2etests/testlocalapps/cron-negative-retry-limit/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/cron-two-max-doublings/pom.xml b/e2etests/testlocalapps/cron-two-max-doublings/pom.xml
index f44805f62..30a22edc4 100644
--- a/e2etests/testlocalapps/cron-two-max-doublings/pom.xml
+++ b/e2etests/testlocalapps/cron-two-max-doublings/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/http-headers/pom.xml b/e2etests/testlocalapps/http-headers/pom.xml
index b6d239643..32927ccd7 100644
--- a/e2etests/testlocalapps/http-headers/pom.xml
+++ b/e2etests/testlocalapps/http-headers/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/java8-jar/pom.xml b/e2etests/testlocalapps/java8-jar/pom.xml
index e33ad9533..7e4a3826a 100644
--- a/e2etests/testlocalapps/java8-jar/pom.xml
+++ b/e2etests/testlocalapps/java8-jar/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/java8-no-webxml/pom.xml b/e2etests/testlocalapps/java8-no-webxml/pom.xml
index a1326e178..d63bf2114 100644
--- a/e2etests/testlocalapps/java8-no-webxml/pom.xml
+++ b/e2etests/testlocalapps/java8-no-webxml/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/pom.xml b/e2etests/testlocalapps/pom.xml
index 7f4bfa4bd..71f3cf8b6 100644
--- a/e2etests/testlocalapps/pom.xml
+++ b/e2etests/testlocalapps/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
e2etests
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
pom
diff --git a/e2etests/testlocalapps/sample-badaeweb/pom.xml b/e2etests/testlocalapps/sample-badaeweb/pom.xml
index c3f380eaa..280404b5d 100644
--- a/e2etests/testlocalapps/sample-badaeweb/pom.xml
+++ b/e2etests/testlocalapps/sample-badaeweb/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-baddispatch-yaml/pom.xml b/e2etests/testlocalapps/sample-baddispatch-yaml/pom.xml
index c26370581..a33a14523 100644
--- a/e2etests/testlocalapps/sample-baddispatch-yaml/pom.xml
+++ b/e2etests/testlocalapps/sample-baddispatch-yaml/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-baddispatch/pom.xml b/e2etests/testlocalapps/sample-baddispatch/pom.xml
index c8d5bb48f..995e16693 100644
--- a/e2etests/testlocalapps/sample-baddispatch/pom.xml
+++ b/e2etests/testlocalapps/sample-baddispatch/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-badentrypoint/pom.xml b/e2etests/testlocalapps/sample-badentrypoint/pom.xml
index 3640f2596..b3acb105c 100644
--- a/e2etests/testlocalapps/sample-badentrypoint/pom.xml
+++ b/e2etests/testlocalapps/sample-badentrypoint/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-badindexes/pom.xml b/e2etests/testlocalapps/sample-badindexes/pom.xml
index 1437c6b84..0c8b0255c 100644
--- a/e2etests/testlocalapps/sample-badindexes/pom.xml
+++ b/e2etests/testlocalapps/sample-badindexes/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-badruntimechannel/pom.xml b/e2etests/testlocalapps/sample-badruntimechannel/pom.xml
index c58ee1e27..7e9411dcd 100644
--- a/e2etests/testlocalapps/sample-badruntimechannel/pom.xml
+++ b/e2etests/testlocalapps/sample-badruntimechannel/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-badweb/pom.xml b/e2etests/testlocalapps/sample-badweb/pom.xml
index 5203604da..340052223 100644
--- a/e2etests/testlocalapps/sample-badweb/pom.xml
+++ b/e2etests/testlocalapps/sample-badweb/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-default-auto-ids/pom.xml b/e2etests/testlocalapps/sample-default-auto-ids/pom.xml
index 3e752775e..b6ab38651 100644
--- a/e2etests/testlocalapps/sample-default-auto-ids/pom.xml
+++ b/e2etests/testlocalapps/sample-default-auto-ids/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-error-in-tag-file/pom.xml b/e2etests/testlocalapps/sample-error-in-tag-file/pom.xml
index 28c788345..ee4a2b6fd 100644
--- a/e2etests/testlocalapps/sample-error-in-tag-file/pom.xml
+++ b/e2etests/testlocalapps/sample-error-in-tag-file/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-java11/pom.xml b/e2etests/testlocalapps/sample-java11/pom.xml
index 0d43646cf..50de4952b 100644
--- a/e2etests/testlocalapps/sample-java11/pom.xml
+++ b/e2etests/testlocalapps/sample-java11/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-java17/pom.xml b/e2etests/testlocalapps/sample-java17/pom.xml
index 579beee5a..510365d7e 100644
--- a/e2etests/testlocalapps/sample-java17/pom.xml
+++ b/e2etests/testlocalapps/sample-java17/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-jsptaglibrary/pom.xml b/e2etests/testlocalapps/sample-jsptaglibrary/pom.xml
index 41f809773..2855450da 100644
--- a/e2etests/testlocalapps/sample-jsptaglibrary/pom.xml
+++ b/e2etests/testlocalapps/sample-jsptaglibrary/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-jspx/pom.xml b/e2etests/testlocalapps/sample-jspx/pom.xml
index 89bbaf523..5bb94bc37 100644
--- a/e2etests/testlocalapps/sample-jspx/pom.xml
+++ b/e2etests/testlocalapps/sample-jspx/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-legacy-auto-ids/pom.xml b/e2etests/testlocalapps/sample-legacy-auto-ids/pom.xml
index e2bbc1503..c8eb8df50 100644
--- a/e2etests/testlocalapps/sample-legacy-auto-ids/pom.xml
+++ b/e2etests/testlocalapps/sample-legacy-auto-ids/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-missingappid/pom.xml b/e2etests/testlocalapps/sample-missingappid/pom.xml
index 15a187813..17bc91244 100644
--- a/e2etests/testlocalapps/sample-missingappid/pom.xml
+++ b/e2etests/testlocalapps/sample-missingappid/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-nojsps/pom.xml b/e2etests/testlocalapps/sample-nojsps/pom.xml
index e7105bbaa..41e4c9a8e 100644
--- a/e2etests/testlocalapps/sample-nojsps/pom.xml
+++ b/e2etests/testlocalapps/sample-nojsps/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-unspecified-auto-ids/pom.xml b/e2etests/testlocalapps/sample-unspecified-auto-ids/pom.xml
index 0c89902fc..ce58bc363 100644
--- a/e2etests/testlocalapps/sample-unspecified-auto-ids/pom.xml
+++ b/e2etests/testlocalapps/sample-unspecified-auto-ids/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sample-with-classes/pom.xml b/e2etests/testlocalapps/sample-with-classes/pom.xml
index 8b7fe4580..ee84c8171 100644
--- a/e2etests/testlocalapps/sample-with-classes/pom.xml
+++ b/e2etests/testlocalapps/sample-with-classes/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sampleapp-automatic-module/pom.xml b/e2etests/testlocalapps/sampleapp-automatic-module/pom.xml
index 86af6ce94..ef3c69dbc 100644
--- a/e2etests/testlocalapps/sampleapp-automatic-module/pom.xml
+++ b/e2etests/testlocalapps/sampleapp-automatic-module/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sampleapp-backends/pom.xml b/e2etests/testlocalapps/sampleapp-backends/pom.xml
index ff51c3487..94617f864 100644
--- a/e2etests/testlocalapps/sampleapp-backends/pom.xml
+++ b/e2etests/testlocalapps/sampleapp-backends/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
AppEngine :: sampleapp-backends
diff --git a/e2etests/testlocalapps/sampleapp-basic-module/pom.xml b/e2etests/testlocalapps/sampleapp-basic-module/pom.xml
index e2d614cc2..afe2d6df2 100644
--- a/e2etests/testlocalapps/sampleapp-basic-module/pom.xml
+++ b/e2etests/testlocalapps/sampleapp-basic-module/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sampleapp-manual-module/pom.xml b/e2etests/testlocalapps/sampleapp-manual-module/pom.xml
index c31a197da..1547b18a8 100644
--- a/e2etests/testlocalapps/sampleapp-manual-module/pom.xml
+++ b/e2etests/testlocalapps/sampleapp-manual-module/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sampleapp-runtime/pom.xml b/e2etests/testlocalapps/sampleapp-runtime/pom.xml
index e2274f3d2..b68c0e025 100644
--- a/e2etests/testlocalapps/sampleapp-runtime/pom.xml
+++ b/e2etests/testlocalapps/sampleapp-runtime/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/sampleapp/pom.xml b/e2etests/testlocalapps/sampleapp/pom.xml
index b98e91002..b57a95c96 100644
--- a/e2etests/testlocalapps/sampleapp/pom.xml
+++ b/e2etests/testlocalapps/sampleapp/pom.xml
@@ -25,7 +25,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
AppEngine :: sampleapp
diff --git a/e2etests/testlocalapps/stage-sampleapp/pom.xml b/e2etests/testlocalapps/stage-sampleapp/pom.xml
index 6bc41ad4d..ccbbd1461 100644
--- a/e2etests/testlocalapps/stage-sampleapp/pom.xml
+++ b/e2etests/testlocalapps/stage-sampleapp/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/stage-with-staging-options/pom.xml b/e2etests/testlocalapps/stage-with-staging-options/pom.xml
index 8f539290e..3b6f36d73 100644
--- a/e2etests/testlocalapps/stage-with-staging-options/pom.xml
+++ b/e2etests/testlocalapps/stage-with-staging-options/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
diff --git a/e2etests/testlocalapps/xmlorder/pom.xml b/e2etests/testlocalapps/xmlorder/pom.xml
index 448d3b454..9307092f6 100644
--- a/e2etests/testlocalapps/xmlorder/pom.xml
+++ b/e2etests/testlocalapps/xmlorder/pom.xml
@@ -24,7 +24,7 @@
com.google.appengine
testlocalapps
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
war
AppEngine :: xmlorder
diff --git a/external/geronimo_javamail/pom.xml b/external/geronimo_javamail/pom.xml
index cca05c0c2..b8b95b0d3 100644
--- a/external/geronimo_javamail/pom.xml
+++ b/external/geronimo_javamail/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
../../pom.xml
diff --git a/google3/third_party/java_src/appengine_standard/api_compatibility_tests/pom.xml b/google3/third_party/java_src/appengine_standard/api_compatibility_tests/pom.xml
index 1dfc67c36..3f342942b 100644
--- a/google3/third_party/java_src/appengine_standard/api_compatibility_tests/pom.xml
+++ b/google3/third_party/java_src/appengine_standard/api_compatibility_tests/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/jetty12_assembly/pom.xml b/jetty12_assembly/pom.xml
index 73afe5396..2222f7eaa 100644
--- a/jetty12_assembly/pom.xml
+++ b/jetty12_assembly/pom.xml
@@ -20,7 +20,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
4.0.0
jetty12-assembly
diff --git a/lib/pom.xml b/lib/pom.xml
index b745a0972..add340ee1 100644
--- a/lib/pom.xml
+++ b/lib/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
pom
diff --git a/lib/tools_api/pom.xml b/lib/tools_api/pom.xml
index 06bdd8c69..6029154e9 100644
--- a/lib/tools_api/pom.xml
+++ b/lib/tools_api/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
lib-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/lib/tools_api/src/main/protobuf/runtime_config.proto b/lib/tools_api/src/main/protobuf/runtime_config.proto
deleted file mode 100644
index 92ad50002..000000000
--- a/lib/tools_api/src/main/protobuf/runtime_config.proto
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-syntax = "proto2";
-
-package apphosting.tools.devappserver2;
-
-option java_package = "com.google.appengine.tools.development.proto";
-option java_multiple_files = true;
-
-// Runtime configuration. This includes a subset of message AppInfo defined in
-// apphosting/base/appinfo.proto. It contains only information necessary for
-// configuring the runtime. It is the responsibility of the devappserver2
-// runtime module to set the fields required by its runtime.
-//
-// Next Tag: 27
-message Config {
- // The app id of the app to be run.
- required bytes app_id = 1;
-
- // The version id of the app to be run.
- required bytes version_id = 2;
-
- // The path to the root of the application.
- required bytes application_root = 3;
-
- // Whether the application has threadsafe enabled.
- optional bool threadsafe = 4 [default = false];
-
- // The host name to which to connect to send API requests.
- optional string api_host = 17 [default = "localhost"];
-
- // The port on which to connect to send API requests.
- required int32 api_port = 5;
-
- // Libraries enabled for the application.
- repeated Library libraries = 6;
-
- // A regex for files to skip.
- optional string skip_files = 7 [default = "^$"];
-
- // A regex for files used for static handlers.
- optional string static_files = 8 [default = "^$"];
-
- optional PythonConfig python_config = 14;
-
- optional PhpConfig php_config = 9;
-
- optional NodeConfig node_config = 26;
-
- optional JavaConfig java_config = 21;
-
- optional CustomConfig custom_config = 23;
-
- optional GoConfig go_config = 25;
-
- // Extra user-specified environment variables.
- repeated Environ environ = 10;
-
- optional CloudSQL cloud_sql_config = 11;
-
- required string datacenter = 12;
-
- required string instance_id = 13;
-
- // The logging level at which logs should be written to stderr:
- // 0 - Debug
- // 1 - Info
- // 2 - Warning
- // 3 - Error
- // 4 - Critical
- optional int64 stderr_log_level = 15 [default = 1];
-
- required string auth_domain = 16;
-
- optional int32 max_instances = 18;
-
- optional VMConfig vm_config = 19;
-
- // The port of the cloud SDK development server.
- optional int32 server_port = 20;
-
- optional bool vm = 22 [default = false];
-
- repeated string grpc_apis = 24;
-}
-
-// Runtime configuration required specifically for the PHP runtime.
-message PhpConfig {
- // The path to the PHP executable that should be used.
- optional bytes php_executable_path = 1;
-
- // Enable interactive debugging using XDebug.
- required bool enable_debugger = 3;
-
- // The path to the GAE PHP extension that should be loaded.
- optional bytes gae_extension_path = 4;
-
- // The path to the xdebug extension that should be loaded.
- optional bytes xdebug_extension_path = 5;
-
- // The version of PHP executable.
- optional bytes php_version = 6;
-
- // Paths to add to LD_LIBRARY_PATH for PHP
- optional bytes php_library_path = 7;
-
- // Path to the composer phar
- optional bytes php_composer_path = 8;
-}
-
-// Runtime configuration required specifically for the Node runtime.
-message NodeConfig {
- // The path to the node executable that should be used.
- optional bytes node_executable_path = 1;
-}
-
-message PythonConfig {
- // The path to a Python script that will be executed using execfile before
- // the runtime executes user code. Meant for tools such as debuggers.
- optional string startup_script = 1;
-
- // An argument that will be provided to the script specified in
- // startup_script.
- optional string startup_args = 2;
-}
-
-message JavaConfig {
- repeated string jvm_args = 1;
-}
-
-message GoConfig {
- optional string work_dir = 1;
- optional bool enable_watching_go_path = 2;
- optional bool enable_debugging = 3;
-}
-
-message CustomConfig {
- optional string custom_entrypoint = 1;
- optional string runtime = 2;
-}
-
-message CloudSQL {
- required string mysql_host = 1;
- required int32 mysql_port = 2;
- required string mysql_user = 3;
- required string mysql_password = 4;
- optional string mysql_socket = 5;
-}
-
-message Library {
- // The library name.
- required string name = 1;
-
- // The library version.
- required string version = 2;
-}
-
-message Environ {
- required bytes key = 1;
-
- required bytes value = 2;
-}
-
-message VMConfig {
- // URL that docker daemon is listening on.
- // Format: tcp://[host][:port] or unix://path. For more details refer to -H
- // docker parameter:
- // http://docs.docker.io/en/latest/use/basics/#bind-docker-to-another-host-port-or-a-unix-socket.
- optional string docker_daemon_url = 1;
-
- // Enable logs collection and displaying in local Admin Console.
- optional bool enable_logs = 3;
-}
diff --git a/lib/xml_validator/pom.xml b/lib/xml_validator/pom.xml
index 4ccc48788..269bf7418 100644
--- a/lib/xml_validator/pom.xml
+++ b/lib/xml_validator/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
lib-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
AppEngine :: libxmlvalidator
diff --git a/lib/xml_validator_test/pom.xml b/lib/xml_validator_test/pom.xml
index c3d791042..d741958e6 100644
--- a/lib/xml_validator_test/pom.xml
+++ b/lib/xml_validator_test/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
lib-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
AppEngine :: libxmlvalidator_test
diff --git a/local_runtime_shared_jetty12/pom.xml b/local_runtime_shared_jetty12/pom.xml
index f3891d7ea..877a49d60 100644
--- a/local_runtime_shared_jetty12/pom.xml
+++ b/local_runtime_shared_jetty12/pom.xml
@@ -21,7 +21,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
AppEngine :: appengine-local-runtime-shared Jetty12
diff --git a/local_runtime_shared_jetty9/pom.xml b/local_runtime_shared_jetty9/pom.xml
index 7ba82030f..ee03b2268 100644
--- a/local_runtime_shared_jetty9/pom.xml
+++ b/local_runtime_shared_jetty9/pom.xml
@@ -21,7 +21,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
AppEngine :: appengine-local-runtime-shared Jetty9
diff --git a/pom.xml b/pom.xml
index 09c1cd290..6d9c7bc7e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,7 +19,7 @@
4.0.0
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
pom
AppEngine :: Parent project
@@ -65,7 +65,7 @@
1.8
UTF-8
9.4.57.v20241219
- 12.0.19
+ 12.0.20
2.0.17
https://oss.sonatype.org/content/repositories/google-snapshots/
sonatype-nexus-snapshots
@@ -432,7 +432,7 @@
com.google.code.gson
gson
- 2.13.0
+ 2.13.1
com.google.flogger
@@ -458,7 +458,7 @@
com.google.http-client
google-http-client
- 1.46.3
+ 1.47.0
com.google.http-client
@@ -568,7 +568,7 @@
org.jsoup
jsoup
- 1.19.1
+ 1.20.1
org.apache.lucene
@@ -588,7 +588,7 @@
com.google.http-client
google-http-client-appengine
- 1.46.3
+ 1.47.0
com.google.oauth-client
@@ -603,7 +603,7 @@
com.fasterxml.jackson.core
jackson-core
- 2.18.3
+ 2.19.0
joda-time
@@ -662,7 +662,7 @@
com.google.cloud
google-cloud-logging
- 3.22.0
+ 3.22.2
diff --git a/protobuf/label_options.proto b/protobuf/label_options.proto
deleted file mode 100644
index b64e20004..000000000
--- a/protobuf/label_options.proto
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// These options are used to provide a mapping between proto fields and labels.
-syntax = "proto2";
-
-package cloud_trace;
-
-option java_package = "com.google.apphosting.base.protos";
-
-message LabelOptions {
- optional string key = 1;
- optional bool is_hash_id = 2;
-}
diff --git a/protobuf/pom.xml b/protobuf/pom.xml
index 47deb7740..2b8794589 100644
--- a/protobuf/pom.xml
+++ b/protobuf/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/protobuf/span_details.proto b/protobuf/span_details.proto
index be1699960..8665395b2 100644
--- a/protobuf/span_details.proto
+++ b/protobuf/span_details.proto
@@ -22,7 +22,6 @@ syntax = "proto2";
package cloud_trace;
-import "label_options.proto";
import "span_kind.proto";
option java_package = "com.google.apphosting.base.protos";
diff --git a/quickstartgenerator/pom.xml b/quickstartgenerator/pom.xml
index 021cc0f59..ddae417b8 100644
--- a/quickstartgenerator/pom.xml
+++ b/quickstartgenerator/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/quickstartgenerator_jetty12/pom.xml b/quickstartgenerator_jetty12/pom.xml
index ed35d3070..e3d42d306 100644
--- a/quickstartgenerator_jetty12/pom.xml
+++ b/quickstartgenerator_jetty12/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/quickstartgenerator_jetty12_ee10/pom.xml b/quickstartgenerator_jetty12_ee10/pom.xml
index 5213beeb6..1fb1cc7a0 100644
--- a/quickstartgenerator_jetty12_ee10/pom.xml
+++ b/quickstartgenerator_jetty12_ee10/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/remoteapi/pom.xml b/remoteapi/pom.xml
index ee88e8434..6f7632855 100644
--- a/remoteapi/pom.xml
+++ b/remoteapi/pom.xml
@@ -20,7 +20,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
AppEngine :: appengine-remote-api
diff --git a/remoteapi/src/main/java/com/google/appengine/tools/remoteapi/TransactionBuilder.java b/remoteapi/src/main/java/com/google/appengine/tools/remoteapi/TransactionBuilder.java
index 911a43201..8b28a2555 100644
--- a/remoteapi/src/main/java/com/google/appengine/tools/remoteapi/TransactionBuilder.java
+++ b/remoteapi/src/main/java/com/google/appengine/tools/remoteapi/TransactionBuilder.java
@@ -151,7 +151,7 @@ public RemoteApiPb.TransactionRequest makeCommitRequest() {
Message.Builder newKey = result.getDeletesBuilder().addKeyBuilder();
boolean parsed = true;
try {
- newKey.mergeFrom(entry.getKey(), ExtensionRegistry.getGeneratedRegistry());
+ newKey.mergeFrom(entry.getKey(), ExtensionRegistry.getEmptyRegistry());
} catch (InvalidProtocolBufferException e) {
parsed = false;
}
@@ -170,7 +170,7 @@ private static RemoteApiPb.TransactionRequest.Precondition makeEntityNotFoundPre
OnestoreEntity.Reference.Builder ref = OnestoreEntity.Reference.newBuilder();
boolean parsed = true;
try {
- ref.mergeFrom(key, ExtensionRegistry.getGeneratedRegistry());
+ ref.mergeFrom(key, ExtensionRegistry.getEmptyRegistry());
} catch (InvalidProtocolBufferException e) {
parsed = false;
}
diff --git a/runtime/annotationscanningwebapp/pom.xml b/runtime/annotationscanningwebapp/pom.xml
index c33aa00dd..15b48388f 100644
--- a/runtime/annotationscanningwebapp/pom.xml
+++ b/runtime/annotationscanningwebapp/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
com.google.appengine.demos
annotationscanningwebapp
diff --git a/runtime/deployment/pom.xml b/runtime/deployment/pom.xml
index 72f269aa8..e4bd33a4b 100644
--- a/runtime/deployment/pom.xml
+++ b/runtime/deployment/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
pom
diff --git a/runtime/failinitfilterwebapp/pom.xml b/runtime/failinitfilterwebapp/pom.xml
index 48a4c6f30..a40665073 100644
--- a/runtime/failinitfilterwebapp/pom.xml
+++ b/runtime/failinitfilterwebapp/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
com.google.appengine.demos
failinitfilterwebapp
diff --git a/runtime/impl/pom.xml b/runtime/impl/pom.xml
index e2e31e855..eccf07a8b 100644
--- a/runtime/impl/pom.xml
+++ b/runtime/impl/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime/impl/src/test/java/com/google/apphosting/runtime/anyrpc/AbstractRpcCompatibilityTest.java b/runtime/impl/src/test/java/com/google/apphosting/runtime/anyrpc/AbstractRpcCompatibilityTest.java
deleted file mode 100644
index 58a056148..000000000
--- a/runtime/impl/src/test/java/com/google/apphosting/runtime/anyrpc/AbstractRpcCompatibilityTest.java
+++ /dev/null
@@ -1,869 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.apphosting.runtime.anyrpc;
-
-import static com.google.common.truth.OptionalSubject.optionals;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static java.nio.charset.StandardCharsets.US_ASCII;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import com.google.apphosting.base.protos.AppinfoPb;
-import com.google.apphosting.base.protos.AppinfoPb.AppInfo;
-import com.google.apphosting.base.protos.ClonePb.CloneSettings;
-import com.google.apphosting.base.protos.ClonePb.PerformanceData;
-import com.google.apphosting.base.protos.Codes.Code;
-import com.google.apphosting.base.protos.EmptyMessage;
-import com.google.apphosting.base.protos.ModelClonePb.DeadlineInfo;
-import com.google.apphosting.base.protos.ModelClonePb.PerformanceDataRequest;
-import com.google.apphosting.base.protos.RuntimePb.UPRequest;
-import com.google.apphosting.base.protos.RuntimePb.UPResponse;
-import com.google.apphosting.base.protos.Status.StatusProto;
-import com.google.apphosting.runtime.anyrpc.ClientInterfaces.CloneControllerClient;
-import com.google.apphosting.runtime.anyrpc.ClientInterfaces.EvaluationRuntimeClient;
-import com.google.common.collect.ImmutableClassToInstanceMap;
-import com.google.common.collect.ImmutableList;
-import com.google.common.flogger.GoogleLogger;
-import com.google.common.reflect.Reflection;
-import com.google.common.testing.TestLogHandler;
-import com.google.protobuf.ByteString;
-import com.google.protobuf.Message;
-import com.google.protobuf.MessageLite;
-import java.io.IOException;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.time.Clock;
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Queue;
-import java.util.Random;
-import java.util.Set;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-import java.util.logging.SimpleFormatter;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.rules.TestWatcher;
-import org.junit.runner.Description;
-import org.mockito.Mockito;
-
-/**
- * Round-trip tests for the AnyRpc layer. This is an abstract class that should be subclassed for
- * the particular configuration of client and server implementations that is being tested.
- */
-public abstract class AbstractRpcCompatibilityTest {
- private static final GoogleLogger logger = GoogleLogger.forEnclosingClass();
-
- // Status codes from Google-internal RpcErrorCode class:
- private static final int RPC_SERVER_ERROR = 3;
- private static final int RPC_DEADLINE_EXCEEDED = 4;
- private static final int RPC_CANCELLED = 6;
-
- abstract AnyRpcClientContextFactory newRpcClientContextFactory();
-
- abstract EvaluationRuntimeClient newEvaluationRuntimeClient();
-
- abstract CloneControllerClient newCloneControllerClient();
-
- abstract ClockHandler getClockHandler();
-
- ClockHandler clockHandler;
- private AnyRpcClientContextFactory rpcClientContextFactory;
-
- private TestLogHandler testLogHandler;
-
- private final List asynchronousFailures =
- Collections.synchronizedList(new ArrayList());
-
- abstract AnyRpcPlugin getClientPlugin();
-
- abstract AnyRpcPlugin getServerPlugin();
-
- abstract int getPacketSize();
-
- abstract static class ClockHandler {
- final Clock clock;
-
- ClockHandler(Clock clock) {
- this.clock = clock;
- }
-
- long getMillis() {
- return clock.millis();
- }
-
- abstract void advanceClock();
-
- abstract void assertStartTime(long expectedStartTime, long reportedStartTime);
- }
-
- @Before
- public void setUpAbstractRpcCompatibilityTest() throws IOException {
- clockHandler = getClockHandler();
-
- rpcClientContextFactory = newRpcClientContextFactory();
-
- testLogHandler = new TestLogHandler();
- Logger.getLogger("").addHandler(testLogHandler);
- }
-
- @After
- public void tearDown() {
- // If the subclass defines its own @After method, that will run before this one.
- // So it shouldn't shut down these plugins or doing anything else that might interfere
- // with what we do here.
- AnyRpcPlugin clientRpcPlugin = getClientPlugin();
- AnyRpcPlugin serverRpcPlugin = getServerPlugin();
- if (serverRpcPlugin != null && serverRpcPlugin.serverStarted()) {
- serverRpcPlugin.stopServer();
- }
- if (clientRpcPlugin != null) {
- clientRpcPlugin.shutdown();
- }
- if (serverRpcPlugin != null) {
- serverRpcPlugin.shutdown();
- }
- assertThat(asynchronousFailures).isEmpty();
- }
-
- private boolean checkLogMessages = true;
- private final List expectedLogMessages = new ArrayList<>();
-
- void dontCheckLogMessages() {
- checkLogMessages = false;
- }
-
- void addExpectedLogMessage(String message) {
- expectedLogMessages.add(message);
- }
-
- /**
- * Log checking rule. The way {@code @Rule} works is that it is invoked for every test method and
- * can insert behaviour before and after the execution of the method. Here, we want to check that
- * there have been no unexpected log messages, but only if the test method otherwise succeeded. So
- * instead of using {@code @After}, which would risk masking test failures with the log check
- * failure, we use {@link TestWatcher} to run the check only when the test method has succeeded.
- */
- @Rule
- public TestRule logCheckerRule =
- new TestWatcher() {
- @Override
- protected void succeeded(Description description) {
- if (checkLogMessages) {
- List messages = new ArrayList<>();
- for (LogRecord logRecord : testLogHandler.getStoredLogRecords()) {
- if (logRecord.getLevel().intValue() >= Level.WARNING.intValue()) {
- messages.add(new SimpleFormatter().formatMessage(logRecord));
- }
- }
- assertThat(messages).isEqualTo(expectedLogMessages);
- }
- }
- };
-
- private static class TestEvaluationRuntimeServer implements EvaluationRuntimeServerInterface {
- final AtomicInteger handleRequestCount = new AtomicInteger();
- final Semaphore addAppVersionReceived = new Semaphore(0);
- AtomicLong latestGlobalId = new AtomicLong();
-
- @Override
- public void handleRequest(AnyRpcServerContext ctx, UPRequest req) {
- latestGlobalId.set(ctx.getGlobalId());
- handleRequestCount.getAndIncrement();
- String appId = req.getAppId();
- // We abuse the error_message field in the response to echo the app id and also the
- // remaining time as seen by this thread and as seen by another thread.
- // The message looks like "my-app-id/5.23/5.23".
- UPResponse resp =
- UPResponse.newBuilder()
- .setError(UPResponse.ERROR.OK_VALUE)
- .setErrorMessage(
- appId
- + "/"
- + ctx.getTimeRemaining().getSeconds()
- + "/"
- + timeRemainingInAnotherThread(ctx).getSeconds())
- .build();
- ctx.finishWithResponse(resp);
- }
-
- private static Duration timeRemainingInAnotherThread(final AnyRpcServerContext ctx) {
- ExecutorService executor = Executors.newSingleThreadExecutor();
- Callable getTimeRemaining = ctx::getTimeRemaining;
- try {
- return executor.submit(getTimeRemaining).get();
- } catch (InterruptedException | ExecutionException e) {
- throw new AssertionError(e);
- } finally {
- executor.shutdown();
- }
- }
-
- @Override
- public void addAppVersion(AnyRpcServerContext ctx, AppinfoPb.AppInfo req) {
- // This doesn't return ctx.finishWithResponse, so a caller should eventually time out.
- // We signal a semaphore so that tests can wait until the server has indeed received this
- // request. Otherwise there is a danger that the test will shut down the server before it
- // receives the request, which would generate a spurious log message.
- addAppVersionReceived.release();
- }
-
- @Override
- public void deleteAppVersion(AnyRpcServerContext ctx, AppinfoPb.AppInfo req) {
- throw new UnsupportedOperationException("deleteAppVersion");
- }
-
- long getLatestGlobalId() {
- return latestGlobalId.get();
- }
- }
-
- class TestCallback implements AnyRpcCallback {
- private final BlockingQueue> resultQueue = new ArrayBlockingQueue<>(1);
-
- Optional result() {
- try {
- Optional result = resultQueue.poll(5, SECONDS);
- if (result == null) {
- fail("Timeout waiting for RPC result");
- }
- return result;
- } catch (InterruptedException e) {
- throw new AssertionError(e);
- }
- }
-
- void assertFailureOrNoResult() {
- Optional result = resultQueue.poll();
- if (result != null) {
- assertThat(result).isEmpty();
- }
- }
-
- private void resultIs(Optional result) {
- try {
- resultQueue.offer(result, 5, SECONDS);
- } catch (InterruptedException e) {
- logger.atSevere().withCause(e).log("Interrupted while sending result %s", result);
- asynchronousFailures.add("Interrupted while sending result " + result);
- }
- }
-
- @Override
- public void success(T response) {
- resultIs(Optional.of(response));
- }
-
- @Override
- public void failure() {
- resultIs(Optional.empty());
- }
- }
-
- @Test
- public void testRpc() throws Exception {
- EvaluationRuntimeServerInterface runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- TestCallback callback = new TestCallback<>();
-
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- UPRequest request = makeUPRequest("hello");
- evaluationRuntimeClient.handleRequest(clientContext, request, callback);
- Optional result = callback.result();
- assertWithMessage("RPC should succeed").about(optionals()).that(result).isPresent();
- assertThat(result.get().getErrorMessage()).startsWith("hello/");
- }
-
- @Test
- public void testStartTime() throws Exception {
- EvaluationRuntimeServerInterface runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- TestCallback callback = new TestCallback<>();
-
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- UPRequest request = makeUPRequest("hello");
- long rpcStartTime = clockHandler.getMillis();
- evaluationRuntimeClient.handleRequest(clientContext, request, callback);
- clockHandler.advanceClock();
- long reportedStartTime = clientContext.getStartTimeMillis();
- clockHandler.assertStartTime(rpcStartTime, reportedStartTime);
- callback.result();
- assertThat(clientContext.getStartTimeMillis()).isEqualTo(reportedStartTime);
- }
-
- @Test
- public void testRepeatedRpcs() throws Exception {
- TestEvaluationRuntimeServer runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- TestCallback callback = new TestCallback<>();
-
- Set globalIds = new HashSet<>();
- for (int i = 0; i < 10; i++) {
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- String testString = createRandomString(10);
- UPRequest request = makeUPRequest(testString);
- evaluationRuntimeClient.handleRequest(clientContext, request, callback);
- Optional result = callback.result();
- assertWithMessage("RPC should succeed").about(optionals()).that(result).isPresent();
-
- long globalId = runtimeServer.getLatestGlobalId();
- assertThat(globalIds).doesNotContain(globalId);
- globalIds.add(globalId);
- }
- }
-
- ImmutableList expectedLogMessagesForUnimplemented() {
- return ImmutableList.of();
- }
-
- @Test
- public void testUnimplemented() throws Exception {
- EvaluationRuntimeServerInterface runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- CloneControllerClient cloneControllerClient = newCloneControllerClient();
- TestCallback callback = new TestCallback<>();
-
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- CloneSettings request = CloneSettings.getDefaultInstance();
- cloneControllerClient.applyCloneSettings(clientContext, request, callback);
- Optional result = callback.result();
- assertWithMessage("RPC should not succeed").about(optionals()).that(result).isEmpty();
- StatusProto status = clientContext.getStatus();
- assertThat(status.getCode()).isNotEqualTo(0);
- assertThat(status.getMessage()).contains("UnsupportedOperationException: applyCloneSettings");
- StatusProto expectedStatus =
- StatusProto.newBuilder()
- .setSpace("RPC")
- .setCode(RPC_SERVER_ERROR)
- .setMessage(status.getMessage())
- .setCanonicalCode(Code.INTERNAL_VALUE)
- .build();
- assertThat(status).isEqualTo(expectedStatus);
-
- for (String message : expectedLogMessagesForUnimplemented()) {
- addExpectedLogMessage(message);
- }
-
- // Do another RPC to make sure that the exception hasn't killed the server.
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- TestCallback successCallback = new TestCallback<>();
-
- AnyRpcClientContext successClientContext = rpcClientContextFactory.newClientContext();
- UPRequest successRequest = makeUPRequest("hello");
- evaluationRuntimeClient.handleRequest(successClientContext, successRequest, successCallback);
- Optional successResult = successCallback.result();
- assertWithMessage("RPC should succeed").about(optionals()).that(successResult).isPresent();
- assertThat(successResult.get().getErrorMessage()).startsWith("hello/");
- }
-
- @Test
- public void testDeadline() throws Exception {
- EvaluationRuntimeServerInterface runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- TestCallback callback = new TestCallback<>();
-
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- clientContext.setDeadline(0.5);
- AppInfo request = makeAppInfo();
- evaluationRuntimeClient.addAppVersion(clientContext, request, callback);
- Optional result = callback.result();
- assertThat(result).isEmpty();
- StatusProto status = clientContext.getStatus();
- assertThat(status.getSpace()).isEqualTo("RPC");
- assertThat(status.getCode()).isEqualTo(RPC_DEADLINE_EXCEEDED);
- }
-
- @Test
- public void testDeadlineRemaining() throws Exception {
- EvaluationRuntimeServerInterface runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- final BlockingQueue> resultQueue = new ArrayBlockingQueue<>(1);
- AnyRpcCallback callback =
- new AnyRpcCallback() {
- @Override
- public void success(UPResponse response) {
- resultQueue.add(Optional.of(response));
- }
-
- @Override
- public void failure() {
- resultQueue.add(Optional.empty());
- }
- };
-
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- double fakeDeadline = 1234.0;
- clientContext.setDeadline(fakeDeadline);
- UPRequest request = makeUPRequest("hello");
- evaluationRuntimeClient.handleRequest(clientContext, request, callback);
- Optional result = resultQueue.take();
- assertWithMessage("RPC should succeed").about(optionals()).that(result).isPresent();
- String message = result.get().getErrorMessage();
- // Now check that we got a correct deadline in the request handler.
- // See TestEvaluationRuntimeServer.handleRequest for how we construct this string.
- Pattern pattern = Pattern.compile("(.*)/(.*)/(.*)");
- assertThat(message).matches(pattern);
- Matcher matcher = pattern.matcher(message);
- assertThat(matcher.matches()).isTrue();
- assertThat(matcher.group(1)).isEqualTo("hello");
- double remainingThisThread = Double.parseDouble(matcher.group(2));
- assertThat(remainingThisThread).isLessThan(fakeDeadline);
- assertThat(remainingThisThread).isGreaterThan(fakeDeadline - 30);
- double remainingOtherThread = Double.parseDouble(matcher.group(3));
- assertThat(remainingOtherThread).isLessThan(fakeDeadline);
- assertThat(remainingOtherThread).isGreaterThan(fakeDeadline - 30);
- }
-
- @Test
- public void testCancelled() throws Exception {
- TestEvaluationRuntimeServer runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- TestCallback callback = new TestCallback<>();
-
- long rpcStartTime = clockHandler.getMillis();
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- AppInfo request = makeAppInfo();
- evaluationRuntimeClient.addAppVersion(clientContext, request, callback);
-
- // Wait until the server has received the request. Since it doesn't reply, if we didn't cancel
- // the request the client would time out.
- runtimeServer.addAppVersionReceived.acquire();
-
- clockHandler.advanceClock();
- clientContext.startCancel();
- Optional result = callback.result();
- assertThat(result).isEmpty();
- StatusProto status = clientContext.getStatus();
- assertThat(status.getSpace()).isEqualTo("RPC");
- assertThat(status.getCode()).isEqualTo(RPC_CANCELLED);
-
- clockHandler.assertStartTime(rpcStartTime, clientContext.getStartTimeMillis());
- }
-
- @Test
- public void testCancelAlreadyCompleted() throws Exception {
- EvaluationRuntimeServerInterface runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- TestCallback callback = new TestCallback<>();
-
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- UPRequest request = makeUPRequest("hello");
- evaluationRuntimeClient.handleRequest(clientContext, request, callback);
- Optional result = callback.result();
- assertWithMessage("RPC should succeed").about(optionals()).that(result).isPresent();
-
- // This is essentially just checking that there's no exception or deadlock.
- clientContext.startCancel();
- }
-
- @Test
- public void testLargeRoundTrip() throws Exception {
- EvaluationRuntimeServerInterface runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- TestCallback callback = new TestCallback<>();
-
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- final String requestText = createRandomString(getPacketSize());
- UPRequest request = makeUPRequest(requestText);
- evaluationRuntimeClient.handleRequest(clientContext, request, callback);
- Optional result = callback.result();
- assertWithMessage("RPC should succeed").about(optionals()).that(result).isPresent();
- assertThat(result.get().getErrorMessage()).startsWith(requestText);
- }
-
- @Test
- public void testConcurrency_smallRequest() throws Exception {
- doTestConcurrency(10);
- }
-
- @Test
- public void testConcurrency_largeRequest() throws Exception {
- doTestConcurrency(getPacketSize());
-
- // TODO: enable log checking. Currently we get messages like this:
- // User called setEventCallback() when a previous upcall was still pending!
- // http://google3/java/com/google/net/eventmanager/DescriptorImpl.java&l=312&rcl=20829669
- dontCheckLogMessages();
- }
-
- private void doTestConcurrency(int requestSize) throws InterruptedException {
- final int concurrentThreads = 5;
-
- EvaluationRuntimeServerInterface runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
-
- Semaphore done = new Semaphore(0);
- CountDownLatch countDownLatch = new CountDownLatch(concurrentThreads);
- Queue exceptions = new LinkedBlockingQueue<>();
- @SuppressWarnings("InterruptedExceptionSwallowed")
- Runnable runClient =
- () -> runClient(requestSize, countDownLatch, evaluationRuntimeClient, done, exceptions);
- for (int i = 0; i < concurrentThreads; i++) {
- new Thread(runClient, "Client " + i).start();
- }
- boolean acquired = done.tryAcquire(concurrentThreads, 20, SECONDS);
- assertThat(exceptions).isEmpty();
- assertThat(acquired).isTrue();
- }
-
- @SuppressWarnings("InterruptedExceptionSwallowed")
- private void runClient(
- int requestSize,
- CountDownLatch countDownLatch,
- EvaluationRuntimeClient evaluationRuntimeClient,
- Semaphore done,
- Queue exceptions) {
- try {
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- String text = createRandomString(requestSize);
- UPRequest request = makeUPRequest(text);
- countDownLatch.countDown();
- countDownLatch.await();
- TestCallback callback = new TestCallback<>();
- evaluationRuntimeClient.handleRequest(clientContext, request, callback);
- Optional result = callback.result();
- assertWithMessage("RPC should succeed").about(optionals()).that(result).isPresent();
- assertThat(result.get().getErrorMessage()).startsWith(text);
- done.release();
- } catch (Throwable t) {
- exceptions.add(t);
- }
- }
-
- private static class AppErrorEvaluationRuntimeServer extends TestEvaluationRuntimeServer {
- @Override
- public void handleRequest(AnyRpcServerContext ctx, UPRequest req) {
- ctx.finishWithAppError(7, "oh noes!");
- }
- }
-
- @Test
- public void testAppError() throws Exception {
- EvaluationRuntimeServerInterface runtimeServer = new AppErrorEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- TestCallback callback = new TestCallback<>();
-
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- UPRequest request = makeUPRequest("hello");
- evaluationRuntimeClient.handleRequest(clientContext, request, callback);
- Optional result = callback.result();
- assertWithMessage("RPC should fail").about(optionals()).that(result).isEmpty();
- assertThat(clientContext.getApplicationError()).isEqualTo(7);
- assertThat(clientContext.getErrorDetail()).isEqualTo("oh noes!");
- }
-
- /**
- * Allows us to check the {@link AnyRpcPlugin#blockUntilShutdown()} method. This is a thread that
- * calls that method and then exits. So we can check that the method blocks (because the thread is
- * alive) and then unblocks when we stop the server (because the thread is dead).
- */
- private static class ServerWatcher extends Thread {
- private final AnyRpcPlugin rpcPlugin;
-
- ServerWatcher(AnyRpcPlugin rpcPlugin) {
- this.rpcPlugin = rpcPlugin;
- }
-
- @Override
- public void run() {
- rpcPlugin.blockUntilShutdown();
- }
- }
-
- @Test
- public void testStopServer() throws Exception {
- TestEvaluationRuntimeServer runtimeServer = new TestEvaluationRuntimeServer();
- CloneControllerServerInterface controllerServer =
- implementAsUnsupported(CloneControllerServerInterface.class);
- getServerPlugin().startServer(runtimeServer, controllerServer);
-
- ServerWatcher serverWatcher = new ServerWatcher(getServerPlugin());
- serverWatcher.start();
-
- assertThat(runtimeServer.handleRequestCount.get()).isEqualTo(0);
-
- EvaluationRuntimeClient evaluationRuntimeClient = newEvaluationRuntimeClient();
- TestCallback callback = new TestCallback<>();
-
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- UPRequest request = makeUPRequest("hello");
- evaluationRuntimeClient.handleRequest(clientContext, request, callback);
- Optional result = callback.result();
- assertWithMessage("RPC should succeed").about(optionals()).that(result).isPresent();
- assertThat(result.get().getErrorMessage()).startsWith("hello/");
-
- assertThat(runtimeServer.handleRequestCount.get()).isEqualTo(1);
- assertThat(serverWatcher.isAlive()).isTrue();
- assertThat(getServerPlugin().serverStarted()).isTrue();
-
- getServerPlugin().stopServer();
-
- // The ServerWatcher thread should now die, so wait for it to do so.
- serverWatcher.join(1000);
- assertThat(serverWatcher.isAlive()).isFalse();
- assertThat(getServerPlugin().serverStarted()).isFalse();
-
- // A request to the server should not be handled there.
- AnyRpcClientContext clientContext2 = rpcClientContextFactory.newClientContext();
- TestCallback callback2 = new TestCallback<>();
- evaluationRuntimeClient.handleRequest(clientContext2, request, callback2);
- // Now wait a second to make sure the server method didn't get called, and that the client
- // either got no response or got a failure.
- Thread.sleep(1000);
- assertWithMessage("Server should not handle requests")
- .that(runtimeServer.handleRequestCount.get())
- .isEqualTo(1);
- callback2.assertFailureOrNoResult();
- }
-
- // Round trip test for every method defined in each of the two server interfaces.
- @Test
- public void testAllServerMethods() throws Exception {
- EvaluationRuntimeServerInterface evaluationRuntimeServer =
- Mockito.mock(EvaluationRuntimeServerInterface.class);
- CloneControllerServerInterface cloneControllerServer =
- Mockito.mock(CloneControllerServerInterface.class);
- AnyRpcPlugin serverPlugin = getServerPlugin();
- serverPlugin.startServer(evaluationRuntimeServer, cloneControllerServer);
- testServerMethods(
- EvaluationRuntimeServerInterface.class,
- evaluationRuntimeServer,
- newEvaluationRuntimeClient());
- testServerMethods(
- CloneControllerServerInterface.class, cloneControllerServer, newCloneControllerClient());
- }
-
- // To follow what is going on here, consider the example of EvaluationRuntime. Then `server`
- // will be a mock for EvaluationRuntimeServerInterface and `client` will be a real client
- // implementing ClientInterfaces.EvaluationRuntimeClient. `serverInterface` will be
- // EvaluationRuntimeServerInterface.class. We iterate over the methods of that interface,
- // for example:
- // void handleRequest(AnyRpcServerContext ctx, UPRequest req);
- // From the method signature, we can tell that we need a UPRequest as input, and that the
- // corresponding method in the client interface must look like this:
- // void handleRequest(AnyRpcClientContext ctx, UPRequest req, AnyRpcCallback cb);
- // We don't need to know SOMETHING to find that method, and once we do we can use reflection
- // to find that SOMETHING is UPResponse.
- // We set up the mock to expect the server to be called with our fake UPRequest, and to call
- // ctx.finishResponse(fakeUPResponse) when it is.
- // We then invoke client.handleRequest with the UPRequest and a callback that will collect the
- // UPResponse. We check that the UPResponse is our fake one, and that the correct server method
- // was called.
-
- private void testServerMethods(Class serverInterface, T server, Object client)
- throws ReflectiveOperationException {
- for (Method serverMethod : serverInterface.getMethods()) {
- Class extends Message> requestType = getRequestTypeFromServerMethod(serverMethod);
- Method clientMethod =
- client
- .getClass()
- .getMethod(
- serverMethod.getName(),
- AnyRpcClientContext.class,
- requestType,
- AnyRpcCallback.class);
- Class extends Message> responseType = getResponseTypeFromClientMethod(clientMethod);
- Message fakeRequest = getFakeMessage(requestType);
- final Message fakeResponse = getFakeMessage(responseType);
- when(serverMethod.invoke(server, any(AnyRpcServerContext.class), eq(fakeRequest)))
- .thenAnswer(
- invocationOnMock -> {
- AnyRpcServerContext serverContext =
- (AnyRpcServerContext) invocationOnMock.getArguments()[0];
- serverContext.finishWithResponse(fakeResponse);
- return null;
- });
- AnyRpcClientContext clientContext = rpcClientContextFactory.newClientContext();
- TestCallback callback = new TestCallback<>();
- clientMethod.invoke(client, clientContext, fakeRequest, callback);
- Optional result = callback.result();
- assertWithMessage(clientMethod.getName()).that(result).isEqualTo(Optional.of(fakeResponse));
- Object serverVerify = verify(server);
- serverMethod.invoke(serverVerify, any(AnyRpcServerContext.class), eq(fakeRequest));
- Mockito.verifyNoMoreInteractions(server);
- }
- }
-
- // Reminder: the server method looks like this:
- // void handleRequest(AnyRpcServerContext ctx, UPRequest req);
- // This method returns UPRequest for that example.
- private static Class extends Message> getRequestTypeFromServerMethod(Method serverMethod) {
- Class>[] parameterTypes = serverMethod.getParameterTypes();
- assertThat(parameterTypes).hasLength(2);
- assertThat(parameterTypes[0]).isEqualTo(AnyRpcServerContext.class);
- assertThat(parameterTypes[1]).isAssignableTo(Message.class);
- @SuppressWarnings("unchecked")
- Class extends Message> requestType = (Class extends Message>) parameterTypes[1];
- return requestType;
- }
-
- // Reminder: the client method looks like this:
- // void handleRequest(AnyRpcClientContext ctx, UPRequest req, AnyRpcCallback cb);
- // This method returns UPResponse for that example.
- private static Class extends Message> getResponseTypeFromClientMethod(Method clientMethod) {
- Class>[] parameterTypes = clientMethod.getParameterTypes();
- assertThat(parameterTypes[2]).isEqualTo(AnyRpcCallback.class);
- ParameterizedType anyRpcCallbackType =
- (ParameterizedType) clientMethod.getGenericParameterTypes()[2];
- Class> typeArgument = (Class>) anyRpcCallbackType.getActualTypeArguments()[0];
- assertThat(typeArgument).isAssignableTo(Message.class);
- @SuppressWarnings("unchecked")
- Class extends Message> responseType = (Class extends Message>) typeArgument;
- return responseType;
- }
-
- private static T getFakeMessage(Class messageType) {
- T message = FAKE_MESSAGES.getInstance(messageType);
- assertWithMessage("Expected fake message for " + messageType.getName())
- .that(message)
- .isNotNull();
- assertWithMessage(messageType.getName() + " " + message.getInitializationErrorString())
- .that(message.isInitialized())
- .isTrue();
- return message;
- }
-
- private static final ImmutableClassToInstanceMap FAKE_MESSAGES =
- ImmutableClassToInstanceMap.builder()
- .put(EmptyMessage.class, EmptyMessage.getDefaultInstance())
- .put(UPRequest.class, makeUPRequest("blim"))
- .put(UPResponse.class, UPResponse.newBuilder().setError(23).build())
- .put(AppInfo.class, makeAppInfo())
- .put(
- CloneSettings.class,
- CloneSettings.newBuilder().setCloneKey(ByteString.copyFrom("blam", UTF_8)).build())
- .put(PerformanceData.class, makePerformanceData())
- .put(
- PerformanceDataRequest.class,
- PerformanceDataRequest.newBuilder()
- .setType(PerformanceData.Type.PERIODIC_SAMPLE)
- .build())
- .put(
- DeadlineInfo.class,
- DeadlineInfo.newBuilder().setSecurityTicket("tickety boo").setHard(true).build())
- .build();
-
- private static T implementAsUnsupported(Class interfaceToImplement) {
- InvocationHandler unsupportedInvocationHandler =
- (proxy, method, args) -> {
- throw new UnsupportedOperationException(method.getName());
- };
- return Reflection.newProxy(interfaceToImplement, unsupportedInvocationHandler);
- }
-
- private static UPRequest makeUPRequest(String appId) {
- AppinfoPb.Handler handler = AppinfoPb.Handler.newBuilder().setPath("foo").build();
- return UPRequest.newBuilder()
- .setAppId(appId)
- .setVersionId("world")
- .setNickname("foo")
- .setSecurityTicket("bar")
- .setHandler(handler)
- .build();
- }
-
- private static AppInfo makeAppInfo() {
- return AppInfo.newBuilder().setAppId("foo").build();
- }
-
- private static PerformanceData makePerformanceData() {
- return PerformanceData.newBuilder()
- .addEntries(
- PerformanceData.Entry.newBuilder().setPayload(ByteString.copyFrom("payload", UTF_8)))
- .build();
- }
-
- private String createRandomString(int size) {
- Random random = new Random();
- byte[] bytes = new byte[size];
- for (int i = 0; i < size; ++i) {
- bytes[i] = (byte) (random.nextInt(127 - 32) + 32);
- }
- return new String(bytes, US_ASCII);
- }
-}
diff --git a/runtime/impl/src/test/java/com/google/apphosting/runtime/anyrpc/ClientInterfaces.java b/runtime/impl/src/test/java/com/google/apphosting/runtime/anyrpc/ClientInterfaces.java
deleted file mode 100644
index f73de0db7..000000000
--- a/runtime/impl/src/test/java/com/google/apphosting/runtime/anyrpc/ClientInterfaces.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.apphosting.runtime.anyrpc;
-
-import com.google.apphosting.base.protos.AppinfoPb.AppInfo;
-import com.google.apphosting.base.protos.ClonePb.CloneSettings;
-import com.google.apphosting.base.protos.ClonePb.PerformanceData;
-import com.google.apphosting.base.protos.EmptyMessage;
-import com.google.apphosting.base.protos.ModelClonePb.DeadlineInfo;
-import com.google.apphosting.base.protos.ModelClonePb.PerformanceDataRequest;
-import com.google.apphosting.base.protos.RuntimePb.UPRequest;
-import com.google.apphosting.base.protos.RuntimePb.UPResponse;
-
-/**
- * Abstract client interfaces for the EvaluationRuntime and CloneController RPCs. These are just
- * used as a convenient way to test RPCs. There is no connection to actual EvaluationRuntime or
- * CloneController functionality.
- *
- */
-class ClientInterfaces {
- // There are no instances of this class.
- private ClientInterfaces() {}
-
- interface EvaluationRuntimeClient {
- void handleRequest(AnyRpcClientContext ctx, UPRequest req, AnyRpcCallback cb);
-
- void addAppVersion(AnyRpcClientContext ctx, AppInfo req, AnyRpcCallback cb);
-
- void deleteAppVersion(AnyRpcClientContext ctx, AppInfo req, AnyRpcCallback cb);
- }
-
- interface CloneControllerClient {
- void waitForSandbox(AnyRpcClientContext ctx, EmptyMessage req, AnyRpcCallback cb);
-
- void applyCloneSettings(
- AnyRpcClientContext ctx, CloneSettings req, AnyRpcCallback cb);
-
- void sendDeadline(AnyRpcClientContext ctx, DeadlineInfo req, AnyRpcCallback cb);
-
- void getPerformanceData(
- AnyRpcClientContext ctx, PerformanceDataRequest req, AnyRpcCallback cb);
- }
-}
diff --git a/runtime/lite/pom.xml b/runtime/lite/pom.xml
index 482100336..56e0a3b81 100644
--- a/runtime/lite/pom.xml
+++ b/runtime/lite/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime/local_jetty12/pom.xml b/runtime/local_jetty12/pom.xml
index 3ef15b33c..1ba63abb7 100644
--- a/runtime/local_jetty12/pom.xml
+++ b/runtime/local_jetty12/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
@@ -245,12 +245,6 @@
com/google/borg/borgcron/**
-
- com.google.appengine:appengine-tools-sdk:*
-
- com/google/appengine/tools/development/proto/**
-
-
com.google.appengine:proto1:*
diff --git a/runtime/local_jetty12_ee10/pom.xml b/runtime/local_jetty12_ee10/pom.xml
index 217a6d976..a7bec1f5d 100644
--- a/runtime/local_jetty12_ee10/pom.xml
+++ b/runtime/local_jetty12_ee10/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime/local_jetty9/pom.xml b/runtime/local_jetty9/pom.xml
index 2f5121a06..2d2d6081f 100644
--- a/runtime/local_jetty9/pom.xml
+++ b/runtime/local_jetty9/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
@@ -181,12 +181,6 @@
com/google/borg/borgcron/**
-
- com.google.appengine:appengine-tools-sdk:*
-
- com/google/appengine/tools/development/proto/**
-
-
com.google.appengine:proto1:*
diff --git a/runtime/main/pom.xml b/runtime/main/pom.xml
index a6ba03166..37b656a1c 100644
--- a/runtime/main/pom.xml
+++ b/runtime/main/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime/nogaeapiswebapp/pom.xml b/runtime/nogaeapiswebapp/pom.xml
index 9f109d4be..96874f2f9 100644
--- a/runtime/nogaeapiswebapp/pom.xml
+++ b/runtime/nogaeapiswebapp/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
com.google.appengine.demos
nogaeapiswebapp
diff --git a/runtime/pom.xml b/runtime/pom.xml
index 81aaab103..5cf82e161 100644
--- a/runtime/pom.xml
+++ b/runtime/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
AppEngine :: runtime projects
pom
diff --git a/runtime/runtime_impl_jetty12/pom.xml b/runtime/runtime_impl_jetty12/pom.xml
index e46f4ece9..00ccececa 100644
--- a/runtime/runtime_impl_jetty12/pom.xml
+++ b/runtime/runtime_impl_jetty12/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime/runtime_impl_jetty12/src/main/java/com/google/apphosting/runtime/jetty/ee8/AppEngineWebAppContext.java b/runtime/runtime_impl_jetty12/src/main/java/com/google/apphosting/runtime/jetty/ee8/AppEngineWebAppContext.java
index a593fcfaa..aeff17ae7 100644
--- a/runtime/runtime_impl_jetty12/src/main/java/com/google/apphosting/runtime/jetty/ee8/AppEngineWebAppContext.java
+++ b/runtime/runtime_impl_jetty12/src/main/java/com/google/apphosting/runtime/jetty/ee8/AppEngineWebAppContext.java
@@ -117,6 +117,9 @@ public AppEngineWebAppContext(File appDir, String serverInfo, boolean extractWar
// If the application fails to start, we throw so the JVM can exit.
setThrowUnavailableOnStartupException(true);
+ // This is a workaround to allow old quickstart-web.xml from Jetty 9.4 to be deployed.
+ setAttribute("org.eclipse.jetty.ee8.annotations.AnnotationIntrospector.ForceMetadataNotComplete", "true");
+
// We do this here because unlike EE10 there is no easy way
// to override createTempDirectory on the CoreContextHandler.
createTempDirectory();
diff --git a/runtime/runtime_impl_jetty9/pom.xml b/runtime/runtime_impl_jetty9/pom.xml
index c9d236e52..fd2527c06 100644
--- a/runtime/runtime_impl_jetty9/pom.xml
+++ b/runtime/runtime_impl_jetty9/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime/test/pom.xml b/runtime/test/pom.xml
index 79a1237d8..748af6b31 100644
--- a/runtime/test/pom.xml
+++ b/runtime/test/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime/testapps/pom.xml b/runtime/testapps/pom.xml
index 4de60bcba..b688fb571 100644
--- a/runtime/testapps/pom.xml
+++ b/runtime/testapps/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime/util/pom.xml b/runtime/util/pom.xml
index b433bab17..482e35913 100644
--- a/runtime/util/pom.xml
+++ b/runtime/util/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
runtime-parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime_shared/pom.xml b/runtime_shared/pom.xml
index a89cb115e..6659a1a6c 100644
--- a/runtime_shared/pom.xml
+++ b/runtime_shared/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime_shared_jetty12/pom.xml b/runtime_shared_jetty12/pom.xml
index 513e6c3f7..0f745601c 100644
--- a/runtime_shared_jetty12/pom.xml
+++ b/runtime_shared_jetty12/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime_shared_jetty12_ee10/pom.xml b/runtime_shared_jetty12_ee10/pom.xml
index cead6a5ab..1ad4e7d7b 100644
--- a/runtime_shared_jetty12_ee10/pom.xml
+++ b/runtime_shared_jetty12_ee10/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/runtime_shared_jetty9/pom.xml b/runtime_shared_jetty9/pom.xml
index ac53eee1a..7f5f0539d 100644
--- a/runtime_shared_jetty9/pom.xml
+++ b/runtime_shared_jetty9/pom.xml
@@ -22,7 +22,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/sdk_assembly/pom.xml b/sdk_assembly/pom.xml
index 4d031a439..b90ff5e90 100644
--- a/sdk_assembly/pom.xml
+++ b/sdk_assembly/pom.xml
@@ -20,7 +20,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
4.0.0
appengine-java-sdk
diff --git a/sessiondata/pom.xml b/sessiondata/pom.xml
index 0516b8017..06f469ab9 100644
--- a/sessiondata/pom.xml
+++ b/sessiondata/pom.xml
@@ -23,7 +23,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/shared_sdk/pom.xml b/shared_sdk/pom.xml
index df46476d1..a0036fce7 100644
--- a/shared_sdk/pom.xml
+++ b/shared_sdk/pom.xml
@@ -21,7 +21,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/shared_sdk_jetty12/pom.xml b/shared_sdk_jetty12/pom.xml
index 0c96eca79..0cb1ae7c3 100644
--- a/shared_sdk_jetty12/pom.xml
+++ b/shared_sdk_jetty12/pom.xml
@@ -21,7 +21,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/shared_sdk_jetty9/pom.xml b/shared_sdk_jetty9/pom.xml
index 33c379c9c..c473721d0 100644
--- a/shared_sdk_jetty9/pom.xml
+++ b/shared_sdk_jetty9/pom.xml
@@ -21,7 +21,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
jar
diff --git a/utils/pom.xml b/utils/pom.xml
index fbc4b9c74..c1eddefed 100644
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -21,7 +21,7 @@
com.google.appengine
parent
- 2.0.35-SNAPSHOT
+ 2.0.36-SNAPSHOT
true