1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.regionserver.wal;
21
22 import java.io.IOException;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.apache.hadoop.hbase.HRegionInfo;
27 import org.apache.hadoop.hbase.HTableDescriptor;
28 import org.apache.hadoop.hbase.classification.InterfaceAudience;
29 import org.apache.hadoop.hbase.protobuf.generated.WALProtos;
30 import org.apache.hadoop.hbase.protobuf.generated.WALProtos.CompactionDescriptor;
31 import org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor;
32 import org.apache.hadoop.hbase.protobuf.generated.WALProtos.RegionEventDescriptor;
33 import org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl;
34 import org.apache.hadoop.hbase.wal.WAL;
35 import org.apache.hadoop.hbase.wal.WALKey;
36
37 import com.google.protobuf.TextFormat;
38
39
40
41
42
43
44 @InterfaceAudience.Private
45 public class WALUtil {
46 private static final Log LOG = LogFactory.getLog(WALUtil.class);
47
48 private WALUtil() {
49
50 }
51
52
53
54
55
56
57
58
59 public static long writeCompactionMarker(WAL wal, HTableDescriptor htd, HRegionInfo hri,
60 final CompactionDescriptor c, MultiVersionConcurrencyControl mvcc)
61 throws IOException {
62 long trx = writeMarker(wal, htd, hri, WALEdit.createCompaction(hri, c), mvcc, true);
63 if (LOG.isTraceEnabled()) {
64 LOG.trace("Appended compaction marker " + TextFormat.shortDebugString(c));
65 }
66 return trx;
67 }
68
69
70
71
72 public static long writeFlushMarker(WAL wal, HTableDescriptor htd, HRegionInfo hri,
73 final FlushDescriptor f, boolean sync, MultiVersionConcurrencyControl mvcc)
74 throws IOException {
75 long trx = writeMarker(wal, htd, hri, WALEdit.createFlushWALEdit(hri, f), mvcc, sync);
76 if (LOG.isTraceEnabled()) {
77 LOG.trace("Appended flush marker " + TextFormat.shortDebugString(f));
78 }
79 return trx;
80 }
81
82
83
84
85 public static long writeRegionEventMarker(WAL wal, HTableDescriptor htd, HRegionInfo hri,
86 final RegionEventDescriptor r, final MultiVersionConcurrencyControl mvcc)
87 throws IOException {
88 long trx = writeMarker(wal, htd, hri, WALEdit.createRegionEventWALEdit(hri, r), mvcc, true);
89 if (LOG.isTraceEnabled()) {
90 LOG.trace("Appended region event marker " + TextFormat.shortDebugString(r));
91 }
92 return trx;
93 }
94
95
96
97
98
99
100
101
102
103
104
105 public static long writeBulkLoadMarkerAndSync(final WAL wal, final HTableDescriptor htd,
106 final HRegionInfo hri, final WALProtos.BulkLoadDescriptor desc,
107 final MultiVersionConcurrencyControl mvcc)
108 throws IOException {
109 long trx = writeMarker(wal, htd, hri, WALEdit.createBulkLoadEvent(hri, desc), mvcc, true);
110 if (LOG.isTraceEnabled()) {
111 LOG.trace("Appended Bulk Load marker " + TextFormat.shortDebugString(desc));
112 }
113 return trx;
114 }
115
116 private static long writeMarker(final WAL wal, final HTableDescriptor htd, final HRegionInfo hri,
117 final WALEdit edit, final MultiVersionConcurrencyControl mvcc, final boolean sync)
118 throws IOException {
119
120 WALKey key =
121 new HLogKey(hri.getEncodedNameAsBytes(), hri.getTable(), System.currentTimeMillis(), mvcc);
122
123 long trx = MultiVersionConcurrencyControl.NONE;
124 try {
125 trx = wal.append(htd, hri, key, edit, false);
126 if (sync) wal.sync(trx);
127 } finally {
128
129
130
131 MultiVersionConcurrencyControl.WriteEntry we = key.getWriteEntry();
132 if (mvcc != null && we != null) mvcc.complete(we);
133 }
134 return trx;
135 }
136 }