1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.replication.regionserver;
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.conf.Configuration;
25 import org.apache.hadoop.fs.FileSystem;
26 import org.apache.hadoop.fs.Path;
27 import org.apache.hadoop.hbase.regionserver.wal.HLog;
28 import org.apache.hadoop.hbase.regionserver.wal.WALEditCodec;
29
30 import java.io.IOException;
31
32
33
34
35
36 @InterfaceAudience.Private
37 public class ReplicationHLogReaderManager {
38
39 private static final Log LOG = LogFactory.getLog(ReplicationHLogReaderManager.class);
40 private final WALEditCodec nonCompressingCodec = new WALEditCodec();
41 private final FileSystem fs;
42 private final Configuration conf;
43 private long position = 0;
44 private HLog.Reader reader;
45 private Path lastPath;
46
47
48
49
50
51
52
53 public ReplicationHLogReaderManager(FileSystem fs, Configuration conf) {
54 this.fs = fs;
55 this.conf = conf;
56 }
57
58
59
60
61
62
63
64 public HLog.Reader openReader(Path path) throws IOException {
65
66
67 if (this.reader == null || !this.lastPath.equals(path)) {
68 this.closeReader();
69 this.reader = HLog.getReader(this.fs, path, this.conf);
70 this.lastPath = path;
71 } else {
72 try {
73 this.reader.reset();
74 } catch (NullPointerException npe) {
75 throw new IOException("NPE resetting reader, likely HDFS-4380", npe);
76 }
77 }
78 return this.reader;
79 }
80
81
82
83
84
85
86
87
88 public HLog.Entry readNextAndSetPosition(HLog.Entry[] entriesArray,
89 int currentNbEntries) throws IOException {
90 HLog.Entry entry = this.reader.next(entriesArray[currentNbEntries]);
91
92
93
94
95 this.position = this.reader.getPosition();
96
97 if (entry != null) {
98 entry.getKey().setCompressionContext(null);
99 entry.getEdit().setCodec(nonCompressingCodec);
100 }
101 return entry;
102 }
103
104
105
106
107
108 public void seek() throws IOException {
109 if (this.position != 0) {
110 this.reader.seek(this.position);
111 }
112 }
113
114
115
116
117
118 public long getPosition() {
119 return this.position;
120 }
121
122 public void setPosition(long pos) {
123 this.position = pos;
124 }
125
126
127
128
129
130 public void closeReader() throws IOException {
131 if (this.reader != null) {
132 this.reader.close();
133 this.reader = null;
134 }
135 }
136
137
138
139
140 public void finishCurrentFile() {
141 this.position = 0;
142 try {
143 this.closeReader();
144 } catch (IOException e) {
145 LOG.warn("Unable to close reader", e);
146 }
147 }
148
149 }