1 /* 2 /** 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 */ 19 package org.apache.hadoop.hbase.exceptions; 20 21 import org.apache.commons.logging.Log; 22 import org.apache.commons.logging.LogFactory; 23 import org.apache.hadoop.classification.InterfaceAudience; 24 import org.apache.hadoop.classification.InterfaceStability; 25 import org.apache.hadoop.ipc.RemoteException; 26 27 /** 28 * Subclass if the server knows the region is now on another server. 29 * This allows the client to call the new region server without calling the master. 30 */ 31 @InterfaceAudience.Private 32 @InterfaceStability.Evolving 33 public class RegionOpeningException extends NotServingRegionException { 34 private static final Log LOG = LogFactory.getLog(RegionOpeningException.class); 35 private static final long serialVersionUID = -7232903522310558395L; 36 37 public RegionOpeningException(String message) { 38 super(message); 39 } 40 41 /** 42 * Look for a RegionOpeningException in the exception: 43 * - hadoop.ipc wrapped exceptions 44 * - nested exceptions 45 * Returns null if we didn't find the exception. 46 * TODO: this code is mostly C/Ped from RegionMovedExecption. Due to the limitations of 47 * generics it's not amenable to generalizing without adding parameters/isAssignableFrom. 48 * Might make general if used in more places. 49 */ 50 public static RegionOpeningException find(Object exception) { 51 if (exception == null || !(exception instanceof Throwable)) { 52 return null; 53 } 54 RegionOpeningException res = null; 55 Throwable cur = (Throwable)exception; 56 while (res == null && cur != null) { 57 if (cur instanceof RegionOpeningException) { 58 res = (RegionOpeningException) cur; 59 } else { 60 if (cur instanceof RemoteException) { 61 RemoteException re = (RemoteException) cur; 62 Exception e = re.unwrapRemoteException(RegionOpeningException.class); 63 if (e == null) { 64 e = re.unwrapRemoteException(); 65 } 66 // unwrapRemoteException can return the exception given as a parameter when it cannot 67 // unwrap it. In this case, there is no need to look further 68 // noinspection ObjectEquality 69 if (e != re) { 70 res = find(e); 71 } 72 } 73 cur = cur.getCause(); 74 } 75 } 76 return res; 77 } 78 }