HDDS-1201. Reporting Corruptions in Containers to SCM (#912)

This commit is contained in:
Shweta Yakkali 2019-06-06 11:06:48 -07:00 committed by Nanda kumar
parent 944adc61b1
commit c8276f3e76
5 changed files with 19 additions and 21 deletions

View File

@ -302,7 +302,7 @@ public class HddsDispatcher implements ContainerDispatcher, Auditor {
containerState == State.OPEN || containerState == State.CLOSING);
// mark and persist the container state to be unhealthy
try {
handler.markContainerUhealthy(container);
handler.markContainerUnhealthy(container);
} catch (IOException ioe) {
// just log the error here in case marking the container fails,
// Return the actual failure response to the client

View File

@ -135,7 +135,7 @@ public abstract class Handler {
* @param container container to update
* @throws IOException in case of exception
*/
public abstract void markContainerUhealthy(Container container)
public abstract void markContainerUnhealthy(Container container)
throws IOException;
/**

View File

@ -884,20 +884,20 @@ public class KeyValueHandler extends Handler {
@Override
public void markContainerForClose(Container container)
throws IOException {
State currentState = container.getContainerState();
// Move the container to CLOSING state only if it's OPEN
if (currentState == State.OPEN) {
if (container.getContainerState() == State.OPEN) {
container.markContainerForClose();
sendICR(container);
}
}
@Override
public void markContainerUhealthy(Container container)
public void markContainerUnhealthy(Container container)
throws IOException {
// this will mark the container unhealthy and a close container action will
// be sent from the dispatcher ton SCM to close down this container.
container.markContainerUnhealthy();
if (container.getContainerState() != State.UNHEALTHY) {
container.markContainerUnhealthy();
sendICR(container);
}
}
@Override

View File

@ -133,11 +133,11 @@ public class ContainerController {
* @param container Container
* @return handler of the container
*/
Handler getHandler(final Container container) {
private Handler getHandler(final Container container) {
return handlers.get(container.getContainerType());
}
Iterator<Container> getContainerSetIterator() {
public Iterator<Container> getContainers() {
return containerSet.getContainerIterator();
}
}

View File

@ -22,7 +22,6 @@ import org.apache.commons.net.ntp.TimeStamp;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.scm.container.common.helpers.StorageContainerException;
import org.apache.hadoop.ozone.container.common.interfaces.Container;
import org.apache.hadoop.ozone.container.common.interfaces.Handler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -57,7 +56,11 @@ public class ContainerScrubber implements Runnable {
LOG.info("Background ContainerScrubber starting up");
while (true) {
scrub();
try {
scrub();
} catch (StorageContainerException e) {
LOG.error("Scrubber encountered StorageContainerException.");
}
if (this.halt) {
break; // stop and exit if requested
@ -126,25 +129,20 @@ public class ContainerScrubber implements Runnable {
}
}
private void scrub() {
Iterator<Container> containerIt = controller.getContainerSetIterator();
private void scrub() throws StorageContainerException {
Iterator<Container> containerIt = controller.getContainers();
long count = 0;
while (containerIt.hasNext()) {
while (containerIt.hasNext() && !halt) {
TimeStamp startTime = new TimeStamp(System.currentTimeMillis());
Container container = containerIt.next();
Handler containerHandler = controller.getHandler(container);
if (this.halt) {
break; // stop if requested
}
try {
container.check();
} catch (StorageContainerException e) {
LOG.error("Error unexpected exception {} for Container {}", e,
container.getContainerData().getContainerID());
container.markContainerUnhealthy();
// XXX Action required here
}
count++;