/* * Copyright 2008-2013 LinkedIn, Inc * * 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 * * 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 voldemort.client; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Properties; import java.util.Set; import org.junit.After; import org.junit.Before; import org.junit.Test; import voldemort.ServerTestUtils; import voldemort.client.protocol.admin.AdminClient; import voldemort.client.protocol.admin.AdminClientConfig; import voldemort.client.rebalance.QuotaResetter; import voldemort.cluster.Cluster; import voldemort.server.VoldemortServer; import voldemort.store.StoreDefinition; import voldemort.store.metadata.MetadataStore; import voldemort.store.quota.QuotaType; import voldemort.store.socket.SocketStoreFactory; import voldemort.store.socket.clientrequest.ClientRequestExecutorPool; import voldemort.xml.StoreDefinitionsMapper; import com.google.common.collect.Sets; /** * Tests voldemort server behavior under NORMAL_SERVER and OFFLINE_SERVER * states, especially after state transitions. */ public class QuotaResetterTest { private static final String STORE_NAME = "test-basic-replication-memory"; private static String storesXmlfile = "test/common/voldemort/config/stores.xml"; private SocketStoreFactory socketStoreFactory = new ClientRequestExecutorPool(2, 10000, 100000, 32 * 1024); private Set<String> storeNames; private VoldemortServer[] servers; private Cluster cluster; private AdminClient adminClient; @Before public void setUp() throws IOException { int numServers = 2; servers = new VoldemortServer[numServers]; int partitionMap[][] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 } }; Properties serverProperties = new Properties(); serverProperties.setProperty("client.max.connections.per.node", "20"); serverProperties.setProperty("enforce.retention.policy.on.read", Boolean.toString(false)); cluster = ServerTestUtils.startVoldemortCluster(numServers, servers, partitionMap, socketStoreFactory, true, null, storesXmlfile, serverProperties); List<StoreDefinition> storeDefs = new StoreDefinitionsMapper().readStoreList(new File(storesXmlfile)); this.storeNames = Sets.newHashSet(); for(StoreDefinition storeDef: storeDefs) { storeNames.add(storeDef.getName()); } Properties adminProperties = new Properties(); adminProperties.setProperty("max_connections", "20"); adminClient = new AdminClient(cluster, new AdminClientConfig(adminProperties)); } @After public void tearDown() throws IOException { adminClient.close(); for(VoldemortServer server: servers) { ServerTestUtils.stopVoldemortServer(server); } socketStoreFactory.close(); } @Test public void testQuotaResetter() { // set unbalanced quota values for nodes adminClient.quotaMgmtOps.setQuotaForNode(STORE_NAME, QuotaType.GET_THROUGHPUT, 0, 1000L); // verify whether quota values initialized assertEquals(Long.parseLong(adminClient.quotaMgmtOps.getQuotaForNode(STORE_NAME, QuotaType.GET_THROUGHPUT, 0) .getValue()), 1000L); assertEquals(adminClient.quotaMgmtOps.getQuotaForNode(STORE_NAME, QuotaType.GET_THROUGHPUT, 1), null); // set initial quota enforcement settings adminClient.metadataMgmtOps.updateRemoteMetadata(0, MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY, Boolean.toString(true)); adminClient.metadataMgmtOps.updateRemoteMetadata(1, MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY, Boolean.toString(false)); // verify whether quota enforcement settings initialized assertEquals(adminClient.metadataMgmtOps.getRemoteMetadata(0, MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY) .getValue(), Boolean.toString(true)); assertEquals(adminClient.metadataMgmtOps.getRemoteMetadata(1, MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY) .getValue(), Boolean.toString(false)); // initialize quota resetter QuotaResetter quotaResetter = new QuotaResetter(adminClient, storeNames, cluster.getNodeIds()); // test rememberAndDisableQuota quotaResetter.rememberAndDisableQuota(); // verify whether quota values changed assertEquals(Long.parseLong(adminClient.quotaMgmtOps.getQuotaForNode(STORE_NAME, QuotaType.GET_THROUGHPUT, 0) .getValue()), 1000L); assertEquals(adminClient.quotaMgmtOps.getQuotaForNode(STORE_NAME, QuotaType.GET_THROUGHPUT, 1), null); // verify whether quota enforcement disabled assertEquals(adminClient.metadataMgmtOps.getRemoteMetadata(0, MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY) .getValue(), Boolean.toString(false)); assertEquals(adminClient.metadataMgmtOps.getRemoteMetadata(1, MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY) .getValue(), Boolean.toString(false)); // test resetQuotaAndRecoverEnforcement quotaResetter.resetQuotaAndRecoverEnforcement(); // verify whether quota values changed assertEquals(Long.parseLong(adminClient.quotaMgmtOps.getQuotaForNode(STORE_NAME, QuotaType.GET_THROUGHPUT, 0) .getValue()), 500L); assertEquals(Long.parseLong(adminClient.quotaMgmtOps.getQuotaForNode(STORE_NAME, QuotaType.GET_THROUGHPUT, 1) .getValue()), 500L); // verify whether quota enforcement settings recovered assertEquals(adminClient.metadataMgmtOps.getRemoteMetadata(0, MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY) .getValue(), Boolean.toString(true)); assertEquals(adminClient.metadataMgmtOps.getRemoteMetadata(1, MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY) .getValue(), Boolean.toString(false)); } }