1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.snapshot;
19
20 import static org.junit.Assert.assertEquals;
21 import static org.junit.Assert.assertFalse;
22
23 import org.apache.hadoop.fs.FSDataOutputStream;
24 import org.apache.hadoop.fs.FileStatus;
25 import org.apache.hadoop.fs.FileSystem;
26 import org.apache.hadoop.fs.Path;
27 import org.apache.hadoop.hbase.HBaseTestingUtility;
28 import org.apache.hadoop.hbase.SmallTests;
29 import org.apache.hadoop.hbase.errorhandling.ForeignException;
30 import org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher;
31 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
32 import org.apache.hadoop.hbase.regionserver.wal.HLogUtil;
33 import org.apache.hadoop.hbase.snapshot.CopyRecoveredEditsTask;
34 import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;
35 import org.apache.hadoop.hbase.util.FSUtils;
36 import org.junit.Test;
37 import org.junit.experimental.categories.Category;
38 import org.mockito.Mockito;
39
40
41
42
43 @Category(SmallTests.class)
44 public class TestCopyRecoveredEditsTask {
45
46 private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();
47
48 @Test
49 public void testCopyFiles() throws Exception {
50
51 SnapshotDescription snapshot = SnapshotDescription.newBuilder().setName("snapshot").build();
52 ForeignExceptionDispatcher monitor = Mockito.mock(ForeignExceptionDispatcher.class);
53 FileSystem fs = UTIL.getTestFileSystem();
54 Path root = UTIL.getDataTestDir();
55 String regionName = "regionA";
56 Path regionDir = new Path(root, regionName);
57 Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, root);
58
59 try {
60
61 Path snapshotRegionDir = new Path(workingDir, regionName);
62 fs.mkdirs(snapshotRegionDir);
63
64
65 Path edits = HLogUtil.getRegionDirRecoveredEditsDir(regionDir);
66 fs.mkdirs(edits);
67
68 Path file1 = new Path(edits, "0000000000000002352");
69 FSDataOutputStream out = fs.create(file1);
70 byte[] data = new byte[] { 1, 2, 3, 4 };
71 out.write(data);
72 out.close();
73
74 Path empty = new Path(edits, "empty");
75 fs.createNewFile(empty);
76
77 CopyRecoveredEditsTask task = new CopyRecoveredEditsTask(snapshot, monitor, fs, regionDir,
78 snapshotRegionDir);
79 CopyRecoveredEditsTask taskSpy = Mockito.spy(task);
80 taskSpy.call();
81
82 Path snapshotEdits = HLogUtil.getRegionDirRecoveredEditsDir(snapshotRegionDir);
83 FileStatus[] snapshotEditFiles = FSUtils.listStatus(fs, snapshotEdits);
84 assertEquals("Got wrong number of files in the snapshot edits", 1, snapshotEditFiles.length);
85 FileStatus file = snapshotEditFiles[0];
86 assertEquals("Didn't copy expected file", file1.getName(), file.getPath().getName());
87
88 Mockito.verify(monitor, Mockito.never()).receive(Mockito.any(ForeignException.class));
89 Mockito.verify(taskSpy, Mockito.never()).snapshotFailure(Mockito.anyString(),
90 Mockito.any(Exception.class));
91
92 } finally {
93
94 FSUtils.delete(fs, regionDir, true);
95 FSUtils.delete(fs, workingDir, true);
96 }
97 }
98
99
100
101
102
103 @Test
104 public void testNoEditsDir() throws Exception {
105 SnapshotDescription snapshot = SnapshotDescription.newBuilder().setName("snapshot").build();
106 ForeignExceptionDispatcher monitor = Mockito.mock(ForeignExceptionDispatcher.class);
107 FileSystem fs = UTIL.getTestFileSystem();
108 Path root = UTIL.getDataTestDir();
109 String regionName = "regionA";
110 Path regionDir = new Path(root, regionName);
111 Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, root);
112 try {
113
114 Path snapshotRegionDir = new Path(workingDir, regionName);
115 fs.mkdirs(snapshotRegionDir);
116 Path regionEdits = HLogUtil.getRegionDirRecoveredEditsDir(regionDir);
117 assertFalse("Edits dir exists already - it shouldn't", fs.exists(regionEdits));
118
119 CopyRecoveredEditsTask task = new CopyRecoveredEditsTask(snapshot, monitor, fs, regionDir,
120 snapshotRegionDir);
121 task.call();
122 } finally {
123
124 FSUtils.delete(fs, regionDir, true);
125 FSUtils.delete(fs, workingDir, true);
126 }
127 }
128 }