1 /** 2 * Copyright 2010 The Apache Software Foundation 3 * 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 */ 20 package org.apache.hadoop.hbase.master; 21 22 import org.apache.hadoop.hbase.HRegionInfo; 23 import org.apache.hadoop.hbase.regionserver.HRegion; 24 25 import java.io.IOException; 26 27 /** 28 * ProcessRegionClose is the way we do post-processing on a closed region. We 29 * only spawn one of these asynchronous tasks when the region needs to be 30 * either offlined or deleted. We used to create one of these tasks whenever 31 * a region was closed, but since closing a region that isn't being offlined 32 * or deleted doesn't actually require post processing, it's no longer 33 * necessary. 34 */ 35 public class ProcessRegionClose extends ProcessRegionStatusChange { 36 protected final boolean offlineRegion; 37 protected final boolean reassignRegion; 38 39 /** 40 * @param master 41 * @param regionInfo Region to operate on 42 * @param offlineRegion if true, set the region to offline in meta 43 * @param reassignRegion if true, region is to be reassigned 44 */ 45 public ProcessRegionClose(HMaster master, HRegionInfo regionInfo, 46 boolean offlineRegion, boolean reassignRegion) { 47 48 super(master, regionInfo); 49 this.offlineRegion = offlineRegion; 50 this.reassignRegion = reassignRegion; 51 } 52 53 @Override 54 public String toString() { 55 return "ProcessRegionClose of " + this.regionInfo.getRegionNameAsString() + 56 ", " + this.offlineRegion + ", reassign: " + this.reassignRegion; 57 } 58 59 @Override 60 protected boolean process() throws IOException { 61 if (!metaRegionAvailable()) { 62 // We can't proceed unless the meta region we are going to update 63 // is online. metaRegionAvailable() has put this operation on the 64 // delayedToDoQueue, so return true so the operation is not put 65 // back on the toDoQueue 66 return true; 67 } 68 Boolean result = null; 69 if (offlineRegion || reassignRegion) { 70 result = 71 new RetryableMetaOperation<Boolean>(getMetaRegion(), this.master) { 72 public Boolean call() throws IOException { 73 74 75 // We can't proceed unless the meta region we are going to update 76 // is online. metaRegionAvailable() will put this operation on the 77 // delayedToDoQueue, so return true so the operation is not put 78 // back on the toDoQueue 79 80 if (metaRegionAvailable()) { 81 if(offlineRegion) { 82 // offline the region in meta and then remove it from the 83 // set of regions in transition 84 HRegion.offlineRegionInMETA(server, metaRegionName, 85 regionInfo); 86 master.getRegionManager().removeRegion(regionInfo); 87 LOG.info("region closed: " + regionInfo.getRegionNameAsString()); 88 } else { 89 // we are reassigning the region eventually, so set it unassigned 90 // and remove the server info 91 HRegion.cleanRegionInMETA(server, metaRegionName, 92 regionInfo); 93 master.getRegionManager().setUnassigned(regionInfo, false); 94 LOG.info("region set as unassigned: " + regionInfo.getRegionNameAsString()); 95 } 96 } 97 return true; 98 } 99 }.doWithRetries(); 100 result = result == null ? true : result; 101 102 } else { 103 LOG.info("Region was neither offlined, or asked to be reassigned, what gives: " + 104 regionInfo.getRegionNameAsString()); 105 } 106 107 return result == null ? true : result; 108 } 109 }