/**
* Copyright 2009 the original author or authors.
*
* Licensed 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 net.sf.katta.lib.mapfile;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import net.sf.katta.AbstractTest;
import net.sf.katta.node.IContentServer;
import net.sf.katta.testutil.TestResources;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.log4j.Logger;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
* Test for {@link MapFileServer }.
*/
public class MapFileServerTest extends AbstractTest {
@SuppressWarnings("unused")
private static Logger LOG = Logger.getLogger(MapFileServerTest.class);
private static final String NODE_NAME = "TestNode";
private static final String SHARD_A_1 = "shard_A_1";
private static final String SHARD_A_2 = "shard_A_2";
private static final String SHARD_A_3 = "shard_A_3";
private static final String SHARD_A_4 = "shard_A_4";
private static final String SHARD_B_1 = "shard_B_1";
private static final String SHARD_B_2 = "shard_B_2";
@Test
public void testShardA1() throws Exception {
MapFileServer server = new MapFileServer();
server.init(NODE_NAME, newNodeConfiguration());
server.addShard(SHARD_A_1, new File(TestResources.MAP_FILE_A, "a1"));
assertNotNull(server.getShardMetaData(SHARD_A_1));
assertEquals("3", server.getShardMetaData(SHARD_A_1).get(IContentServer.SHARD_SIZE_KEY));
String[] shards = new String[] { SHARD_A_1 };
assertEquals("This is a test", getOneResult(server, "a.txt", shards));
assertMissing(server, "d.html", shards);
assertMissing(server, "v.xml", shards);
assertMissing(server, "y.xml", shards);
assertMissing(server, "not-found", shards);
server.shutdown();
}
@Test
public void testShardA2() throws Exception {
MapFileServer server = new MapFileServer();
server.init(NODE_NAME, newNodeConfiguration());
server.addShard(SHARD_A_2, new File(TestResources.MAP_FILE_A, "a2"));
assertEquals("3", server.getShardMetaData(SHARD_A_2).get(IContentServer.SHARD_SIZE_KEY));
String[] shards = new String[] { SHARD_A_2 };
assertEquals("<b>test</b>", getOneResult(server, "d.html", shards));
assertMissing(server, "a.txt", shards);
assertMissing(server, "v.xml", shards);
assertMissing(server, "y.xml", shards);
assertMissing(server, "not-found", shards);
server.shutdown();
}
@Test
public void testMapFile1() throws Exception {
MapFileServer server = new MapFileServer();
server.init(NODE_NAME, newNodeConfiguration());
server.addShard(SHARD_A_1, new File(TestResources.MAP_FILE_A, "a1"));
server.addShard(SHARD_A_2, new File(TestResources.MAP_FILE_A, "a2"));
server.addShard(SHARD_A_3, new File(TestResources.MAP_FILE_A, "a3"));
server.addShard(SHARD_A_4, new File(TestResources.MAP_FILE_A, "a4"));
assertEquals("3", server.getShardMetaData(SHARD_A_1).get(IContentServer.SHARD_SIZE_KEY));
assertEquals("3", server.getShardMetaData(SHARD_A_2).get(IContentServer.SHARD_SIZE_KEY));
assertEquals("2", server.getShardMetaData(SHARD_A_3).get(IContentServer.SHARD_SIZE_KEY));
assertEquals("4", server.getShardMetaData(SHARD_A_4).get(IContentServer.SHARD_SIZE_KEY));
String[] shards = new String[] { SHARD_A_1, SHARD_A_2, SHARD_A_3, SHARD_A_4 };
assertEquals("This is a test", getOneResult(server, "a.txt", shards));
assertEquals("<b>test</b>", getOneResult(server, "d.html", shards));
assertEquals("Test in part 3", getOneResult(server, "h.txt", shards));
assertEquals("test data", getOneResult(server, "k.out", shards));
assertMissing(server, "v.xml", shards);
assertMissing(server, "y.xml", shards);
assertMissing(server, "not-found", shards);
server.shutdown();
}
@Test
public void testBothMapFiles() throws Exception {
MapFileServer server = new MapFileServer();
server.init(NODE_NAME, newNodeConfiguration());
server.addShard(SHARD_A_1, new File(TestResources.MAP_FILE_A, "a1"));
server.addShard(SHARD_A_2, new File(TestResources.MAP_FILE_A, "a2"));
server.addShard(SHARD_A_3, new File(TestResources.MAP_FILE_A, "a3"));
server.addShard(SHARD_A_4, new File(TestResources.MAP_FILE_A, "a4"));
server.addShard(SHARD_B_1, new File(TestResources.MAP_FILE_B, "b1"));
server.addShard(SHARD_B_2, new File(TestResources.MAP_FILE_B, "b2"));
assertEquals("3", server.getShardMetaData(SHARD_A_1).get(IContentServer.SHARD_SIZE_KEY));
assertEquals("3", server.getShardMetaData(SHARD_A_2).get(IContentServer.SHARD_SIZE_KEY));
assertEquals("2", server.getShardMetaData(SHARD_A_3).get(IContentServer.SHARD_SIZE_KEY));
assertEquals("4", server.getShardMetaData(SHARD_A_4).get(IContentServer.SHARD_SIZE_KEY));
assertEquals("3", server.getShardMetaData(SHARD_B_1).get(IContentServer.SHARD_SIZE_KEY));
assertEquals("3", server.getShardMetaData(SHARD_B_2).get(IContentServer.SHARD_SIZE_KEY));
String[] shards = new String[] { SHARD_A_1, SHARD_A_2, SHARD_A_3, SHARD_A_4, SHARD_B_1, SHARD_B_2 };
String[] mf1Shards = new String[] { SHARD_A_1, SHARD_A_2, SHARD_A_3, SHARD_A_4 };
String[] mf2Shards = new String[] { SHARD_B_1, SHARD_B_2 };
assertEquals("This is a test", getOneResult(server, "a.txt", shards));
assertMissing(server, "a.txt", mf2Shards);
assertEquals("<b>test</b>", getOneResult(server, "d.html", shards));
assertMissing(server, "d.html", mf2Shards);
assertEquals("Test in part 3", getOneResult(server, "h.txt", shards));
assertMissing(server, "h.txt", mf2Shards);
assertEquals("test data", getOneResult(server, "k.out", shards));
assertMissing(server, "k.out", mf2Shards);
assertEquals("where is test", getOneResult(server, "w.txt", shards));
assertMissing(server, "w.txt", mf1Shards);
assertEquals("xrays ionize", getOneResult(server, "x.txt", shards));
assertMissing(server, "x.txt", mf1Shards);
assertMissing(server, "not-found", shards);
server.shutdown();
}
@Test
public void testMultiThreadedAccess() throws Exception {
final MapFileServer server = new MapFileServer();
server.init(NODE_NAME, newNodeConfiguration());
server.addShard(SHARD_A_1, new File(TestResources.MAP_FILE_A, "a1"));
server.addShard(SHARD_A_2, new File(TestResources.MAP_FILE_A, "a2"));
server.addShard(SHARD_A_3, new File(TestResources.MAP_FILE_A, "a3"));
server.addShard(SHARD_A_4, new File(TestResources.MAP_FILE_A, "a4"));
server.addShard(SHARD_B_1, new File(TestResources.MAP_FILE_B, "b1"));
server.addShard(SHARD_B_2, new File(TestResources.MAP_FILE_B, "b2"));
final String[] shards = new String[] { SHARD_A_1, SHARD_A_2, SHARD_A_3, SHARD_A_4, SHARD_B_1, SHARD_B_2 };
final Map<String, String> entries = new HashMap<String, String>();
entries.put("a.txt", "This is a test");
entries.put("b.xml", "<name>test</name>");
entries.put("d.html", "<b>test</b>");
entries.put("h.txt", "Test in part 3");
entries.put("i.xml", "<i>test</i>");
entries.put("k.out", "test data");
entries.put("w.txt", "where is test");
entries.put("x.txt", "xrays ionize");
entries.put("z.xml", "<zed>foo</zed>");
final List<String> keys = new ArrayList<String>(entries.keySet());
Random rand = new Random("katta".hashCode());
List<Thread> threads = new ArrayList<Thread>();
final List<Exception> exceptions = new ArrayList<Exception>();
long startTime = System.currentTimeMillis();
final AtomicInteger count = new AtomicInteger(0);
for (int i = 0; i < 20; i++) {
final Random rand2 = new Random(rand.nextInt());
Thread t = new Thread(new Runnable() {
public void run() {
for (int j = 0; j < 500; j++) {
int n = rand2.nextInt(entries.size());
String key = keys.get(n);
try {
assertEquals(entries.get(key), getOneResult(server, key, shards));
count.incrementAndGet();
} catch (Exception e) {
System.err.println(e);
exceptions.add(e);
break;
}
}
}
});
threads.add(t);
t.start();
}
for (Thread t : threads) {
t.join();
}
long time = System.currentTimeMillis() - startTime;
System.out.println((1000.0 * count.intValue() / time) + " requests / sec");
assertTrue(exceptions.isEmpty());
}
protected String getOneResult(IMapFileServer server, String key, String[] shards) throws Exception {
TextArrayWritable texts = server.get(new Text(key), shards);
assertNotNull(texts);
assertNotNull(texts.array);
Writable[] array = texts.array.get();
assertEquals(1, array.length);
assertTrue(array[0] instanceof Text);
Text text = (Text) array[0];
return text.toString();
}
private void assertMissing(IMapFileServer server, String key, String[] shards) throws Exception {
TextArrayWritable texts = server.get(new Text(key), shards);
assertNotNull(texts);
assertNotNull(texts.array);
Writable[] array = texts.array.get();
assertEquals(0, array.length);
}
}