diff options
41 files changed, 217 insertions, 134 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java index dd27dd176e0..22811ae5878 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java @@ -149,7 +149,6 @@ public class Admin extends AbstractConfigProducer implements Serializable { else { builder. logserver(new LogdConfig.Logserver.Builder(). - userpc(true). use(logServerContainerCluster.isPresent() || !isHostedVespa). host(logserver.getHostName()). rpcport(logserver.getRelativePort(0)). diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java index 53d20379989..6eaefe4c82b 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java @@ -525,6 +525,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye public long createSession(ApplicationId applicationId, TimeoutBudget timeoutBudget, File applicationDirectory) { Tenant tenant = tenantRepository.getTenant(applicationId.tenant()); + tenant.getApplicationRepo().createApplication(applicationId); LocalSessionRepo localSessionRepo = tenant.getLocalSessionRepo(); SessionFactory sessionFactory = tenant.getSessionFactory(); LocalSession session = sessionFactory.createSession(applicationDirectory, applicationId, timeoutBudget); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java index 656030bb8d2..92add4d053b 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java @@ -32,6 +32,7 @@ import java.util.stream.Collectors; * of whatever session may be activated next, if any, and /lock is used for synchronizing writes to all these paths. * * @author Ulf Lilleengen + * @author jonmv */ public class TenantApplications { @@ -73,6 +74,7 @@ public class TenantApplications { public List<ApplicationId> activeApplications() { return curator.getChildren(applicationsPath).stream() .filter(this::isValid) + .sorted() .map(ApplicationId::fromSerializedForm) .filter(id -> activeSessionOf(id).isPresent()) .collect(Collectors.toUnmodifiableList()); @@ -109,11 +111,14 @@ public class TenantApplications { * @param sessionId Id of the session containing the application package for this id. */ public Transaction createPutTransaction(ApplicationId applicationId, long sessionId) { - if (curator.exists(applicationPath(applicationId))) { - return new CuratorTransaction(curator).add(CuratorOperations.setData(applicationPath(applicationId).getAbsolute(), Utf8.toAsciiBytes(sessionId))); - } else { - return new CuratorTransaction(curator).add(CuratorOperations.create(applicationPath(applicationId).getAbsolute(), Utf8.toAsciiBytes(sessionId))); - } + return new CuratorTransaction(curator).add(CuratorOperations.setData(applicationPath(applicationId).getAbsolute(), Utf8.toAsciiBytes(sessionId))); + } + + /** + * Creates a node for the given application, marking its existence. + */ + public void createApplication(ApplicationId id) { + curator.create(applicationPath(id)); } /** diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java index af8956803ab..6a0a4a19737 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java @@ -64,6 +64,7 @@ public class LocalSession extends Session implements Comparable<LocalSession> { Optional<ApplicationSet> currentActiveApplicationSet, Path tenantPath, Instant now) { + applicationRepo.createApplication(params.getApplicationId()); // TODO jvenstad: This is wrong, but it has to be done now, since preparation can change the application ID of a session :( Curator.CompletionWaiter waiter = zooKeeperClient.createPrepareWaiter(); ConfigChangeActions actions = sessionPreparer.prepare(sessionContext, logger, params, currentActiveApplicationSet, tenantPath, now); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/application/TenantApplicationsTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/application/TenantApplicationsTest.java index 01a7d5e0239..69c88dc0275 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/application/TenantApplicationsTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/application/TenantApplicationsTest.java @@ -41,10 +41,10 @@ public class TenantApplicationsTest { TenantApplications repo = createZKAppRepo(); List<ApplicationId> applications = repo.activeApplications(); assertThat(applications.size(), is(2)); - assertThat(applications.get(0).application().value(), is("foo")); - assertThat(applications.get(1).application().value(), is("bar")); - assertThat(repo.requireActiveSessionOf(applications.get(0)), is(3L)); - assertThat(repo.requireActiveSessionOf(applications.get(1)), is(4L)); + assertThat(applications.get(0).application().value(), is("bar")); + assertThat(applications.get(1).application().value(), is("foo")); + assertThat(repo.requireActiveSessionOf(applications.get(0)), is(4L)); + assertThat(repo.requireActiveSessionOf(applications.get(1)), is(3L)); } @Test @@ -77,6 +77,7 @@ public class TenantApplicationsTest { public void require_that_application_ids_can_be_written() throws Exception { TenantApplications repo = createZKAppRepo(); ApplicationId myapp = createApplicationId("myapp"); + repo.createApplication(myapp); repo.createPutTransaction(myapp, 3l).commit(); String path = TenantRepository.getApplicationsPath(tenantName).append(myapp.serializedForm()).getAbsolute(); assertTrue(curatorFramework.checkExists().forPath(path) != null); @@ -91,6 +92,8 @@ public class TenantApplicationsTest { TenantApplications repo = createZKAppRepo(); ApplicationId id1 = createApplicationId("myapp"); ApplicationId id2 = createApplicationId("myapp2"); + repo.createApplication(id1); + repo.createApplication(id2); repo.createPutTransaction(id1, 1).commit(); repo.createPutTransaction(id2, 1).commit(); assertThat(repo.activeApplications().size(), is(2)); @@ -126,11 +129,7 @@ public class TenantApplicationsTest { } private static ApplicationId createApplicationId(String name) { - return new ApplicationId.Builder() - .tenant(tenantName.value()) - .applicationName(name) - .instanceName("myinst") - .build(); + return ApplicationId.from(tenantName.value(), name, "myinst"); } private void writeApplicationData(ApplicationId applicationId, long sessionId) throws Exception { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java index 3d34a4eeaf5..c6a8e1f2f9d 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java @@ -56,11 +56,13 @@ public class ApplicationContentHandlerTest extends ContentHandlerTestBase { session2 = new MockSession(2l, FilesApplicationPackage.fromFile(new File("src/test/apps/content"))); Tenant tenant1 = tenantRepository.getTenant(tenantName1); tenant1.getLocalSessionRepo().addSession(session2); + tenant1.getApplicationRepo().createApplication(idTenant1); tenant1.getApplicationRepo().createPutTransaction(idTenant1, 2l).commit(); MockSession session3 = new MockSession(3l, FilesApplicationPackage.fromFile(new File("src/test/apps/content2"))); Tenant tenant2 = tenantRepository.getTenant(tenantName2); tenant2.getLocalSessionRepo().addSession(session3); + tenant2.getApplicationRepo().createApplication(idTenant2); tenant2.getApplicationRepo().createPutTransaction(idTenant2, 3l).commit(); handler = new ApplicationHandler(ApplicationHandler.testOnlyContext(), diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java index fb75e91dfd6..1db70956407 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java @@ -46,6 +46,7 @@ public class HostHandlerTest { private HostHandler hostHandler; static void addMockApplication(Tenant tenant, ApplicationId applicationId, long sessionId) { + tenant.getApplicationRepo().createApplication(applicationId); tenant.getApplicationRepo().createPutTransaction(applicationId, sessionId).commit(); ApplicationPackage app = FilesApplicationPackage.fromFile(testApp); tenant.getLocalSessionRepo().addSession(new SessionHandlerTest.MockSession(sessionId, app, applicationId)); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandlerTest.java index b34f7a0c487..f97bc443a38 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandlerTest.java @@ -51,17 +51,17 @@ public class ListApplicationsHandlerTest { final String url = "http://myhost:14000/application/v2/tenant/mytenant/application/"; assertResponse(url, Response.Status.OK, "[]"); - applicationRepo.createPutTransaction( - new ApplicationId.Builder().tenant("tenant").applicationName("foo").instanceName("quux").build(), - 1).commit(); + ApplicationId id1 = ApplicationId.from("mytenant", "foo", "quux"); + applicationRepo.createApplication(id1); + applicationRepo.createPutTransaction(id1, 1).commit(); assertResponse(url, Response.Status.OK, "[\"" + url + "foo/environment/dev/region/us-east/instance/quux\"]"); - applicationRepo.createPutTransaction( - new ApplicationId.Builder().tenant("tenant").applicationName("bali").instanceName("quux").build(), - 1).commit(); + ApplicationId id2 = ApplicationId.from("mytenant", "bali", "quux"); + applicationRepo.createApplication(id2); + applicationRepo.createPutTransaction(id2, 1).commit(); assertResponse(url, Response.Status.OK, - "[\"" + url + "foo/environment/dev/region/us-east/instance/quux\"," + - "\"" + url + "bali/environment/dev/region/us-east/instance/quux\"]" + "[\"" + url + "bali/environment/dev/region/us-east/instance/quux\"," + + "\"" + url + "foo/environment/dev/region/us-east/instance/quux\"]" ); } @@ -82,12 +82,12 @@ public class ListApplicationsHandlerTest { @Test public void require_that_listing_works_with_multiple_tenants() throws Exception { - applicationRepo.createPutTransaction(new ApplicationId.Builder() - .tenant("tenant") - .applicationName("foo").instanceName("quux").build(), 1).commit(); - applicationRepo2.createPutTransaction(new ApplicationId.Builder() - .tenant("tenant") - .applicationName("quux").instanceName("foo").build(), 1).commit(); + ApplicationId id1 = ApplicationId.from("mytenant", "foo", "quux"); + applicationRepo.createApplication(id1); + applicationRepo.createPutTransaction(id1, 1).commit(); + ApplicationId id2 = ApplicationId.from("foobar", "quux", "foo"); + applicationRepo2.createApplication(id2); + applicationRepo2.createPutTransaction(id2, 1).commit(); String url = "http://myhost:14000/application/v2/tenant/mytenant/application/"; assertResponse(url, Response.Status.OK, "[\"" + url + "foo/environment/dev/region/us-east/instance/quux\"]"); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java index 380b76c30af..858d1e0eaa7 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java @@ -323,6 +323,9 @@ public class SessionActiveHandlerTest extends SessionHandlerTest { Optional.of(AllocatedHosts.withHosts(Collections.singleton(new HostSpec("bar", Collections.emptyList()))))); session = createRemoteSession(sessionId, initialStatus, zkClient); addLocalSession(sessionId, deployData, zkClient); + tenantRepository.getTenant(tenantName).getApplicationRepo().createApplication(ApplicationId.from(tenantName.value(), + deployData.getApplicationName(), + InstanceName.defaultName().value())); metaData = localRepo.getSession(sessionId).getMetaData(); actResponse = handler.handle(SessionHandlerTest.createTestRequest(pathPrefix, HttpRequest.Method.PUT, Cmd.ACTIVE, sessionId, subPath)); return this; diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java index bc509fcd802..0946ef3992c 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java @@ -194,6 +194,7 @@ public class SessionCreateHandlerTest extends SessionHandlerTest { .applicationName("foo") .instanceName("quux") .build(); + applicationRepo.createApplication(fooId); applicationRepo.createPutTransaction(fooId, 2).commit(); assertFromParameter("3", "http://myhost:40555/application/v2/tenant/" + tenant + "/application/foo/environment/test/region/baz/instance/quux"); localSessionRepo.addSession(new SessionHandlerTest.MockSession(5l, FilesApplicationPackage.fromFile(testApp))); @@ -202,6 +203,7 @@ public class SessionCreateHandlerTest extends SessionHandlerTest { .applicationName("foobio") .instanceName("quux") .build(); + applicationRepo.createApplication(bioId); applicationRepo.createPutTransaction(bioId, 5).commit(); assertFromParameter("6", "http://myhost:40555/application/v2/tenant/" + tenant + "/application/foobio/environment/staging/region/baz/instance/quux"); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java index e7db4dcf58f..a4432dcbfcd 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java @@ -196,12 +196,14 @@ public class LocalSessionTest { zkClient.write(Collections.singletonMap(new Version(0, 0, 0), new MockFileRegistry())); File sessionDir = new File(tenantFileSystemDirs.sessionsPath(), String.valueOf(sessionId)); sessionDir.createNewFile(); + TenantApplications applications = TenantApplications.create(curator, new MockReloadHandler(), tenant); + applications.createApplication(zkc.readApplicationId()); return new LocalSession(tenant, sessionId, preparer, new SessionContext( FilesApplicationPackage.fromFile(testApp), zkc, sessionDir, - TenantApplications.create(curator, new MockReloadHandler(), tenant), + applications, new HostRegistry<>(), superModelGenerationCounter, flagSource)); diff --git a/container-search/abi-spec.json b/container-search/abi-spec.json index 885b157b4c3..b968d1c391f 100644 --- a/container-search/abi-spec.json +++ b/container-search/abi-spec.json @@ -5066,6 +5066,7 @@ "public void addItem(com.yahoo.prelude.query.Item)", "public void addItem(int, com.yahoo.prelude.query.Item)", "public boolean isEmpty()", + "public com.yahoo.prelude.query.Item and(com.yahoo.prelude.query.Item)", "public static java.util.List getPositiveTerms(com.yahoo.prelude.query.Item)", "public bridge synthetic com.yahoo.prelude.query.CompositeItem clone()", "public bridge synthetic com.yahoo.prelude.query.Item clone()", diff --git a/container-search/src/main/java/com/yahoo/search/query/QueryTree.java b/container-search/src/main/java/com/yahoo/search/query/QueryTree.java index bacfe8a949a..6eba6ae4837 100644 --- a/container-search/src/main/java/com/yahoo/search/query/QueryTree.java +++ b/container-search/src/main/java/com/yahoo/search/query/QueryTree.java @@ -108,9 +108,12 @@ public class QueryTree extends CompositeItem { // -------------- Facade - /** Modifies this query to become the current query AND the given item */ - // TODO: Make sure this is complete, unit test and make it public - private void and(Item item) { + /** + * Modifies this query to become the current query AND the given item. + * + * @return the resulting root item in this + */ + public Item and(Item item) { if (isEmpty()) { setRoot(item); } @@ -126,12 +129,16 @@ public class QueryTree extends CompositeItem { notItem.addPositiveItem(getRoot()); setRoot(notItem); } + else if (getRoot() instanceof AndItem) { + ((AndItem) getRoot()).addItem(item); + } else { AndItem andItem = new AndItem(); andItem.addItem(getRoot()); andItem.addItem(item); setRoot(andItem); } + return getRoot(); } /** Returns a flattened list of all positive query terms under the given item */ diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/BooleanSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/BooleanSearcher.java index 21bc22d7002..f77301f587c 100644 --- a/container-search/src/main/java/com/yahoo/search/querytransform/BooleanSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/querytransform/BooleanSearcher.java @@ -20,7 +20,8 @@ import static com.yahoo.yolean.Exceptions.toMessageString; /** * Searcher that builds a PredicateItem from the &boolean properties and inserts it into a query. - * @author <a href="mailto:magnarn@yahoo-inc.com">Magnar Nedland</a> + * + * @author Magnar Nedland */ @After({ STEMMING, ACCENT_REMOVAL }) @Provides(BooleanSearcher.PREDICATE) @@ -74,7 +75,7 @@ public class BooleanSearcher extends Searcher { item.setIndexName(fieldName); new PredicateValueAttributeParser(item).parse(attributes); new PredicateRangeAttributeParser(item).parse(rangeAttributes); - QueryTreeUtil.andQueryItemWithRoot(query, item); + query.getModel().getQueryTree().and(item); } static public class PredicateValueAttributeParser extends BooleanAttributeParser { diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/QueryTreeUtil.java b/container-search/src/main/java/com/yahoo/search/querytransform/QueryTreeUtil.java index e4841ae6bd1..759c8ba1ee4 100644 --- a/container-search/src/main/java/com/yahoo/search/querytransform/QueryTreeUtil.java +++ b/container-search/src/main/java/com/yahoo/search/querytransform/QueryTreeUtil.java @@ -3,6 +3,7 @@ package com.yahoo.search.querytransform; import com.yahoo.prelude.query.AndItem; import com.yahoo.prelude.query.Item; +import com.yahoo.prelude.query.QueryCanonicalizer; import com.yahoo.search.Query; import com.yahoo.search.query.QueryTree; @@ -10,27 +11,27 @@ import com.yahoo.search.query.QueryTree; * Utility class for manipulating a QueryTree. * * @author geirst + * @deprecated use QueryTree.and instead // TODO: Remove on Vespa 8 */ +@Deprecated public class QueryTreeUtil { - static public void andQueryItemWithRoot(Query query, Item item) { - andQueryItemWithRoot(query.getModel().getQueryTree(), item); + /** + * Adds the given item to this query + * + * @return the new root of the query tree + */ + static public Item andQueryItemWithRoot(Query query, Item item) { + return andQueryItemWithRoot(query.getModel().getQueryTree(), item); } - static public void andQueryItemWithRoot(QueryTree tree, Item item) { - if (tree.isEmpty()) { - tree.setRoot(item); - } else { - Item oldRoot = tree.getRoot(); - if (oldRoot.getClass() == AndItem.class) { - ((AndItem) oldRoot).addItem(item); - } else { - AndItem newRoot = new AndItem(); - newRoot.addItem(oldRoot); - newRoot.addItem(item); - tree.setRoot(newRoot); - } - } + /** + * Adds the given item to this query + * + * @return the new root of the query tree + */ + static public Item andQueryItemWithRoot(QueryTree tree, Item item) { + return tree.and(item); } } diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/WandSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/WandSearcher.java index cda41f5f62e..0b1387a16a2 100644 --- a/container-search/src/main/java/com/yahoo/search/querytransform/WandSearcher.java +++ b/container-search/src/main/java/com/yahoo/search/querytransform/WandSearcher.java @@ -15,7 +15,6 @@ import com.yahoo.text.MapParser; import java.util.LinkedHashMap; import java.util.Map; -import static com.yahoo.container.protect.Error.UNSPECIFIED; import com.yahoo.yolean.Exceptions; /** @@ -147,7 +146,7 @@ public class WandSearcher extends Searcher { InputResolver inputs = new InputResolver(query, execution); if ( ! inputs.hasValidData()) return execution.search(query); - QueryTreeUtil.andQueryItemWithRoot(query, createWandQueryItem(inputs)); + query.getModel().getQueryTree().and(createWandQueryItem(inputs)); query.trace("WandSearcher: Added WAND operator", true, 4); return execution.search(query); } diff --git a/container-search/src/test/java/com/yahoo/search/query/QueryTreeTest.java b/container-search/src/test/java/com/yahoo/search/query/QueryTreeTest.java new file mode 100644 index 00000000000..f929e54fd2d --- /dev/null +++ b/container-search/src/test/java/com/yahoo/search/query/QueryTreeTest.java @@ -0,0 +1,26 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.search.query; + +import com.yahoo.prelude.query.NotItem; +import com.yahoo.prelude.query.WordItem; +import org.junit.Assert; +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +/** + * @author bratseth + */ +public class QueryTreeTest { + + @Test + public void testAddQueryItemWithRoot() { + Assert.assertEquals("AND a b", + new QueryTree(new WordItem("a")).and(new WordItem("b")).toString()); + + NotItem not = new NotItem(); + not.addNegativeItem(new WordItem("b")); + assertEquals("+a -b", + new QueryTree(new WordItem("a")).and(not).toString()); + } + +} diff --git a/container-search/src/test/java/com/yahoo/search/querytransform/TestUtils.java b/container-search/src/test/java/com/yahoo/search/querytransform/TestUtils.java index c7a44e8aceb..720dcd0c4bc 100644 --- a/container-search/src/test/java/com/yahoo/search/querytransform/TestUtils.java +++ b/container-search/src/test/java/com/yahoo/search/querytransform/TestUtils.java @@ -6,7 +6,9 @@ import com.yahoo.prelude.query.Item; import com.yahoo.search.Result; public class TestUtils { + public static Item getQueryTreeRoot(Result result) { return result.getQuery().getModel().getQueryTree().getRoot(); } + } diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java index 8209e5d3568..23bf8514b9c 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java @@ -15,6 +15,7 @@ import java.util.Set; * When creating a new API, its paths must be added here and a policy must be declared in {@link Policy}. * * @author mpolden + * @author jonmv */ public enum PathGroup { @@ -32,29 +33,35 @@ public enum PathGroup { /** Paths used for creating tenants with proper access control. */ tenant(Matcher.tenant, + Optional.of("/api"), "/application/v4/tenant/{tenant}"), /** Paths used for user management on the tenant level. */ tenantUsers(Matcher.tenant, + Optional.of("/api"), "/user/v1/tenant/{tenant}"), /** Paths used by tenant administrators. */ tenantInfo(Matcher.tenant, + Optional.of("/api"), "/application/v4/tenant/{tenant}/application/"), /** Path for the base application resource. */ application(Matcher.tenant, Matcher.application, + Optional.of("/api"), "/application/v4/tenant/{tenant}/application/{application}"), /** Paths used for user management on the application level. */ applicationUsers(Matcher.tenant, Matcher.application, + Optional.of("/api"), "/user/v1/tenant/{tenant}/application/{application}"), /** Paths used by application administrators. */ applicationInfo(Matcher.tenant, Matcher.application, + Optional.of("/api"), "/application/v4/tenant/{tenant}/application/{application}/deploying/{*}", "/application/v4/tenant/{tenant}/application/{application}/instance/{*}", "/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/nodes", @@ -66,10 +73,12 @@ public enum PathGroup { /** Path used to restart application nodes. */ // TODO move to the above when everyone is on new pipeline. applicationRestart(Matcher.tenant, Matcher.application, + Optional.of("/api"), "/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{ignored}/restart"), /** Paths used for development deployments. */ developmentDeployment(Matcher.tenant, Matcher.application, + Optional.of("/api"), "/application/v4/tenant/{tenant}/application/{application}/environment/dev/region/{region}/instance/{instance}", "/application/v4/tenant/{tenant}/application/{application}/environment/dev/region/{region}/instance/{instance}/deploy", "/application/v4/tenant/{tenant}/application/{application}/environment/perf/region/{region}/instance/{instance}", @@ -78,6 +87,7 @@ public enum PathGroup { /** Paths used for production deployments. */ productionDeployment(Matcher.tenant, Matcher.application, + Optional.of("/api"), "/application/v4/tenant/{tenant}/application/{application}/environment/prod/region/{region}/instance/{instance}", "/application/v4/tenant/{tenant}/application/{application}/environment/prod/region/{region}/instance/{instance}/deploy", "/application/v4/tenant/{tenant}/application/{application}/environment/test/region/{region}/instance/{instance}", @@ -88,21 +98,26 @@ public enum PathGroup { /** Paths used for continuous deployment to production. */ submission(Matcher.tenant, Matcher.application, + Optional.of("/api"), "/application/v4/tenant/{tenant}/application/{application}/submit"), /** Paths used for other tasks by build services. */ // TODO: This will vanish. buildService(Matcher.tenant, Matcher.application, + Optional.of("/api"), "/application/v4/tenant/{tenant}/application/{application}/jobreport", "/application/v4/tenant/{tenant}/application/{application}/promote", "/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/promote"), + /** Paths which contain (not very strictly) classified information about customers. */ + classifiedTenantInfo(Optional.of("/api"), + "/application/v4/", + "/application/v4/tenant/"), + /** Paths which contain (not very strictly) classified information about, e.g., customers. */ classifiedInfo("/athenz/v1/{*}", "/cost/v1/{*}", "/deployment/v1/{*}", - "/application/v4/", - "/application/v4/tenant/", "/", "/d/{*}", "/statuspage/v1/{*}"), @@ -112,30 +127,43 @@ public enum PathGroup { "/zone/v1/{*}"); final List<String> pathSpecs; + final String prefix; final List<Matcher> matchers; PathGroup(String... pathSpecs) { - this(List.of(), List.of(pathSpecs)); + this(List.of(), Optional.empty(), List.of(pathSpecs)); + } + + PathGroup(Optional<String> prefix, String... pathSpecs) { + this(List.of(), prefix, List.of(pathSpecs)); } PathGroup(Matcher first, String... pathSpecs) { - this(List.of(first), List.of(pathSpecs)); + this(List.of(first), Optional.empty(), List.of(pathSpecs)); + } + + PathGroup(Matcher first, Optional<String> prefix, String... pathSpecs) { + this(List.of(first), prefix, List.of(pathSpecs)); } PathGroup(Matcher first, Matcher second, String... pathSpecs) { - this(List.of(first, second), List.of(pathSpecs)); + this(List.of(first, second), Optional.empty(), List.of(pathSpecs)); + } + + PathGroup(Matcher first, Matcher second, Optional<String> prefix, String... pathSpecs) { + this(List.of(first, second), prefix, List.of(pathSpecs)); } /** Creates a new path group, if the given context matchers are each present exactly once in each of the given specs. */ - PathGroup(List<Matcher> matchers, List<String> pathSpecs) { + PathGroup(List<Matcher> matchers, Optional<String> prefix, List<String> pathSpecs) { this.matchers = matchers; + this.prefix = prefix.orElse(""); this.pathSpecs = pathSpecs; } /** Returns path if it matches any spec in this group, with match groups set by the match. */ - @SuppressWarnings("deprecation") private Optional<Path> get(URI uri) { - Path matcher = new Path(uri); // TODO Get URI down here. + Path matcher = new Path(uri, prefix); for (String spec : pathSpecs) // Iterate to be sure the Path's state is that of the match. if (matcher.matches(spec)) return Optional.of(matcher); return Optional.empty(); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index 1bfd75bae6e..b48c8723d44 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -133,12 +133,13 @@ public class ApplicationApiHandler extends LoggingRequestHandler { @Override public HttpResponse handle(HttpRequest request) { try { + Path path = new Path(request.getUri(), OPTIONAL_PREFIX); switch (request.getMethod()) { - case GET: return handleGET(request); - case PUT: return handlePUT(request); - case POST: return handlePOST(request); - case PATCH: return handlePATCH(request); - case DELETE: return handleDELETE(request); + case GET: return handleGET(path, request); + case PUT: return handlePUT(path, request); + case POST: return handlePOST(path, request); + case PATCH: return handlePATCH(path, request); + case DELETE: return handleDELETE(path, request); case OPTIONS: return handleOPTIONS(); default: return ErrorResponse.methodNotAllowed("Method '" + request.getMethod() + "' is not supported"); } @@ -164,8 +165,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { } } - private HttpResponse handleGET(HttpRequest request) { - Path path = new Path(request.getUri(), OPTIONAL_PREFIX); + private HttpResponse handleGET(Path path, HttpRequest request) { if (path.matches("/application/v4/")) return root(request); if (path.matches("/application/v4/user")) return authenticatedUser(request); if (path.matches("/application/v4/tenant")) return tenants(request); @@ -188,8 +188,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { return ErrorResponse.notFoundError("Nothing at " + path); } - private HttpResponse handlePUT(HttpRequest request) { - Path path = new Path(request.getUri(), OPTIONAL_PREFIX); + private HttpResponse handlePUT(Path path, HttpRequest request) { if (path.matches("/application/v4/user")) return createUser(request); if (path.matches("/application/v4/tenant/{tenant}")) return updateTenant(path.get("tenant"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/global-rotation/override")) @@ -197,8 +196,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { return ErrorResponse.notFoundError("Nothing at " + path); } - private HttpResponse handlePOST(HttpRequest request) { - Path path = new Path(request.getUri(), OPTIONAL_PREFIX); + private HttpResponse handlePOST(Path path, HttpRequest request) { if (path.matches("/application/v4/tenant/{tenant}")) return createTenant(path.get("tenant"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) return createApplication(path.get("tenant"), path.get("application"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/promote")) return promoteApplication(path.get("tenant"), path.get("application"), request); @@ -216,15 +214,13 @@ public class ApplicationApiHandler extends LoggingRequestHandler { return ErrorResponse.notFoundError("Nothing at " + path); } - private HttpResponse handlePATCH(HttpRequest request) { - Path path = new Path(request.getUri(), OPTIONAL_PREFIX); + private HttpResponse handlePATCH(Path path, HttpRequest request) { if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) return setMajorVersion(path.get("tenant"), path.get("application"), request); return ErrorResponse.notFoundError("Nothing at " + path); } - private HttpResponse handleDELETE(HttpRequest request) { - Path path = new Path(request.getUri(), OPTIONAL_PREFIX); + private HttpResponse handleDELETE(Path path, HttpRequest request) { if (path.matches("/application/v4/tenant/{tenant}")) return deleteTenant(path.get("tenant"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) return deleteApplication(path.get("tenant"), path.get("application"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/deploying")) return cancelDeploy(path.get("tenant"), path.get("application"), "all"); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/user/UserApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/user/UserApiHandler.java index 03ffdbb0208..f5532a964fd 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/user/UserApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/user/UserApiHandler.java @@ -42,6 +42,7 @@ import java.util.logging.Logger; public class UserApiHandler extends LoggingRequestHandler { private final static Logger log = Logger.getLogger(UserApiHandler.class.getName()); + private static final String optionalPrefix = "/api"; private final UserRoles roles; private final UserManagement users; @@ -56,10 +57,11 @@ public class UserApiHandler extends LoggingRequestHandler { @Override public HttpResponse handle(HttpRequest request) { try { + Path path = new Path(request.getUri(), optionalPrefix); switch (request.getMethod()) { - case GET: return handleGET(request); - case POST: return handlePOST(request); - case DELETE: return handleDELETE(request); + case GET: return handleGET(path, request); + case POST: return handlePOST(path, request); + case DELETE: return handleDELETE(path, request); case OPTIONS: return handleOPTIONS(); default: return ErrorResponse.methodNotAllowed("Method '" + request.getMethod() + "' is not supported"); } @@ -73,8 +75,7 @@ public class UserApiHandler extends LoggingRequestHandler { } } - private HttpResponse handleGET(HttpRequest request) { - Path path = new Path(request.getUri()); + private HttpResponse handleGET(Path path, HttpRequest request) { if (path.matches("/user/v1/tenant/{tenant}")) return listTenantRoleMembers(path.get("tenant")); if (path.matches("/user/v1/tenant/{tenant}/application/{application}")) return listApplicationRoleMembers(path.get("tenant"), path.get("application")); @@ -82,8 +83,7 @@ public class UserApiHandler extends LoggingRequestHandler { request.getUri().getPath())); } - private HttpResponse handlePOST(HttpRequest request) { - Path path = new Path(request.getUri()); + private HttpResponse handlePOST(Path path, HttpRequest request) { if (path.matches("/user/v1/tenant/{tenant}")) return addTenantRoleMember(path.get("tenant"), request); if (path.matches("/user/v1/tenant/{tenant}/application/{application}")) return addApplicationRoleMember(path.get("tenant"), path.get("application"), request); @@ -91,8 +91,7 @@ public class UserApiHandler extends LoggingRequestHandler { request.getUri().getPath())); } - private HttpResponse handleDELETE(HttpRequest request) { - Path path = new Path(request.getUri()); + private HttpResponse handleDELETE(Path path, HttpRequest request) { if (path.matches("/user/v1/tenant/{tenant}")) return removeTenantRoleMember(path.get("tenant"), request); if (path.matches("/user/v1/tenant/{tenant}/application/{application}")) return removeApplicationRoleMember(path.get("tenant"), path.get("application"), request); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerCloudTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerCloudTest.java index caa44b033af..95477758deb 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerCloudTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerCloudTest.java @@ -24,14 +24,20 @@ public class ControllerContainerCloudTest extends ControllerContainerTest { } @Override - protected String securityXml() { + protected String variablePartXml() { return " <component id='com.yahoo.vespa.hosted.controller.security.CloudAccessControlRequests'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.security.CloudAccessControl'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.api.integration.stubs.MockUserManagement'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.api.integration.stubs.MockMarketplace'/>\n" + + " <handler id='com.yahoo.vespa.hosted.controller.restapi.application.ApplicationApiHandler'>\n" + + " <binding>http://*/application/v4/*</binding>\n" + + " <binding>http://*/api/application/v4/*</binding>\n" + + " </handler>\n" + + " <handler id='com.yahoo.vespa.hosted.controller.restapi.user.UserApiHandler'>\n" + " <binding>http://*/user/v1/*</binding>\n" + + " <binding>http://*/api/user/v1/*</binding>\n" + " </handler>\n" + " <http>\n" + diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java index 716cf622e76..6abfa7fa72d 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/ControllerContainerTest.java @@ -97,9 +97,6 @@ public class ControllerContainerTest { " <component id='com.yahoo.vespa.hosted.controller.api.integration.stubs.MockTesterCloud'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.api.integration.stubs.MockMailer'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.api.role.Roles'/>\n" + - " <handler id='com.yahoo.vespa.hosted.controller.restapi.application.ApplicationApiHandler'>\n" + - " <binding>http://*/application/v4/*</binding>\n" + - " </handler>\n" + " <handler id='com.yahoo.vespa.hosted.controller.restapi.deployment.DeploymentApiHandler'>\n" + " <binding>http://*/deployment/v1/*</binding>\n" + " </handler>\n" + @@ -123,7 +120,7 @@ public class ControllerContainerTest { " <binding>http://*/zone/v2</binding>\n" + " <binding>http://*/zone/v2/*</binding>\n" + " </handler>\n" + - securityXml() + + variablePartXml() + "</jdisc>"; } @@ -131,10 +128,13 @@ public class ControllerContainerTest { return SystemName.main; } - protected String securityXml() { + protected String variablePartXml() { return " <component id='com.yahoo.vespa.hosted.controller.security.AthenzAccessControlRequests'/>\n" + " <component id='com.yahoo.vespa.hosted.controller.athenz.impl.AthenzFacade'/>\n" + + " <handler id='com.yahoo.vespa.hosted.controller.restapi.application.ApplicationApiHandler'>\n" + + " <binding>http://*/application/v4/*</binding>\n" + + " </handler>\n" + " <handler id='com.yahoo.vespa.hosted.controller.restapi.athenz.AthenzApiHandler'>\n" + " <binding>http://*/athenz/v1/*</binding>\n" + " </handler>\n" + diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/user/UserApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/user/UserApiTest.java index caf0ec82aae..3a78e9fc262 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/user/UserApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/user/UserApiTest.java @@ -42,6 +42,11 @@ public class UserApiTest extends ControllerContainerCloudTest { .roles(operator), "[]"); + // GET at application/v4/tenant is available also under the /api prefix. + tester.assertResponse(request("/api/application/v4/tenant") + .roles(operator), + "[]"); + // POST a tenant is not available to everyone. tester.assertResponse(request("/application/v4/tenant/my-tenant", POST) .data("{\"token\":\"hello\"}"), @@ -120,6 +125,11 @@ public class UserApiTest extends ControllerContainerCloudTest { .roles(Set.of(roles.tenantOperator(id.tenant()))), new File("application-roles.json")); + // GET application role information is available also under the /api prefix. + tester.assertResponse(request("/api/user/v1/tenant/my-tenant/application/my-app") + .roles(Set.of(roles.tenantOperator(id.tenant()))), + new File("application-roles.json")); + // DELETE an application role is allowed for an application admin. tester.assertResponse(request("/user/v1/tenant/my-tenant/application/my-app", DELETE) .roles(Set.of(roles.applicationAdmin(id.tenant(), id.application()))) diff --git a/docproc/src/main/java/com/yahoo/docproc/jdisc/DocumentProcessingHandler.java b/docproc/src/main/java/com/yahoo/docproc/jdisc/DocumentProcessingHandler.java index 07efd419c97..ec74fb9246d 100644 --- a/docproc/src/main/java/com/yahoo/docproc/jdisc/DocumentProcessingHandler.java +++ b/docproc/src/main/java/com/yahoo/docproc/jdisc/DocumentProcessingHandler.java @@ -31,7 +31,13 @@ import com.yahoo.processing.execution.chain.ChainRegistry; import com.yahoo.statistics.Statistics; import java.util.TimerTask; -import java.util.concurrent.*; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.PriorityBlockingQueue; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.TimeUnit; import java.util.logging.Logger; import static com.yahoo.component.chain.ChainsConfigurer.prepareChainRegistry; @@ -203,8 +209,7 @@ public class DocumentProcessingHandler extends AbstractRequestHandler { return null; } - @SuppressWarnings("unchecked") - void submit(DocumentProcessingTask task) { + private void submit(DocumentProcessingTask task) { if (threadPool.isAboveLimit()) { task.queueFull(); } else { diff --git a/docproc/src/main/java/com/yahoo/docproc/jdisc/DocumentProcessingTask.java b/docproc/src/main/java/com/yahoo/docproc/jdisc/DocumentProcessingTask.java index 0bc95fe6c7b..ca4648678a5 100644 --- a/docproc/src/main/java/com/yahoo/docproc/jdisc/DocumentProcessingTask.java +++ b/docproc/src/main/java/com/yahoo/docproc/jdisc/DocumentProcessingTask.java @@ -17,8 +17,6 @@ import java.io.StringWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Objects; -import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; import java.util.logging.Logger; @@ -34,7 +32,6 @@ public class DocumentProcessingTask implements Comparable<DocumentProcessingTask private final DocumentProcessingHandler docprocHandler; private RequestContext requestContext; - private int waitCounter; private final static AtomicLong seq = new AtomicLong(); private final long seqNum; @@ -45,7 +42,6 @@ public class DocumentProcessingTask implements Comparable<DocumentProcessingTask seqNum = seq.getAndIncrement(); this.requestContext = requestContext; this.docprocHandler = docprocHandler; - this.waitCounter = 10; this.service = service; } @@ -80,18 +76,6 @@ public class DocumentProcessingTask implements Comparable<DocumentProcessingTask } /** - * Used by DocprocThreadManager. If a ProcessingTask has been taken by a thread, it can wait() no longer than - * waitCounter (currently 10) times before being executed. This is to prevent large tasks from being delayed - * forever. - * - * @return true if this task can wait, false if it must run NOW. - */ - boolean doWait() { - --waitCounter; - return (waitCounter > 0); - } - - /** * Processes a single Processing, and fails the message if this processing fails. * * @param executor the DocprocService to use for processing diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/MessageBusDocumentAccess.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/MessageBusDocumentAccess.java index edb426c6392..ff891dbb298 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/MessageBusDocumentAccess.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/MessageBusDocumentAccess.java @@ -1,18 +1,22 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.documentapi.messagebus; -import com.yahoo.concurrent.DaemonThreadFactory; import com.yahoo.concurrent.ThreadFactoryFactory; import com.yahoo.document.select.parser.ParseException; -import com.yahoo.documentapi.*; +import com.yahoo.documentapi.AsyncParameters; +import com.yahoo.documentapi.DocumentAccess; +import com.yahoo.documentapi.DocumentAccessException; +import com.yahoo.documentapi.SubscriptionParameters; +import com.yahoo.documentapi.SubscriptionSession; +import com.yahoo.documentapi.SyncParameters; +import com.yahoo.documentapi.VisitorDestinationParameters; +import com.yahoo.documentapi.VisitorParameters; import com.yahoo.documentapi.messagebus.protocol.DocumentProtocol; import com.yahoo.messagebus.MessageBus; import com.yahoo.messagebus.NetworkMessageBus; import com.yahoo.messagebus.RPCMessageBus; import com.yahoo.messagebus.network.Network; import com.yahoo.messagebus.network.local.LocalNetwork; -import com.yahoo.messagebus.network.local.LocalWire; -import com.yahoo.messagebus.routing.RoutingTable; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/loadtypes/LoadTypeSet.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/loadtypes/LoadTypeSet.java index 6bd5d658509..0c40f527287 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/loadtypes/LoadTypeSet.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/loadtypes/LoadTypeSet.java @@ -2,7 +2,6 @@ package com.yahoo.documentapi.messagebus.loadtypes; import com.yahoo.config.subscription.ConfigGetter; -import com.yahoo.config.subscription.ConfigSubscriber; import com.yahoo.vespa.config.content.LoadTypeConfig; import com.yahoo.documentapi.messagebus.protocol.DocumentProtocol; import java.security.MessageDigest; diff --git a/jdisc_messagebus_service/src/main/java/com/yahoo/messagebus/shared/SharedMessageBus.java b/jdisc_messagebus_service/src/main/java/com/yahoo/messagebus/shared/SharedMessageBus.java index d36457cf42d..704a73710cf 100644 --- a/jdisc_messagebus_service/src/main/java/com/yahoo/messagebus/shared/SharedMessageBus.java +++ b/jdisc_messagebus_service/src/main/java/com/yahoo/messagebus/shared/SharedMessageBus.java @@ -4,7 +4,11 @@ package com.yahoo.messagebus.shared; import com.yahoo.config.subscription.ConfigGetter; import com.yahoo.jdisc.AbstractResource; import com.yahoo.log.LogLevel; -import com.yahoo.messagebus.*; +import com.yahoo.messagebus.DestinationSessionParams; +import com.yahoo.messagebus.IntermediateSessionParams; +import com.yahoo.messagebus.MessageBus; +import com.yahoo.messagebus.MessageBusParams; +import com.yahoo.messagebus.SourceSessionParams; import com.yahoo.messagebus.network.Network; import com.yahoo.messagebus.network.rpc.RPCNetwork; import com.yahoo.messagebus.network.rpc.RPCNetworkParams; diff --git a/logd/src/logd/config_subscriber.cpp b/logd/src/logd/config_subscriber.cpp index 4a5bfc8bcb9..ce29c808742 100644 --- a/logd/src/logd/config_subscriber.cpp +++ b/logd/src/logd/config_subscriber.cpp @@ -141,7 +141,7 @@ ConfigSubscriber::make_forwarder(Metrics& metrics) result = LegacyForwarder::to_logserver(metrics, _forward_filter, _logserver_host, _logserver_port); } } else { - LegacyForwarder::to_dev_null(metrics); + result = LegacyForwarder::to_dev_null(metrics); } _need_new_forwarder = false; return result; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java index 7fdd9a168c8..3b5f9d91725 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java @@ -180,7 +180,7 @@ public class NodeRepositoryMaintenance extends AbstractComponent { private final NodeFailer.ThrottlePolicy throttlePolicy; DefaultTimes(Zone zone) { - failGrace = Duration.ofMinutes(60); + failGrace = Duration.ofMinutes(30); periodicRedeployInterval = Duration.ofMinutes(30); // Don't redeploy in test environments redeployMaintainerInterval = zone.environment().isTest() ? Duration.ofDays(1) : Duration.ofMinutes(1); diff --git a/searchlib/abi-spec.json b/searchlib/abi-spec.json index b8c51f4e33d..0b9cb06d2a5 100644 --- a/searchlib/abi-spec.json +++ b/searchlib/abi-spec.json @@ -1382,7 +1382,7 @@ "public void <init>(java.util.Map)", "public void <init>(java.util.Map, java.util.Map)", "public com.yahoo.searchlib.rankingexpression.ExpressionFunction getFunction(java.lang.String)", - "protected java.util.Map functions()", + "protected final com.google.common.collect.ImmutableMap functions()", "public java.lang.String getBinding(java.lang.String)", "public com.yahoo.searchlib.rankingexpression.rule.FunctionReferenceContext withBindings(java.util.Map)" ], diff --git a/searchlib/src/main/java/com/yahoo/searchlib/ranking/features/fieldmatch/FieldMatchMetrics.java b/searchlib/src/main/java/com/yahoo/searchlib/ranking/features/fieldmatch/FieldMatchMetrics.java index d880294660e..200e4fbe856 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/ranking/features/fieldmatch/FieldMatchMetrics.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/ranking/features/fieldmatch/FieldMatchMetrics.java @@ -19,9 +19,9 @@ public final class FieldMatchMetrics implements Cloneable { private FieldMatchMetricsComputer source; /** The trace accumulated during execution - empty if no tracing */ - private final Trace trace=new Trace(); + private final Trace trace = new Trace(); - private boolean complete=false; + private boolean complete; // Metrics private int outOfOrder; @@ -352,7 +352,7 @@ public final class FieldMatchMetrics implements Cloneable { * </p> * * - * <p>Weight and significance are not taken into account because this is mean to capture tha quality of the + * <p>Weight and significance are not taken into account because this is meant to capture tha quality of the * match in this field, while those measures relate this match to matches in other fields. This number * can be multiplied with those values when combining with other field match scores.</p> */ diff --git a/searchlib/src/main/java/com/yahoo/searchlib/ranking/features/fieldmatch/FieldMatchMetricsComputer.java b/searchlib/src/main/java/com/yahoo/searchlib/ranking/features/fieldmatch/FieldMatchMetricsComputer.java index 79886449d0a..f981ad464ec 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/ranking/features/fieldmatch/FieldMatchMetricsComputer.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/ranking/features/fieldmatch/FieldMatchMetricsComputer.java @@ -136,7 +136,7 @@ public final class FieldMatchMetricsComputer { // Explore segmentations while (segmentStartPoint!=null) { - metrics =segmentStartPoint.getMetrics().clone(); + metrics = segmentStartPoint.getMetrics().clone(); if (collectTrace) metrics.trace().add("\nLooking for segment from " + segmentStartPoint + "..." + "\n"); boolean found=findAlternativeSegmentFrom(segmentStartPoint); @@ -148,7 +148,7 @@ public final class FieldMatchMetricsComputer { segmentStartPoint=findOpenSegment(segmentStartPoint.getI()); } - metrics=findLastStartPoint().getMetrics(); // these metrics are the final set + metrics = findLastStartPoint().getMetrics(); // these metrics are the final set setOccurrenceCounts(metrics); metrics.onComplete(); metrics.setComplete(true); diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionReferenceContext.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionReferenceContext.java index ed1e2838717..084bfe65e06 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionReferenceContext.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/FunctionReferenceContext.java @@ -61,7 +61,7 @@ public class FunctionReferenceContext { */ public ExpressionFunction getFunction(String name) { return functions.get(name); } - protected Map<String, ExpressionFunction> functions() { return functions; } + protected final ImmutableMap<String, ExpressionFunction> functions() { return functions; } /** Returns the resolution of an argument, or null if it isn't defined in this context */ public String getBinding(String name) { return bindings.get(name); } diff --git a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SerializationContext.java b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SerializationContext.java index 0b68e71c21a..4acc1a85490 100644 --- a/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SerializationContext.java +++ b/searchlib/src/main/java/com/yahoo/searchlib/rankingexpression/rule/SerializationContext.java @@ -3,12 +3,10 @@ package com.yahoo.searchlib.rankingexpression.rule; import com.google.common.collect.ImmutableMap; import com.yahoo.searchlib.rankingexpression.ExpressionFunction; -import com.yahoo.searchlib.rankingexpression.RankingExpression; import com.yahoo.tensor.TensorType; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -95,7 +93,7 @@ public class SerializationContext extends FunctionReferenceContext { @Override public SerializationContext withBindings(Map<String, String> bindings) { - return new SerializationContext(functions().values(), bindings, this.serializedFunctions); + return new SerializationContext(functions(), bindings, this.serializedFunctions); } public Map<String, String> serializedFunctions() { return serializedFunctions; } diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/config/ConnectionParams.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/config/ConnectionParams.java index 3296cf13875..bd187ea3371 100644 --- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/config/ConnectionParams.java +++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/config/ConnectionParams.java @@ -36,7 +36,7 @@ public final class ConnectionParams { private long connectionTimeout = TimeUnit.SECONDS.toMillis(60); private final Multimap<String, String> headers = ArrayListMultimap.create(); private final Map<String, HeaderProvider> headerProviders = new HashMap<>(); - private int numPersistentConnectionsPerEndpoint = 8; + private int numPersistentConnectionsPerEndpoint = 1; private String proxyHost = null; private int proxyPort = 8080; private boolean useCompression = false; diff --git a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/runner/CommandLineArguments.java b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/runner/CommandLineArguments.java index 98cd13a226d..4eaedb53c5b 100644 --- a/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/runner/CommandLineArguments.java +++ b/vespa-http-client/src/main/java/com/yahoo/vespa/http/client/runner/CommandLineArguments.java @@ -169,7 +169,7 @@ public class CommandLineArguments { @Option(name = {"--numPersistentConnectionsPerEndpoint"}, description = "How many tcp connections to establish per endoint.)") - private int numPersistentConnectionsPerEndpoint = 16; + private int numPersistentConnectionsPerEndpoint = 1; @Option(name = {"--maxChunkSizeBytes"}, description = "How much data to send to gateway in each message.") @@ -226,7 +226,6 @@ public class CommandLineArguments { connectionParamsBuilder .setHostnameVerifier(insecure ? NoopHostnameVerifier.INSTANCE : SSLConnectionSocketFactory.getDefaultHostnameVerifier()) - .setNumPersistentConnectionsPerEndpoint(16) .setUseCompression(useCompressionArg) .setMaxRetries(noRetryArg ? 0 : 100) .setMinTimeBetweenRetries(retrydelayArg, TimeUnit.SECONDS) diff --git a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/config/ConnectionParamsTest.java b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/config/ConnectionParamsTest.java index 39c1257816c..bca43902b9e 100644 --- a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/config/ConnectionParamsTest.java +++ b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/config/ConnectionParamsTest.java @@ -25,7 +25,7 @@ public class ConnectionParamsTest { ConnectionParams params = new ConnectionParams.Builder().build(); assertThat(params.getHeaders().isEmpty(), is(true)); - assertThat(params.getNumPersistentConnectionsPerEndpoint(), is(8)); + assertThat(params.getNumPersistentConnectionsPerEndpoint(), is(1)); assertThat(params.getSslContext(), nullValue()); } diff --git a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/runner/CommandLineArgumentsTest.java b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/runner/CommandLineArgumentsTest.java index 53715259a0c..407c95e5822 100644 --- a/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/runner/CommandLineArgumentsTest.java +++ b/vespa-http-client/src/test/java/com/yahoo/vespa/http/client/runner/CommandLineArgumentsTest.java @@ -91,7 +91,7 @@ public class CommandLineArgumentsTest { assertThat(params.getClusters().get(0).getEndpoints().get(0).getPort(), is(4080)); assertThat(params.getClusters().get(0).getEndpoints().get(0).isUseSsl(), is(false)); assertThat(params.getConnectionParams().getUseCompression(), is(false)); - assertThat(params.getConnectionParams().getNumPersistentConnectionsPerEndpoint(), is(16)); + assertThat(params.getConnectionParams().getNumPersistentConnectionsPerEndpoint(), is(1)); assertThat(params.getFeedParams().getRoute(), is("default")); assertThat(params.getFeedParams().getDataFormat(), is(FeedParams.DataFormat.XML_UTF8)); assertThat(params.getFeedParams().getLocalQueueTimeOut(), is(180000L)); diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java index 2b12c7cd78c..bfc4a611a5e 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/OperationHandlerImpl.java @@ -25,7 +25,6 @@ import com.yahoo.messagebus.StaticThrottlePolicy; import com.yahoo.metrics.simple.MetricReceiver; import com.yahoo.vdslib.VisitorOrdering; import com.yahoo.vespaclient.ClusterDef; -import com.yahoo.vespaclient.ClusterList; import com.yahoo.vespaxmlparser.VespaXMLFeedReader; import com.yahoo.yolean.concurrent.ConcurrentResourcePool; import com.yahoo.yolean.concurrent.ResourceFactory; |