Repository: lens Updated Branches: refs/heads/master 478d6d8a1 -> 1774ced2e
LENS-661: Added Weighted driver selector Project: http://git-wip-us.apache.org/repos/asf/lens/repo Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/1774ced2 Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/1774ced2 Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/1774ced2 Branch: refs/heads/master Commit: 1774ced2e49d4ffa8f68f1493c1e9a26fc2e119c Parents: 478d6d8 Author: Anshul Gupta <[email protected]> Authored: Tue May 31 20:13:37 2016 +0530 Committer: Rajat Khandelwal <[email protected]> Committed: Tue May 31 20:13:37 2016 +0530 ---------------------------------------------------------------------- .../lens/driver/cube/TestMinCostSelector.java | 116 -------- .../lens/server/api/LensConfConstants.java | 15 + .../driver/WeightedQueryCostDriverSelector.java | 101 +++++++ .../server/api/driver/TestMinCostSelector.java | 104 +++++++ .../api/driver/TestWeightedCostSelector.java | 288 +++++++++++++++++++ src/site/apt/admin/jdbcdriver-config.apt | 3 +- 6 files changed, 510 insertions(+), 117 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lens/blob/1774ced2/lens-cube/src/test/java/org/apache/lens/driver/cube/TestMinCostSelector.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/driver/cube/TestMinCostSelector.java b/lens-cube/src/test/java/org/apache/lens/driver/cube/TestMinCostSelector.java deleted file mode 100644 index 8267229..0000000 --- a/lens-cube/src/test/java/org/apache/lens/driver/cube/TestMinCostSelector.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 - * - * http://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 org.apache.lens.driver.cube; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.lens.api.LensConf; -import org.apache.lens.server.api.driver.LensDriver; -import org.apache.lens.server.api.driver.MinQueryCostSelector; -import org.apache.lens.server.api.driver.MockDriver; -import org.apache.lens.server.api.driver.MockFailDriver; -import org.apache.lens.server.api.error.LensException; -import org.apache.lens.server.api.query.MockQueryContext; - -import org.apache.hadoop.conf.Configuration; - -import org.testng.Assert; -import org.testng.annotations.Test; - -/** - * The Class TestMinCostSelector. - */ -public class TestMinCostSelector { - - private MockQueryContext createMockContext(String query, Configuration conf, LensConf lensConf, - Map<LensDriver, String> driverQueries) throws LensException { - MockQueryContext ctx = new MockQueryContext(query, lensConf, conf, driverQueries.keySet()); - ctx.setDriverQueries(driverQueries); - ctx.estimateCostForDrivers(); - return ctx; - } - - private MockQueryContext createMockContext(String query, Configuration conf, LensConf lensConf, - List<LensDriver> drivers, Map<LensDriver, String> driverQueries) throws LensException { - MockQueryContext ctx = new MockQueryContext(query, lensConf, conf, driverQueries.keySet()); - ctx.setDriverQueries(driverQueries); - ctx.estimateCostForDrivers(); - return ctx; - } - - @Test - public void testMinCostSelector() throws LensException { - MinQueryCostSelector selector = new MinQueryCostSelector(); - List<LensDriver> drivers = new ArrayList<LensDriver>(); - Map<LensDriver, String> driverQueries = new HashMap<LensDriver, String>(); - Configuration conf = new Configuration(); - LensConf qconf = new LensConf(); - - MockDriver d1 = new MockDriver(); - d1.configure(conf, null, null); - MockDriver d2 = new MockDriver(); - d2.configure(conf, null, null); - MockFailDriver fd1 = new MockFailDriver(); - fd1.configure(conf, null, null); - MockFailDriver fd2 = new MockFailDriver(); - fd2.configure(conf, null, null); - - drivers.add(d1); - drivers.add(d2); - String query = "test query"; - driverQueries.put(d1, query); - - MockQueryContext ctx = createMockContext(query, conf, qconf, driverQueries); - LensDriver selected = selector.select(ctx, conf); - - Assert.assertEquals(d1, selected); - driverQueries.put(d2, query); - driverQueries.remove(d1); - ctx = createMockContext(query, conf, qconf, driverQueries); - - selected = selector.select(ctx, conf); - Assert.assertEquals(d2, selected); - - drivers.add(fd1); - driverQueries.put(fd1, query); - - ctx = createMockContext(query, conf, qconf, driverQueries); - selected = selector.select(ctx, conf); - Assert.assertEquals(d2, selected); - - drivers.add(fd2); - driverQueries.put(fd2, query); - ctx = createMockContext(query, conf, qconf, driverQueries); - - selected = selector.select(ctx, conf); - Assert.assertEquals(d2, selected); - - drivers.clear(); - driverQueries.clear(); - drivers.add(d1); - drivers.add(fd1); - driverQueries.put(d1, query); - ctx = createMockContext(query, conf, qconf, drivers, driverQueries); - selected = selector.select(ctx, conf); - Assert.assertEquals(d1, selected); - } -} http://git-wip-us.apache.org/repos/asf/lens/blob/1774ced2/lens-server-api/src/main/java/org/apache/lens/server/api/LensConfConstants.java ---------------------------------------------------------------------- diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/LensConfConstants.java b/lens-server-api/src/main/java/org/apache/lens/server/api/LensConfConstants.java index 85f54d1..0a81f7b 100644 --- a/lens-server-api/src/main/java/org/apache/lens/server/api/LensConfConstants.java +++ b/lens-server-api/src/main/java/org/apache/lens/server/api/LensConfConstants.java @@ -52,6 +52,11 @@ public final class LensConfConstants { public static final String METASTORE_PFX = "lens.metastore."; /** + * The Constant DRIVER_PFX. + */ + public static final String DRIVER_PFX = "lens.driver."; + + /** * The Constant DRIVER_TYPES_AND_CLASSES */ public static final String DRIVER_TYPES_AND_CLASSES = SERVER_PFX + "drivers"; @@ -962,6 +967,16 @@ public final class LensConfConstants { public static final String DRIVERS_BASE_DIR = "drivers"; /** + * The driver weight property + */ + public static final String DRIVER_WEIGHT = DRIVER_PFX + "weight"; + + /** + * Default driver weight + */ + public static final int DEFAULT_DRIVER_WEIGHT = 1; + + /** * Name of the property that holds the path of "conf" directory of server */ public static final String CONFIG_LOCATION = "config.location"; http://git-wip-us.apache.org/repos/asf/lens/blob/1774ced2/lens-server-api/src/main/java/org/apache/lens/server/api/driver/WeightedQueryCostDriverSelector.java ---------------------------------------------------------------------- diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/driver/WeightedQueryCostDriverSelector.java b/lens-server-api/src/main/java/org/apache/lens/server/api/driver/WeightedQueryCostDriverSelector.java new file mode 100644 index 0000000..167e79a --- /dev/null +++ b/lens-server-api/src/main/java/org/apache/lens/server/api/driver/WeightedQueryCostDriverSelector.java @@ -0,0 +1,101 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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 org.apache.lens.server.api.driver; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; + +import static org.apache.lens.server.api.LensConfConstants.DEFAULT_DRIVER_WEIGHT; +import static org.apache.lens.server.api.LensConfConstants.DRIVER_WEIGHT; + +import org.apache.lens.server.api.query.AbstractQueryContext; +import org.apache.lens.server.api.query.cost.QueryCost; + +import org.apache.hadoop.conf.Configuration; + +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +public class WeightedQueryCostDriverSelector implements DriverSelector { + /** + * Returns the driver that has the minimum query cost according to predefined driver allocation ratios. + * + * @param ctx the context + * @param conf the conf + * @return the lens driver + */ + @Override + public LensDriver select(final AbstractQueryContext ctx, final Configuration conf) { + + final Collection<LensDriver> drivers = ctx.getDriverContext().getDriversWithValidQueryCost(); + + log.info("Candidate drivers: {}", drivers); + if (log.isDebugEnabled()) { + for (LensDriver driver : drivers) { + log.debug("Cost on driver {}: {}", driver, ctx.getDriverQueryCost(driver)); + log.debug("Driver ratio: {}", driver.getConf().getDouble(DRIVER_WEIGHT, DEFAULT_DRIVER_WEIGHT)); + } + log.debug("Driver ratio: " + DEFAULT_DRIVER_WEIGHT + " => lens.driver.weight not set for that driver."); + } + + //The min-cost driver + final LensDriver minCostDriver = Collections.min(drivers, new Comparator<LensDriver>() { + @Override + public int compare(LensDriver d1, LensDriver d2) { + final QueryCost c1 = ctx.getDriverQueryCost(d1); + final QueryCost c2 = ctx.getDriverQueryCost(d2); + return c1.compareTo(c2); + } + }); + + //The collection of minimum cost drivers + final QueryCost minCost = ctx.getDriverQueryCost(minCostDriver); + final ArrayList<LensDriver> eligibleDrivers = new ArrayList<>(); + for (LensDriver driver : drivers) { + if (ctx.getDriverQueryCost(driver).equals(minCost)) { + eligibleDrivers.add(driver); + } + } + //Return the minCostDriver if there is only one min cost driver + if (eligibleDrivers.size() == 1){ + return minCostDriver; + } + final Collection<LensDriver> minCostDrivers = Collections.unmodifiableCollection(eligibleDrivers); + + //The driverRatio Sum across all minimum cost drivers + double driverRatioSum = 0; + for (LensDriver driver : minCostDrivers) { + driverRatioSum = driverRatioSum + driver.getConf().getDouble(DRIVER_WEIGHT, DEFAULT_DRIVER_WEIGHT); + } + + //Weighted random allocation + driverRatioSum = Math.random()*driverRatioSum; + + for (LensDriver driver : minCostDrivers){ + driverRatioSum -= driver.getConf().getDouble(DRIVER_WEIGHT, DEFAULT_DRIVER_WEIGHT); + if (driverRatioSum <= 0){ + return driver; + } + } + return minCostDriver; + } +} http://git-wip-us.apache.org/repos/asf/lens/blob/1774ced2/lens-server-api/src/test/java/org/apache/lens/server/api/driver/TestMinCostSelector.java ---------------------------------------------------------------------- diff --git a/lens-server-api/src/test/java/org/apache/lens/server/api/driver/TestMinCostSelector.java b/lens-server-api/src/test/java/org/apache/lens/server/api/driver/TestMinCostSelector.java new file mode 100644 index 0000000..3f45745 --- /dev/null +++ b/lens-server-api/src/test/java/org/apache/lens/server/api/driver/TestMinCostSelector.java @@ -0,0 +1,104 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://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 org.apache.lens.server.api.driver; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.lens.api.LensConf; +import org.apache.lens.server.api.error.LensException; +import org.apache.lens.server.api.query.MockQueryContext; + +import org.apache.hadoop.conf.Configuration; + +import org.testng.Assert; +import org.testng.annotations.Test; + +/** + * The Class TestMinCostSelector. + */ +public class TestMinCostSelector { + + private MockQueryContext createMockContext(String query, Configuration conf, LensConf lensConf, + Map<LensDriver, String> driverQueries) throws LensException { + MockQueryContext ctx = new MockQueryContext(query, lensConf, conf, driverQueries.keySet()); + ctx.setDriverQueries(driverQueries); + ctx.estimateCostForDrivers(); + return ctx; + } + + @Test + public void testMinCostSelector() throws LensException { + MinQueryCostSelector selector = new MinQueryCostSelector(); + List<LensDriver> drivers = new ArrayList<LensDriver>(); + Map<LensDriver, String> driverQueries = new HashMap<LensDriver, String>(); + Configuration conf = new Configuration(); + LensConf qconf = new LensConf(); + + MockDriver d1 = new MockDriver(); + d1.configure(conf, null, null); + MockDriver d2 = new MockDriver(); + d2.configure(conf, null, null); + MockFailDriver fd1 = new MockFailDriver(); + fd1.configure(conf, null, null); + MockFailDriver fd2 = new MockFailDriver(); + fd2.configure(conf, null, null); + + drivers.add(d1); + drivers.add(d2); + String query = "test query"; + driverQueries.put(d1, query); + + MockQueryContext ctx = createMockContext(query, conf, qconf, driverQueries); + LensDriver selected = selector.select(ctx, conf); + + Assert.assertEquals(d1, selected); + driverQueries.put(d2, query); + driverQueries.remove(d1); + ctx = createMockContext(query, conf, qconf, driverQueries); + + selected = selector.select(ctx, conf); + Assert.assertEquals(d2, selected); + + drivers.add(fd1); + driverQueries.put(fd1, query); + + ctx = createMockContext(query, conf, qconf, driverQueries); + selected = selector.select(ctx, conf); + Assert.assertEquals(d2, selected); + + drivers.add(fd2); + driverQueries.put(fd2, query); + ctx = createMockContext(query, conf, qconf, driverQueries); + + selected = selector.select(ctx, conf); + Assert.assertEquals(d2, selected); + + drivers.clear(); + driverQueries.clear(); + drivers.add(d1); + drivers.add(fd1); + driverQueries.put(d1, query); + ctx = createMockContext(query, conf, qconf, driverQueries); + selected = selector.select(ctx, conf); + Assert.assertEquals(d1, selected); + } +} http://git-wip-us.apache.org/repos/asf/lens/blob/1774ced2/lens-server-api/src/test/java/org/apache/lens/server/api/driver/TestWeightedCostSelector.java ---------------------------------------------------------------------- diff --git a/lens-server-api/src/test/java/org/apache/lens/server/api/driver/TestWeightedCostSelector.java b/lens-server-api/src/test/java/org/apache/lens/server/api/driver/TestWeightedCostSelector.java new file mode 100644 index 0000000..17161cc --- /dev/null +++ b/lens-server-api/src/test/java/org/apache/lens/server/api/driver/TestWeightedCostSelector.java @@ -0,0 +1,288 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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 org.apache.lens.server.api.driver; + +import static java.lang.Math.abs; + +import static org.apache.lens.server.api.LensConfConstants.DRIVER_WEIGHT; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.lens.api.LensConf; +import org.apache.lens.server.api.error.LensException; +import org.apache.lens.server.api.query.MockQueryContext; +import org.apache.lens.server.api.query.cost.FactPartitionBasedQueryCost; + +import org.apache.hadoop.conf.Configuration; + +import org.testng.Assert; +import org.testng.annotations.Test; + +/** + * The Class TestWeightedCostSelector. + */ +public class TestWeightedCostSelector { + + private WeightedQueryCostDriverSelector selector = new WeightedQueryCostDriverSelector(); + private Configuration conf = new Configuration(); + private LensConf qconf = new LensConf(); + private FactPartitionBasedQueryCost queryCost = new FactPartitionBasedQueryCost(100.0); + private int numLoop = 1000; //Number of loops to run to test driver allocation + private int errorBuffer = 5; //Error buffer in percentage (change to double for fractional buffers) + + + private class TestDriverAllocation { + double p1, p2, p3; + int total; + } + + private static MockQueryContext createMockContext(String query, Configuration conf, LensConf lensConf, + Map<LensDriver, String> driverQueries) throws LensException { + MockQueryContext ctx = new MockQueryContext(query, lensConf, conf, driverQueries.keySet()); + ctx.setDriverQueries(driverQueries); + ctx.estimateCostForDrivers(); + return ctx; + } + + private TestDriverAllocation driverLoop(MockQueryContext ctx, MockDriver d1, MockDriver d2, MockDriver d3, + MockDriver d4) { + int c1 = 0; + int c2 = 0; + int c3 = 0; + + for (int i = 0; i < numLoop; i++) { + LensDriver selectedDriver = selector.select(ctx, conf); + Assert.assertNotEquals(d4, selectedDriver, "Improper driver allocation. Check WeightedQueryCostDriverSelector."); + if (d1.equals(selectedDriver)) { + c1++; + } else { + if (d2.equals(selectedDriver)) { + c2++; + } else { + if (d3.equals(selectedDriver)) { + c3++; + } + } + } + } + + TestDriverAllocation allocation = new TestDriverAllocation(); + allocation.total = c1 + c2 + c3; + allocation.p1 = c1 * 100.0 / (allocation.total); + allocation.p2 = c2 * 100.0 / (allocation.total); + allocation.p3 = c3 * 100.0 / (allocation.total); + + return allocation; + } + + private TestDriverAllocation testDriverSelector(double r1, double r2, double r3, double r4) throws LensException { + + List<LensDriver> drivers = new ArrayList<LensDriver>(); + Map<LensDriver, String> driverQueries = new HashMap<LensDriver, String>(); + + Configuration conf1 = new Configuration(); + Configuration conf2 = new Configuration(); + Configuration conf3 = new Configuration(); + Configuration conf4 = new Configuration(); + + //Creating drivers and setting driver ratios + MockDriver d1 = new MockDriver(); + d1.configure(conf1, null, null); + if (r1 > 0) { + conf1.setDouble(DRIVER_WEIGHT, r1); + } + + MockDriver d2 = new MockDriver(); + d2.configure(conf2, null, null); + if (r2 > 0) { + conf2.setDouble(DRIVER_WEIGHT, r2); + } + + MockDriver d3 = new MockDriver(); + d3.configure(conf3, null, null); + if (r3 > 0) { + conf3.setDouble(DRIVER_WEIGHT, r3); + } + + MockDriver d4 = new MockDriver(); + d4.configure(conf4, null, null); + if (r4 > 0) { + conf4.setDouble(DRIVER_WEIGHT, r4); + } + + drivers.add(d1); + drivers.add(d2); + drivers.add(d3); + drivers.add(d4); + + String query = "test query"; + driverQueries.put(d1, query); + driverQueries.put(d2, query); + driverQueries.put(d3, query); + driverQueries.put(d4, query); + + MockQueryContext ctx = createMockContext(query, conf, qconf, driverQueries); + ctx.setDriverCost(d4, queryCost); //Increasing driver 4's query cost + + return driverLoop(ctx, d1, d2, d3, d4); + } + + private void assertAllocation(String caseString, TestDriverAllocation allocation, double r1, double r2, double r3) { + if (allocation.total != numLoop) { + throw new AssertionError(caseString + ": Incomplete driver allocation. Check" + + " WeightedQueryCostDriverSelector."); + } + + if (abs(allocation.p1 - r1) > errorBuffer) { + throw new AssertionError(caseString + ": Driver 1 not properly allocated. Difference by " + + abs(allocation.p1 - r1) + "." + " Check WeightedQueryCostDriverSelector"); + } + + if (abs(allocation.p2 - r2) > errorBuffer) { + throw new AssertionError(caseString + ": Driver 2 not properly allocated. Difference by " + + abs(allocation.p2 - r2) + "." + " Check WeightedQueryCostDriverSelector"); + } + + if (abs(allocation.p3 - r3) > errorBuffer) { + throw new AssertionError(caseString + ": Driver 3 not properly allocated. Difference by " + + abs(allocation.p3 - r3) + "." + " Check WeightedQueryCostDriverSelector"); + } + } + + //4 DRIVERS WITH THEIR WEIGHTS SET (3 are min cost) + @Test + public void testCustomWeights() throws LensException { + double r1 = 30; + double r2 = 20; + double r3 = 50; + double r4 = 100; //Insignificant driver weight due to increased driver cost + + TestDriverAllocation allocation = testDriverSelector(r1, r2, r3, r4); + + assertAllocation("TEST CustomWeights", allocation, r1, r2, r3); + } + + + //4 DRIVERS WITHOUT WEIGHTS SET. (3 are min cost) + @Test + public void testNoWeights() throws LensException { + + TestDriverAllocation allocation = testDriverSelector(-1, -1, -1, -1); + + assertAllocation("TEST NoWeights", allocation, 33.33, 33.33, 33.33); + } + + //2 DRIVERS WITH DIFFERENT WEIGHTS + @Test + public void testDifferentWeights() throws LensException { + + int r1 = 10; + int r2 = 90; + + List<LensDriver> drivers = new ArrayList<LensDriver>(); + Map<LensDriver, String> driverQueries = new HashMap<LensDriver, String>(); + + Configuration conf1 = new Configuration(); + Configuration conf2 = new Configuration(); + + //Creating drivers and setting driver ratios + MockDriver d1 = new MockDriver(); + conf1.setDouble(DRIVER_WEIGHT, r1); + d1.configure(conf1, null, null); + + MockDriver d2 = new MockDriver(); + conf2.setDouble(DRIVER_WEIGHT, r2); + d2.configure(conf2, null, null); + + drivers.add(d1); + drivers.add(d2); + String query = "test query"; + driverQueries.put(d1, query); + driverQueries.put(d2, query); + + MockQueryContext ctx = createMockContext(query, conf, qconf, driverQueries); + + ctx.setDriverCost(d2, queryCost); + + LensDriver selected = selector.select(ctx, conf); + + Assert.assertEquals(selected, d1, "TEST Different Weights: Improper driver allocation. Check " + + "WeightedQueryCostDriverSelector."); + } + + //DEFAULT MIN COST SELECTOR BEHAVIOR + @Test + public void testDefaultMinCost() throws LensException { + List<LensDriver> drivers = new ArrayList<LensDriver>(); + Map<LensDriver, String> driverQueries = new HashMap<LensDriver, String>(); + + MockDriver d1 = new MockDriver(); + d1.configure(conf, null, null); + MockDriver d2 = new MockDriver(); + d2.configure(conf, null, null); + MockFailDriver fd1 = new MockFailDriver(); + fd1.configure(conf, null, null); + MockFailDriver fd2 = new MockFailDriver(); + fd2.configure(conf, null, null); + + String message = "TEST DefaultMinCost: Check WeightedQueryCostDriverSelector"; + + drivers.add(d1); + drivers.add(d2); + String query = "test query"; + driverQueries.put(d1, query); + + MockQueryContext ctx = createMockContext(query, conf, qconf, driverQueries); + LensDriver selected = selector.select(ctx, conf); + + Assert.assertEquals(d1, selected, message); + driverQueries.put(d2, query); + driverQueries.remove(d1); + ctx = createMockContext(query, conf, qconf, driverQueries); + + selected = selector.select(ctx, conf); + Assert.assertEquals(d2, selected, message); + + drivers.add(fd1); + driverQueries.put(fd1, query); + + ctx = createMockContext(query, conf, qconf, driverQueries); + selected = selector.select(ctx, conf); + Assert.assertEquals(d2, selected, message); + + drivers.add(fd2); + driverQueries.put(fd2, query); + ctx = createMockContext(query, conf, qconf, driverQueries); + + selected = selector.select(ctx, conf); + Assert.assertEquals(d2, selected, message); + + drivers.clear(); + driverQueries.clear(); + drivers.add(d1); + drivers.add(fd1); + driverQueries.put(d1, query); + ctx = createMockContext(query, conf, qconf, driverQueries); + selected = selector.select(ctx, conf); + Assert.assertEquals(d1, selected, message); + } +} http://git-wip-us.apache.org/repos/asf/lens/blob/1774ced2/src/site/apt/admin/jdbcdriver-config.apt ---------------------------------------------------------------------- diff --git a/src/site/apt/admin/jdbcdriver-config.apt b/src/site/apt/admin/jdbcdriver-config.apt index 8a2666f..8fd5295 100644 --- a/src/site/apt/admin/jdbcdriver-config.apt +++ b/src/site/apt/admin/jdbcdriver-config.apt @@ -78,7 +78,8 @@ Jdbc driver configuration *--+--+---+--+ |27|lens.driver.jdbc.pool.max.statements|20|Maximum number of prepared statements to cache per connection| *--+--+---+--+ -|28|lens.driver.jdbc.query.launching.constraint.factories|org.apache.lens.server.api.query.constraint.MaxConcurrentDriverQueriesConstraintFactory|Factories used to instantiate constraints enforced on queries by driver. A query will be launched only if all constraints pass. Every Factory should be an implementation of org.apache.lens.server.api.common.ConfigBasedObjectCreationFactory and create an implementation of org.apache.lens.server.api.query.constraint.QueryLaunchingConstraint.| +|28|lens.driver.jdbc.query.launching.constraint.factories|org.apache.lens.server.api.query.constraint.MaxConcurrentDriverQueriesConstraintFactory, + org.apache.lens.driver.jdbc.MaxJDBCConnectionCheckConstraintFactory|Factories used to instantiate constraints enforced on queries by driver. A query will be launched only if all constraints pass. Every Factory should be an implementation of org.apache.lens.server.api.common.ConfigBasedObjectCreationFactory and create an implementation of org.apache.lens.server.api.query.constraint.QueryLaunchingConstraint.| *--+--+---+--+ |29|lens.driver.jdbc.query.rewriter|org.apache.lens.driver.jdbc.ColumnarSQLRewriter|Rewriting the HQL to optimized sql queries| *--+--+---+--+
