1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.regionserver;
19
20 import java.io.IOException;
21 import java.util.Collection;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.NavigableMap;
25 import java.util.TreeMap;
26
27 import org.apache.hadoop.hbase.Cell;
28 import org.apache.hadoop.hbase.classification.InterfaceAudience;
29 import org.apache.hadoop.hbase.regionserver.StoreFile.Writer;
30
31
32
33
34
35 @InterfaceAudience.Private
36 public class DateTieredMultiFileWriter extends AbstractMultiFileWriter {
37
38 private final NavigableMap<Long, StoreFile.Writer> lowerBoundary2Writer
39 = new TreeMap<Long, StoreFile.Writer>();
40
41 private final boolean needEmptyFile;
42
43
44
45
46
47 public DateTieredMultiFileWriter(List<Long> lowerBoundaries, boolean needEmptyFile) {
48 for (Long lowerBoundary : lowerBoundaries) {
49 lowerBoundary2Writer.put(lowerBoundary, null);
50 }
51 this.needEmptyFile = needEmptyFile;
52 }
53
54 @Override
55 public void append(Cell cell) throws IOException {
56 Map.Entry<Long, StoreFile.Writer> entry = lowerBoundary2Writer.floorEntry(cell.getTimestamp());
57 StoreFile.Writer writer = entry.getValue();
58 if (writer == null) {
59 writer = writerFactory.createWriter();
60 lowerBoundary2Writer.put(entry.getKey(), writer);
61 }
62 writer.append(cell);
63 }
64
65 @Override
66 protected Collection<Writer> writers() {
67 return lowerBoundary2Writer.values();
68 }
69
70 @Override
71 protected void preCommitWriters() throws IOException {
72 if (!needEmptyFile) {
73 return;
74 }
75 for (StoreFile.Writer writer : lowerBoundary2Writer.values()) {
76 if (writer != null) {
77 return;
78 }
79 }
80
81 lowerBoundary2Writer.put(lowerBoundary2Writer.firstKey(), writerFactory.createWriter());
82 }
83 }