View Javadoc

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  
20  package org.apache.hadoop.hbase.exceptions;
21  
22  import java.net.ConnectException;
23  
24  import org.apache.hadoop.hbase.ServerName;
25  import org.apache.hadoop.hbase.classification.InterfaceAudience;
26  import org.apache.hadoop.hbase.classification.InterfaceStability;
27  
28  /**
29   * Thrown when the client believes that we are trying to communicate to has
30   * been repeatedly unresponsive for a while.
31   *
32   * On receiving such an exception. The HConnectionManager will skip all
33   * retries and fast fail the operation.
34   */
35  @InterfaceAudience.Public
36  @InterfaceStability.Evolving
37  public class PreemptiveFastFailException extends ConnectException {
38    private static final long serialVersionUID = 7129103682617007177L;
39    private long failureCount, timeOfFirstFailureMilliSec, timeOfLatestAttemptMilliSec;
40  
41    // If set, we guarantee that no modifications went to server
42    private boolean guaranteedClientSideOnly;
43  
44    /**
45     * @param count num of consecutive failures
46     * @param timeOfFirstFailureMilliSec when first failure happened
47     * @param timeOfLatestAttemptMilliSec when last attempt happened
48     * @param serverName server we failed to connect to
49     */
50    public PreemptiveFastFailException(long count, long timeOfFirstFailureMilliSec,
51        long timeOfLatestAttemptMilliSec, ServerName serverName) {
52      super("Exception happened " + count + " times. to" + serverName);
53      this.failureCount = count;
54      this.timeOfFirstFailureMilliSec = timeOfFirstFailureMilliSec;
55      this.timeOfLatestAttemptMilliSec = timeOfLatestAttemptMilliSec;
56    }
57  
58    /**
59     * @param count num of consecutive failures
60     * @param timeOfFirstFailureMilliSec when first failure happened
61     * @param timeOfLatestAttemptMilliSec when last attempt happened
62     * @param serverName server we failed to connect to
63     * @param guaranteedClientSideOnly if true, guarantees that no mutations
64     *   have been applied on the server
65     */
66    public PreemptiveFastFailException(long count, long timeOfFirstFailureMilliSec,
67                                       long timeOfLatestAttemptMilliSec, ServerName serverName,
68                                       boolean guaranteedClientSideOnly) {
69      super("Exception happened " + count + " times. to" + serverName);
70      this.failureCount = count;
71      this.timeOfFirstFailureMilliSec = timeOfFirstFailureMilliSec;
72      this.timeOfLatestAttemptMilliSec = timeOfLatestAttemptMilliSec;
73      this.guaranteedClientSideOnly = guaranteedClientSideOnly;
74    }
75  
76    /**
77     * @return time of the fist failure
78     */
79    public long getFirstFailureAt() {
80      return timeOfFirstFailureMilliSec;
81    }
82  
83    /**
84     * @return time of the latest attempt
85     */
86    public long getLastAttemptAt() {
87      return timeOfLatestAttemptMilliSec;
88    }
89  
90    /**
91     * @return failure count
92     */
93    public long getFailureCount() {
94      return failureCount;
95    }
96  
97    /**
98     * @return true if operation was attempted by server, false otherwise.
99     */
100   public boolean wasOperationAttemptedByServer() {
101     return false;
102   }
103 
104   /**
105    * @return true if we know no mutation made it to the server, false otherwise.
106    */
107   public boolean isGuaranteedClientSideOnly() {
108     return guaranteedClientSideOnly;
109   }
110 }