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); containerState == State.OPEN || containerState == State.CLOSING);
// mark and persist the container state to be unhealthy // mark and persist the container state to be unhealthy
try { try {
handler.markContainerUhealthy(container); handler.markContainerUnhealthy(container);
} catch (IOException ioe) { } catch (IOException ioe) {
// just log the error here in case marking the container fails, // just log the error here in case marking the container fails,
// Return the actual failure response to the client // Return the actual failure response to the client

View File

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

View File

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

View File

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