package voldemort.store.readonly.swapper; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import voldemort.client.protocol.admin.AdminClient; import voldemort.cluster.Node; import voldemort.store.readonly.swapper.AdminStoreSwapper.Response; import voldemort.utils.ExceptionUtils; import com.google.common.collect.Lists; /** * */ public class DisableStoreOnFailedNodeFailedFetchStrategy extends FailedFetchStrategy { private final String extraInfo; public DisableStoreOnFailedNodeFailedFetchStrategy(AdminClient adminClient, String extraInfo) { super(adminClient); this.extraInfo = extraInfo; } @Override protected boolean dealWithIt(String storeName, long pushVersion, Map<Node, AdminStoreSwapper.Response> fetchResponseMap) throws Exception { List<String> hardFailures = new ArrayList<String>(); List<Integer> failedNodes = Lists.newArrayList(); for(Map.Entry<Node, AdminStoreSwapper.Response> entry: fetchResponseMap.entrySet()) { Response response = entry.getValue(); if(!response.isSuccessful()) { Exception ex = response.getException(); boolean isSoftError = ExceptionUtils.recursiveClassEquals(ex, ExceptionUtils.BNP_SOFT_ERRORS); Node node = entry.getKey(); if(isSoftError) { int nodeId = node.getId(); failedNodes.add(nodeId); } else { String nodeErrorMessage = node.briefToString() + " threw exception " + ex.getClass().getName() + ". "; hardFailures.add(nodeErrorMessage); } } } if(hardFailures.size() > 0) { String errorMessage = Arrays.toString(hardFailures.toArray()); logger.error("There were non connection related errors. Details " + errorMessage); return false; } return adminClient.readonlyOps.handleFailedFetch(failedNodes, storeName, pushVersion, extraInfo); } }