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 requestType = getRequestTypeFromServerMethod(serverMethod); - Method clientMethod = - client - .getClass() - .getMethod( - serverMethod.getName(), - AnyRpcClientContext.class, - requestType, - AnyRpcCallback.class); - Class 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 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 requestType = (Class) 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 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 responseType = (Class) 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