|
@@ -29,6 +29,7 @@ import org.apache.hadoop.hdds.scm.events.SCMEvents;
|
|
import org.apache.hadoop.hdds.scm.node.NodeManager;
|
|
import org.apache.hadoop.hdds.scm.node.NodeManager;
|
|
import org.apache.hadoop.hdds.server.ServerUtils;
|
|
import org.apache.hadoop.hdds.server.ServerUtils;
|
|
import org.apache.hadoop.hdds.server.events.EventPublisher;
|
|
import org.apache.hadoop.hdds.server.events.EventPublisher;
|
|
|
|
+import org.apache.hadoop.metrics2.util.MBeans;
|
|
import org.apache.hadoop.ozone.OzoneConsts;
|
|
import org.apache.hadoop.ozone.OzoneConsts;
|
|
import org.apache.hadoop.utils.MetadataKeyFilters;
|
|
import org.apache.hadoop.utils.MetadataKeyFilters;
|
|
import org.apache.hadoop.utils.MetadataStore;
|
|
import org.apache.hadoop.utils.MetadataStore;
|
|
@@ -36,8 +37,10 @@ import org.apache.hadoop.utils.MetadataStoreBuilder;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
+import javax.management.ObjectName;
|
|
import java.io.File;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
|
+import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
import java.util.NavigableSet;
|
|
import java.util.NavigableSet;
|
|
@@ -68,6 +71,9 @@ public class SCMPipelineManager implements PipelineManager {
|
|
|
|
|
|
private final EventPublisher eventPublisher;
|
|
private final EventPublisher eventPublisher;
|
|
private final NodeManager nodeManager;
|
|
private final NodeManager nodeManager;
|
|
|
|
+ private final SCMPipelineMetrics metrics;
|
|
|
|
+ // Pipeline Manager MXBean
|
|
|
|
+ private ObjectName pmInfoBean;
|
|
|
|
|
|
public SCMPipelineManager(Configuration conf, NodeManager nodeManager,
|
|
public SCMPipelineManager(Configuration conf, NodeManager nodeManager,
|
|
EventPublisher eventPublisher) throws IOException {
|
|
EventPublisher eventPublisher) throws IOException {
|
|
@@ -87,6 +93,9 @@ public class SCMPipelineManager implements PipelineManager {
|
|
.build();
|
|
.build();
|
|
this.eventPublisher = eventPublisher;
|
|
this.eventPublisher = eventPublisher;
|
|
this.nodeManager = nodeManager;
|
|
this.nodeManager = nodeManager;
|
|
|
|
+ this.metrics = SCMPipelineMetrics.create();
|
|
|
|
+ this.pmInfoBean = MBeans.register("SCMPipelineManager",
|
|
|
|
+ "SCMPipelineManagerInfo", this);
|
|
initializePipelineState();
|
|
initializePipelineState();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -115,12 +124,16 @@ public class SCMPipelineManager implements PipelineManager {
|
|
ReplicationType type, ReplicationFactor factor) throws IOException {
|
|
ReplicationType type, ReplicationFactor factor) throws IOException {
|
|
lock.writeLock().lock();
|
|
lock.writeLock().lock();
|
|
try {
|
|
try {
|
|
- Pipeline pipeline = pipelineFactory.create(type, factor);
|
|
|
|
|
|
+ Pipeline pipeline = pipelineFactory.create(type, factor);
|
|
pipelineStore.put(pipeline.getId().getProtobuf().toByteArray(),
|
|
pipelineStore.put(pipeline.getId().getProtobuf().toByteArray(),
|
|
pipeline.getProtobufMessage().toByteArray());
|
|
pipeline.getProtobufMessage().toByteArray());
|
|
stateManager.addPipeline(pipeline);
|
|
stateManager.addPipeline(pipeline);
|
|
nodeManager.addPipeline(pipeline);
|
|
nodeManager.addPipeline(pipeline);
|
|
|
|
+ metrics.incNumPipelineCreated();
|
|
return pipeline;
|
|
return pipeline;
|
|
|
|
+ } catch (IOException ex) {
|
|
|
|
+ metrics.incNumPipelineCreationFailed();
|
|
|
|
+ throw ex;
|
|
} finally {
|
|
} finally {
|
|
lock.writeLock().unlock();
|
|
lock.writeLock().unlock();
|
|
}
|
|
}
|
|
@@ -130,6 +143,7 @@ public class SCMPipelineManager implements PipelineManager {
|
|
public Pipeline createPipeline(ReplicationType type, ReplicationFactor factor,
|
|
public Pipeline createPipeline(ReplicationType type, ReplicationFactor factor,
|
|
List<DatanodeDetails> nodes) {
|
|
List<DatanodeDetails> nodes) {
|
|
// This will mostly be used to create dummy pipeline for SimplePipelines.
|
|
// This will mostly be used to create dummy pipeline for SimplePipelines.
|
|
|
|
+ // We don't update the metrics for SimplePipelines.
|
|
lock.writeLock().lock();
|
|
lock.writeLock().lock();
|
|
try {
|
|
try {
|
|
return pipelineFactory.create(type, factor, nodes);
|
|
return pipelineFactory.create(type, factor, nodes);
|
|
@@ -260,11 +274,27 @@ public class SCMPipelineManager implements PipelineManager {
|
|
pipelineStore.delete(pipelineID.getProtobuf().toByteArray());
|
|
pipelineStore.delete(pipelineID.getProtobuf().toByteArray());
|
|
Pipeline pipeline = stateManager.removePipeline(pipelineID);
|
|
Pipeline pipeline = stateManager.removePipeline(pipelineID);
|
|
nodeManager.removePipeline(pipeline);
|
|
nodeManager.removePipeline(pipeline);
|
|
|
|
+ metrics.incNumPipelineDestroyed();
|
|
|
|
+ } catch (IOException ex) {
|
|
|
|
+ metrics.incNumPipelineDestroyFailed();
|
|
|
|
+ throw ex;
|
|
} finally {
|
|
} finally {
|
|
lock.writeLock().unlock();
|
|
lock.writeLock().unlock();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public Map<String, Integer> getPipelineInfo() {
|
|
|
|
+ final Map<String, Integer> pipelineInfo = new HashMap<>();
|
|
|
|
+ for (Pipeline.PipelineState state : Pipeline.PipelineState.values()) {
|
|
|
|
+ pipelineInfo.put(state.toString(), 0);
|
|
|
|
+ }
|
|
|
|
+ stateManager.getPipelines().forEach(pipeline ->
|
|
|
|
+ pipelineInfo.computeIfPresent(
|
|
|
|
+ pipeline.getPipelineState().toString(), (k, v) -> v + 1));
|
|
|
|
+ return pipelineInfo;
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public void close() throws IOException {
|
|
public void close() throws IOException {
|
|
if (pipelineFactory != null) {
|
|
if (pipelineFactory != null) {
|
|
@@ -274,5 +304,12 @@ public class SCMPipelineManager implements PipelineManager {
|
|
if (pipelineStore != null) {
|
|
if (pipelineStore != null) {
|
|
pipelineStore.close();
|
|
pipelineStore.close();
|
|
}
|
|
}
|
|
|
|
+ if(pmInfoBean != null) {
|
|
|
|
+ MBeans.unregister(this.pmInfoBean);
|
|
|
|
+ pmInfoBean = null;
|
|
|
|
+ }
|
|
|
|
+ if(metrics != null) {
|
|
|
|
+ metrics.unRegister();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|