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.regionserver.wal;
20
21 import java.io.IOException;
22
23 import org.apache.hadoop.fs.Path;
24 import org.apache.hadoop.hbase.HRegionInfo;
25 import org.apache.hadoop.hbase.HTableDescriptor;
26 import org.apache.hadoop.hbase.classification.InterfaceAudience;
27 import org.apache.hadoop.hbase.wal.WALKey;
28
29 /**
30 * Get notification of WAL events. The invocations are inline
31 * so make sure your implementation is fast else you'll slow hbase.
32 */
33 @InterfaceAudience.Private
34 public interface WALActionsListener {
35
36 /**
37 * The WAL is going to be rolled. The oldPath can be null if this is
38 * the first log file from the regionserver.
39 * @param oldPath the path to the old wal
40 * @param newPath the path to the new wal
41 */
42 void preLogRoll(Path oldPath, Path newPath) throws IOException;
43
44 /**
45 * The WAL has been rolled. The oldPath can be null if this is
46 * the first log file from the regionserver.
47 * @param oldPath the path to the old wal
48 * @param newPath the path to the new wal
49 */
50 void postLogRoll(Path oldPath, Path newPath) throws IOException;
51
52 /**
53 * The WAL is going to be archived.
54 * @param oldPath the path to the old wal
55 * @param newPath the path to the new wal
56 */
57 void preLogArchive(Path oldPath, Path newPath) throws IOException;
58
59 /**
60 * The WAL has been archived.
61 * @param oldPath the path to the old wal
62 * @param newPath the path to the new wal
63 */
64 void postLogArchive(Path oldPath, Path newPath) throws IOException;
65
66 /**
67 * A request was made that the WAL be rolled.
68 */
69 void logRollRequested(boolean tooFewReplicas);
70
71 /**
72 * The WAL is about to close.
73 */
74 void logCloseRequested();
75
76 /**
77 * Called before each write.
78 * @param info
79 * @param logKey
80 * @param logEdit
81 */
82 void visitLogEntryBeforeWrite(
83 HRegionInfo info, WALKey logKey, WALEdit logEdit
84 );
85
86 /**
87 *
88 * @param htd
89 * @param logKey
90 * @param logEdit
91 * TODO: Retire this in favor of {@link #visitLogEntryBeforeWrite(HRegionInfo, WALKey, WALEdit)}
92 * It only exists to get scope when replicating. Scope should be in the WALKey and not need
93 * us passing in a <code>htd</code>.
94 */
95 void visitLogEntryBeforeWrite(HTableDescriptor htd, WALKey logKey,
96 WALEdit logEdit) throws IOException;
97
98 /**
99 * For notification post append to the writer. Used by metrics system at least.
100 * TODO: Combine this with above.
101 * @param entryLen approx length of cells in this append.
102 * @param elapsedTimeMillis elapsed time in milliseconds.
103 */
104 void postAppend(final long entryLen, final long elapsedTimeMillis);
105
106 /**
107 * For notification post writer sync. Used by metrics system at least.
108 * @param timeInNanos How long the filesystem sync took in nanoseconds.
109 * @param handlerSyncs How many sync handler calls were released by this call to filesystem
110 * sync.
111 */
112 void postSync(final long timeInNanos, final int handlerSyncs);
113
114 static class Base implements WALActionsListener {
115 @Override
116 public void preLogRoll(Path oldPath, Path newPath) throws IOException {}
117
118 @Override
119 public void postLogRoll(Path oldPath, Path newPath) throws IOException {}
120
121 @Override
122 public void preLogArchive(Path oldPath, Path newPath) throws IOException {}
123
124 @Override
125 public void postLogArchive(Path oldPath, Path newPath) throws IOException {}
126
127 @Override
128 public void logRollRequested(boolean tooFewReplicas) {}
129
130 @Override
131 public void logCloseRequested() {}
132
133 @Override
134 public void visitLogEntryBeforeWrite(HRegionInfo info, WALKey logKey, WALEdit logEdit) {}
135
136 @Override
137 public void visitLogEntryBeforeWrite(HTableDescriptor htd, WALKey logKey,
138 WALEdit logEdit) throws IOException {
139 }
140
141 @Override
142 public void postAppend(final long entryLen, final long elapsedTimeMillis) {}
143
144 @Override
145 public void postSync(final long timeInNanos, final int handlerSyncs) {}
146 }
147 }