package voldemort.client.rebalance;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import voldemort.client.protocol.admin.AdminClient;
import voldemort.store.metadata.MetadataStore;
import voldemort.tools.admin.AdminToolUtils;
import com.google.common.collect.Maps;
public class QuotaResetter {
final AdminClient adminClient;
final Set<Integer> nodeIds;
final Set<String> storeNames;
Map<Integer, Boolean> mapNodeToQuotaEnforcingEnabled = Maps.newHashMap();
public QuotaResetter(AdminClient adminClient, Set<String> storeNames, Set<Integer> nodeIds) {
this.adminClient = adminClient;
this.nodeIds = nodeIds;
this.storeNames = storeNames;
this.mapNodeToQuotaEnforcingEnabled = Maps.newHashMap();
}
public QuotaResetter(String bootstrapUrl, Set<String> storeNames, Set<Integer> nodeIds) {
this(AdminToolUtils.getAdminClient(bootstrapUrl), storeNames, nodeIds);
}
/**
* Before cluster management operations, i.e. remember and disable quota
* enforcement settings
*/
public void rememberAndDisableQuota() {
for(Integer nodeId: nodeIds) {
boolean quotaEnforcement = Boolean.parseBoolean(adminClient.metadataMgmtOps.getRemoteMetadata(nodeId,
MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY)
.getValue());
mapNodeToQuotaEnforcingEnabled.put(nodeId, quotaEnforcement);
}
adminClient.metadataMgmtOps.updateRemoteMetadata(nodeIds,
MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY,
Boolean.toString(false));
}
/**
* After cluster management operations, i.e. reset quota and recover quota
* enforcement settings
*/
public void resetQuotaAndRecoverEnforcement() {
for(Integer nodeId: nodeIds) {
boolean quotaEnforcement = mapNodeToQuotaEnforcingEnabled.get(nodeId);
adminClient.metadataMgmtOps.updateRemoteMetadata(Arrays.asList(nodeId),
MetadataStore.QUOTA_ENFORCEMENT_ENABLED_KEY,
Boolean.toString(quotaEnforcement));
}
for(String storeName: storeNames) {
adminClient.quotaMgmtOps.rebalanceQuota(storeName);
}
}
}