From f63300228e27d1b8170e4d85538d8011484f1448 Mon Sep 17 00:00:00 2001 From: avijayanhwx <14299376+avijayanhwx@users.noreply.github.com> Date: Mon, 20 May 2019 13:02:56 -0700 Subject: [PATCH] HDDS-1451 : SCMBlockManager findPipeline and createPipeline are not lock protected. (#799) * HDDS-1451 : SCMBlockManager findPipeline and createPipeline are not lock protected. * HDDS-1451 : Address review comments. --- .../hdds/scm/block/BlockManagerImpl.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java index 31d82f633b..1ffd01d30c 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java @@ -182,18 +182,27 @@ public AllocatedBlock allocateBlock(final long size, ReplicationType type, pipelineManager .getPipelines(type, factor, Pipeline.PipelineState.OPEN, excludeList.getDatanodes(), excludeList.getPipelineIds()); - Pipeline pipeline; + Pipeline pipeline = null; if (availablePipelines.size() == 0) { try { // TODO: #CLUTIL Remove creation logic when all replication types and // factors are handled by pipeline creator pipeline = pipelineManager.createPipeline(type, factor); } catch (IOException e) { - LOG.error("Pipeline creation failed for type:{} factor:{}", - type, factor, e); - break; + LOG.warn("Pipeline creation failed for type:{} factor:{}. Retrying " + + "get pipelines call once.", type, factor, e); + availablePipelines = pipelineManager + .getPipelines(type, factor, Pipeline.PipelineState.OPEN, + excludeList.getDatanodes(), excludeList.getPipelineIds()); + if (availablePipelines.size() == 0) { + LOG.info("Could not find available pipeline of type:{} and " + + "factor:{} even after retrying", type, factor); + break; + } } - } else { + } + + if (null == pipeline) { // TODO: #CLUTIL Make the selection policy driven. pipeline = availablePipelines .get((int) (Math.random() * availablePipelines.size()));