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.hbase.NotServingRegionException;
26 import org.apache.hadoop.ipc.RemoteException;
27
28 /**
29 * Subclass if the server knows the region is now on another server.
30 * This allows the client to call the new region server without calling the master.
31 */
32 @InterfaceAudience.Private
33 @InterfaceStability.Evolving
34 public class RegionOpeningException extends NotServingRegionException {
35 private static final Log LOG = LogFactory.getLog(RegionOpeningException.class);
36 private static final long serialVersionUID = -7232903522310558395L;
37
38 public RegionOpeningException(String message) {
39 super(message);
40 }
41
42 /**
43 * Look for a RegionOpeningException in the exception:
44 * - hadoop.ipc wrapped exceptions
45 * - nested exceptions
46 * Returns null if we didn't find the exception.
47 * TODO: this code is mostly C/Ped from RegionMovedExecption. Due to the limitations of
48 * generics it's not amenable to generalizing without adding parameters/isAssignableFrom.
49 * Might make general if used in more places.
50 */
51 public static RegionOpeningException find(Object exception) {
52 if (exception == null || !(exception instanceof Throwable)) {
53 return null;
54 }
55 RegionOpeningException res = null;
56 Throwable cur = (Throwable)exception;
57 while (res == null && cur != null) {
58 if (cur instanceof RegionOpeningException) {
59 res = (RegionOpeningException) cur;
60 } else {
61 if (cur instanceof RemoteException) {
62 RemoteException re = (RemoteException) cur;
63 Exception e = re.unwrapRemoteException(RegionOpeningException.class);
64 if (e == null) {
65 e = re.unwrapRemoteException();
66 }
67 // unwrapRemoteException can return the exception given as a parameter when it cannot
68 // unwrap it. In this case, there is no need to look further
69 // noinspection ObjectEquality
70 if (e != re) {
71 res = find(e);
72 }
73 }
74 cur = cur.getCause();
75 }
76 }
77 return res;
78 }
79 }