HBASE-9278 Reading Pre-namespace meta table edits kills the reader; COMMIT CONTINUATION

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1518402 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael Stack 2013-08-28 21:58:25 +00:00
parent 2112f2dc9f
commit f8c51ac73b
1 changed files with 158 additions and 0 deletions

View File

@ -0,0 +1,158 @@
/**
*
* 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.regionserver.wal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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.HBaseConfiguration;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.MediumTests;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* Tests to read old ROOT, Meta edits.
*/
@Category(MediumTests.class)
public class TestReadOldRootAndMetaEdits {
private final static Log LOG = LogFactory.getLog(TestReadOldRootAndMetaEdits.class);
private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
private static FileSystem fs;
private static Path dir;
@BeforeClass
public static void setupBeforeClass() throws Exception {
TEST_UTIL.getConfiguration().setClass("hbase.regionserver.hlog.writer.impl",
SequenceFileLogWriter.class, HLog.Writer.class);
fs = TEST_UTIL.getTestFileSystem();
dir = new Path(TEST_UTIL.createRootDir(), "testReadOldRootAndMetaEdits");
fs.mkdirs(dir);
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
/**
* Inserts three waledits in the wal file, and reads them back. The first edit is of a regular
* table, second waledit is for the ROOT table (it will be ignored while reading),
* and last waledit is for the META table, which will be linked to the new system:meta table.
* @throws IOException
*/
@Test
public void testReadOldRootAndMetaEdits() throws IOException {
LOG.debug("testReadOldRootAndMetaEdits");
Configuration conf = HBaseConfiguration.create();
conf.setClass("hbase.regionserver.hlog.writer.impl", SequenceFileLogWriter.class,
HLog.Writer.class);
// kv list to be used for all WALEdits.
byte[] row = Bytes.toBytes("row");
KeyValue kv = new KeyValue(row, row, row, row);
List<KeyValue> kvs = new ArrayList<KeyValue>();
kvs.add(kv);
HLog.Writer writer = null;
HLog.Reader reader = null;
// a regular table
TableName t = TableName.valueOf("t");
HRegionInfo tRegionInfo = null;
int logCount = 0;
long timestamp = System.currentTimeMillis();
Path path = new Path(dir, "t");
try {
tRegionInfo = new HRegionInfo(t, HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW);
HLog.Entry tEntry = createAEntry(new HLogKey(tRegionInfo.getEncodedNameAsBytes(), t,
++logCount, timestamp, HConstants.DEFAULT_CLUSTER_ID), kvs);
// create a old root edit (-ROOT-).
HLog.Entry rootEntry = createAEntry(new HLogKey(Bytes.toBytes(TableName.OLD_ROOT_STR),
TableName.OLD_ROOT_TABLE_NAME, ++logCount, timestamp,
HConstants.DEFAULT_CLUSTER_ID), kvs);
// create a old meta edit (.META.).
HLog.Entry oldMetaEntry = createAEntry(new HLogKey(Bytes.toBytes(TableName.OLD_META_STR),
TableName.OLD_META_TABLE_NAME, ++logCount, timestamp,
HConstants.DEFAULT_CLUSTER_ID), kvs);
// write above entries
writer = HLogFactory.createWriter(fs, path, conf);
writer.append(tEntry);
writer.append(rootEntry);
writer.append(oldMetaEntry);
// sync/close the writer
writer.sync();
writer.close();
// read the log and see things are okay.
reader = HLogFactory.createReader(fs, path, conf);
HLog.Entry entry = reader.next();
assertNotNull(entry);
assertTrue(entry.getKey().getTablename().equals(t));
assertEquals(Bytes.toString(entry.getKey().getEncodedRegionName()),
Bytes.toString(tRegionInfo.getEncodedNameAsBytes()));
// read the ROOT waledit, but that will be ignored, and META waledit will be read instead.
entry = reader.next();
assertEquals(entry.getKey().getTablename(), TableName.META_TABLE_NAME);
// should reach end of log
assertNull(reader.next());
} finally {
if (writer != null) {
writer.close();
}
if (reader != null) {
reader.close();
}
}
}
/**
* Creates a WALEdit for the passed KeyValues and returns a HLog.Entry instance composed of
* the WALEdit and passed HLogKey.
* @return HLog.Entry instance for the passed HLogKey and KeyValues
*/
private HLog.Entry createAEntry(HLogKey hlogKey, List<KeyValue> kvs) {
WALEdit edit = new WALEdit();
for (KeyValue kv : kvs )
edit.add(kv);
return new HLog.Entry(hlogKey, edit);
}
}