use of voldemort.utils.ConsistencyFix.BadKey in project voldemort by voldemort.
the class ConsistencyFixTest method testBadKeyWriter.
@Test
public void testBadKeyWriter() {
String tmpDir = TestUtils.createTempDir().getAbsolutePath();
String fileName = tmpDir + "BadKeyFile";
// Set up bad key writer
BlockingQueue<BadKeyStatus> bq = new ArrayBlockingQueue<BadKeyStatus>(5);
ExecutorService badKeyWriterService = Executors.newSingleThreadExecutor();
BadKeyWriter badKeyWriter = new BadKeyWriter(fileName, bq);
badKeyWriterService.submit(badKeyWriter);
// Enqueue stuff for bad key writer to write
try {
for (int i = 0; i < 100; ++i) {
BadKey badKey = new BadKey(Integer.toHexString(i), Integer.toHexString(i) + "\n");
bq.put(new BadKeyStatus(badKey, ConsistencyFix.Status.REPAIR_EXCEPTION));
}
// Poison bad key writer
bq.put(new BadKeyStatus());
} catch (InterruptedException e) {
e.printStackTrace();
fail("Unexpected exception");
}
// wait for bad key writer to shutdown
badKeyWriterService.shutdown();
try {
badKeyWriterService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
fail("Unexpected exception");
}
assertFalse(badKeyWriter.hasException());
// Read output file & verify.
try {
BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
int i = 0;
for (String keyLine = fileReader.readLine(); keyLine != null; keyLine = fileReader.readLine()) {
assertEquals(keyLine, Integer.toHexString(i));
i++;
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
fail("Unexpected exception");
} catch (IOException ioe) {
ioe.printStackTrace();
fail("Unexpected exception");
}
}
use of voldemort.utils.ConsistencyFix.BadKey in project voldemort by voldemort.
the class ConsistencyFixTest method testBadKeyResult.
@Test
public void testBadKeyResult() {
BadKey badKey = new BadKey("0101", "0101\n");
ConsistencyFix.BadKeyStatus bkr1 = new BadKeyStatus(badKey, ConsistencyFix.Status.SUCCESS);
assertFalse(bkr1.isPoison());
assertEquals(bkr1.getBadKey().getKeyInHexFormat(), "0101");
assertEquals(bkr1.getBadKey().getReaderInput(), "0101\n");
assertEquals(bkr1.getStatus(), ConsistencyFix.Status.SUCCESS);
ConsistencyFix.BadKeyStatus bkr2 = new BadKeyStatus();
assertTrue(bkr2.isPoison());
assertEquals(bkr2.getBadKey(), null);
assertEquals(bkr2.getStatus(), null);
}
use of voldemort.utils.ConsistencyFix.BadKey in project voldemort by voldemort.
the class ConsistencyFixWorkerTest method testRepair.
public void testRepair(int[] putNodes, boolean orphan) {
byte[] bKey = TestUtils.randomBytes(10);
String hexKey = ByteUtils.toHexString(bKey);
ByteArray baKey = new ByteArray(bKey);
BadKey badKey;
QueryKeyResult queryKeyResult;
if (!orphan) {
badKey = new BadKey(hexKey, hexKey + "\n");
queryKeyResult = null;
} else {
StringBuilder orphanInput = new StringBuilder();
orphanInput.append(hexKey + "," + "1\n");
List<Versioned<byte[]>> values = new ArrayList<Versioned<byte[]>>(0);
int arbitraryNodeId = 2;
Versioned<byte[]> versioned = TestUtils.getVersioned(TestUtils.randomBytes(25), arbitraryNodeId);
orphanInput.append(ByteUtils.toHexString(versioned.getValue()));
orphanInput.append("," + versioned.toString() + "\n");
values.add(versioned);
badKey = new BadKey(hexKey, orphanInput.toString());
queryKeyResult = new QueryKeyResult(baKey, values);
}
Versioned<byte[]> value = TestUtils.getVersioned(TestUtils.randomBytes(25), 0);
String url = ConsistencyFixTest.setUpCluster();
ConsistencyFix consistencyFix = new ConsistencyFix(url, ConsistencyFixTest.STORE_NAME, 100, 100, false, false);
AdminClient adminClient = consistencyFix.getAdminClient();
System.out.println("Initial get");
for (int i = 0; i < 4; ++i) {
List<Versioned<byte[]>> results;
results = adminClient.storeOps.getNodeKey(ConsistencyFixTest.STORE_NAME, i, baKey);
assertTrue(results.size() == 0);
}
System.out.println("Puts");
for (int putNode : putNodes) {
NodeValue<ByteArray, byte[]> nodeKeyValue;
nodeKeyValue = new NodeValue<ByteArray, byte[]>(putNode, baKey, value);
adminClient.storeOps.putNodeKeyValue(ConsistencyFixTest.STORE_NAME, nodeKeyValue);
}
// Construct normal consistency fix worker
ConsistencyFixWorker consistencyFixWorker = null;
if (!orphan) {
consistencyFixWorker = new ConsistencyFixWorker(badKey, consistencyFix, null);
} else {
consistencyFixWorker = new ConsistencyFixWorker(badKey, consistencyFix, null, queryKeyResult);
}
consistencyFixWorker.run();
System.out.println("Second get");
int expectedNumVersions = 0;
if (putNodes.length > 0) {
expectedNumVersions++;
}
if (orphan) {
expectedNumVersions++;
}
for (int i = 0; i < 4; ++i) {
System.out.println("Node : " + i);
List<Versioned<byte[]>> results;
results = adminClient.storeOps.getNodeKey(ConsistencyFixTest.STORE_NAME, i, baKey);
for (Versioned<byte[]> v : results) {
System.out.println("\t" + v.getVersion());
}
assertTrue(results.size() == expectedNumVersions);
}
}
Aggregations