HBASE-9021 Create a unit test for ReplicationHLogReaderManager
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1505892 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9c1a498432
commit
be6adbdd7e
|
@ -0,0 +1,201 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hadoop.hbase.replication.regionserver;
|
||||
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.fs.FileSystem;
|
||||
import org.apache.hadoop.fs.Path;
|
||||
import org.apache.hadoop.hbase.HBaseTestingUtility;
|
||||
import org.apache.hadoop.hbase.HConstants;
|
||||
import org.apache.hadoop.hbase.HRegionInfo;
|
||||
import org.apache.hadoop.hbase.HTableDescriptor;
|
||||
import org.apache.hadoop.hbase.KeyValue;
|
||||
import org.apache.hadoop.hbase.MediumTests;
|
||||
import org.apache.hadoop.hbase.regionserver.wal.HLog;
|
||||
import org.apache.hadoop.hbase.regionserver.wal.HLogFactory;
|
||||
import org.apache.hadoop.hbase.regionserver.wal.HLogKey;
|
||||
import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;
|
||||
import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
|
||||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
import org.apache.hadoop.hdfs.MiniDFSCluster;
|
||||
import org.junit.After;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
import org.junit.experimental.categories.Category;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Category(MediumTests.class)
|
||||
public class TestReplicationHLogReaderManager {
|
||||
|
||||
private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
|
||||
private static Configuration conf;
|
||||
private static Path hbaseDir;
|
||||
private static FileSystem fs;
|
||||
private static MiniDFSCluster cluster;
|
||||
private static final byte [] tableName = Bytes.toBytes("tablename");
|
||||
private static final byte [] family = Bytes.toBytes("column");
|
||||
private static final byte [] qualifier = Bytes.toBytes("qualifier");
|
||||
private static final HRegionInfo info = new HRegionInfo(tableName,
|
||||
HConstants.EMPTY_START_ROW, HConstants.LAST_ROW, false);
|
||||
private static final HTableDescriptor htd = new HTableDescriptor(tableName);
|
||||
|
||||
private HLog log;
|
||||
private ReplicationHLogReaderManager logManager;
|
||||
private PathWatcher pathWatcher;
|
||||
|
||||
|
||||
@BeforeClass
|
||||
public static void setUpBeforeClass() throws Exception {
|
||||
TEST_UTIL.startMiniDFSCluster(3);
|
||||
|
||||
conf = TEST_UTIL.getConfiguration();
|
||||
hbaseDir = TEST_UTIL.createRootDir();
|
||||
cluster = TEST_UTIL.getDFSCluster();
|
||||
fs = cluster.getFileSystem();
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void tearDownAfterClass() throws Exception {
|
||||
TEST_UTIL.shutdownMiniCluster();
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
logManager = new ReplicationHLogReaderManager(fs, conf);
|
||||
List<WALActionsListener> listeners = new ArrayList<WALActionsListener>();
|
||||
pathWatcher = new PathWatcher();
|
||||
listeners.add(pathWatcher);
|
||||
log = HLogFactory.createHLog(fs, hbaseDir, "test", conf, listeners, "some server");
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
log.closeAndDelete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test() throws Exception {
|
||||
// Grab the path that was generated when the log rolled as part of its creation
|
||||
Path path = pathWatcher.currentPath;
|
||||
|
||||
// open it, it's empty so it fails
|
||||
try {
|
||||
logManager.openReader(path);
|
||||
fail("Shouldn't be able to open an empty file");
|
||||
} catch (EOFException ex) {}
|
||||
|
||||
assertEquals(0, logManager.getPosition());
|
||||
|
||||
appendToLog();
|
||||
|
||||
// There's one edit in the log, read it. Reading past it needs to return nulls
|
||||
assertNotNull(logManager.openReader(path));
|
||||
logManager.seek();
|
||||
HLog.Entry[] entriesArray = new HLog.Entry[1];
|
||||
HLog.Entry entry = logManager.readNextAndSetPosition(entriesArray, 0);
|
||||
assertNotNull(entry);
|
||||
entry = logManager.readNextAndSetPosition(entriesArray, 0);
|
||||
assertNull(entry);
|
||||
logManager.closeReader();
|
||||
long oldPos = logManager.getPosition();
|
||||
|
||||
appendToLog();
|
||||
|
||||
// Read the newly added entry, make sure we made progress
|
||||
assertNotNull(logManager.openReader(path));
|
||||
logManager.seek();
|
||||
entry = logManager.readNextAndSetPosition(entriesArray, 0);
|
||||
assertNotEquals(oldPos, logManager.getPosition());
|
||||
assertNotNull(entry);
|
||||
logManager.closeReader();
|
||||
oldPos = logManager.getPosition();
|
||||
|
||||
log.rollWriter();
|
||||
|
||||
// We rolled but we still should see the end of the first log and not get data
|
||||
assertNotNull(logManager.openReader(path));
|
||||
logManager.seek();
|
||||
entry = logManager.readNextAndSetPosition(entriesArray, 0);
|
||||
assertEquals(oldPos, logManager.getPosition());
|
||||
assertNull(entry);
|
||||
logManager.finishCurrentFile();
|
||||
|
||||
path = pathWatcher.currentPath;
|
||||
|
||||
// Finally we have a new empty log, which should still give us EOFs
|
||||
try {
|
||||
logManager.openReader(path);
|
||||
fail();
|
||||
} catch (EOFException ex) {}
|
||||
|
||||
}
|
||||
|
||||
private void appendToLog() throws IOException {
|
||||
log.append(info, tableName, getWALEdit(), System.currentTimeMillis(), htd);
|
||||
}
|
||||
|
||||
private WALEdit getWALEdit() {
|
||||
WALEdit edit = new WALEdit();
|
||||
edit.add(new KeyValue(Bytes.toBytes(System.currentTimeMillis()), family, qualifier,
|
||||
System.currentTimeMillis(), qualifier));
|
||||
return edit;
|
||||
}
|
||||
|
||||
class PathWatcher implements WALActionsListener {
|
||||
|
||||
Path currentPath;
|
||||
|
||||
@Override
|
||||
public void preLogRoll(Path oldPath, Path newPath) throws IOException {
|
||||
currentPath = newPath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postLogRoll(Path oldPath, Path newPath) throws IOException {}
|
||||
|
||||
@Override
|
||||
public void preLogArchive(Path oldPath, Path newPath) throws IOException {}
|
||||
|
||||
@Override
|
||||
public void postLogArchive(Path oldPath, Path newPath) throws IOException {}
|
||||
|
||||
@Override
|
||||
public void logRollRequested() {}
|
||||
|
||||
@Override
|
||||
public void logCloseRequested() {}
|
||||
|
||||
@Override
|
||||
public void visitLogEntryBeforeWrite(HRegionInfo info, HLogKey logKey, WALEdit logEdit) {}
|
||||
|
||||
@Override
|
||||
public void visitLogEntryBeforeWrite(HTableDescriptor htd, HLogKey logKey, WALEdit logEdit) {}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue