use of edu.snu.mist.client.MISTQuery in project mist by snuspl.
the class QueryInfoStoreTest method diskStoreTest.
/**
* Tests whether the PlanStore correctly saves, deletes and loads the operator chain dag.
* @throws InjectionException
* @throws IOException
*/
@Test(timeout = 1000)
public void diskStoreTest() throws InjectionException, IOException {
// Generate a query
final MISTQueryBuilder queryBuilder = new MISTQueryBuilder();
queryBuilder.setApplicationId(TestParameters.SUPER_GROUP_ID);
queryBuilder.socketTextStream(TestParameters.LOCAL_TEXT_SOCKET_SOURCE_CONF).flatMap(s -> Arrays.asList(s.split(" "))).filter(s -> s.startsWith("A")).map(s -> new Tuple2<>(s, 1)).reduceByKey(0, String.class, (Integer x, Integer y) -> x + y).textSocketOutput(TestParameters.HOST, TestParameters.SINK_PORT);
final MISTQuery query = queryBuilder.build();
// Jar files
final List<ByteBuffer> jarFiles = new LinkedList<>();
final ByteBuffer byteBuffer1 = ByteBuffer.wrap(new byte[] { 0, 1, 0, 1, 1, 1 });
jarFiles.add(byteBuffer1);
final JavaConfigurationBuilder jcb = Tang.Factory.getTang().newConfigurationBuilder();
jcb.bindNamedParameter(DriverHostname.class, DRIVER_HOSTNAME);
jcb.bindNamedParameter(MasterToDriverPort.class, String.valueOf(DRIVER_PORT));
final Injector injector = Tang.Factory.getTang().newInjector(jcb.build());
final QueryInfoStore store = injector.getInstance(QueryInfoStore.class);
final ApplicationCodeManager applicationCodeManager = injector.getInstance(ApplicationCodeManager.class);
final ApplicationMap applicationMap = injector.getInstance(ApplicationMap.class);
final String queryId1 = "testQuery1";
final String queryId2 = "testQuery2";
final String tmpFolderPath = injector.getNamedInstance(SharedStorePath.class);
final File folder = new File(tmpFolderPath);
// Store jar files
final List<String> paths = applicationCodeManager.registerNewAppCode(jarFiles).getJarPaths();
for (int i = 0; i < jarFiles.size(); i++) {
final ByteBuffer buf = ByteBuffer.allocateDirect(jarFiles.get(i).capacity());
final String path = paths.get(i);
final FileInputStream fis = new FileInputStream(path);
final FileChannel channel = fis.getChannel();
channel.read(buf);
Assert.assertEquals(jarFiles.get(i), buf);
}
final ApplicationInfo applicationInfo = mock(ApplicationInfo.class);
when(applicationInfo.getApplicationId()).thenReturn(TestParameters.SUPER_GROUP_ID);
when(applicationInfo.getJarFilePath()).thenReturn(paths);
applicationMap.putIfAbsent(TestParameters.SUPER_GROUP_ID, applicationInfo);
// Generate logical plan
final Tuple<List<AvroVertex>, List<Edge>> serializedDag = query.getAvroOperatorDag();
final AvroDag.Builder avroDagBuilder = AvroDag.newBuilder();
final AvroDag avroDag1 = avroDagBuilder.setAppId(TestParameters.SUPER_GROUP_ID).setQueryId(TestParameters.QUERY_ID).setJarPaths(paths).setAvroVertices(serializedDag.getKey()).setEdges(serializedDag.getValue()).build();
final AvroDag avroDag2 = avroDagBuilder.setAppId(TestParameters.SUPER_GROUP_ID).setQueryId(TestParameters.QUERY_ID).setJarPaths(paths).setAvroVertices(serializedDag.getKey()).setEdges(serializedDag.getValue()).build();
// Store the chained dag
store.saveAvroDag(new Tuple<>(queryId1, avroDag1));
store.saveAvroDag(new Tuple<>(queryId2, avroDag2));
while (!(store.isStored(queryId1) && store.isStored(queryId2))) {
// Wait until the plan is stored
}
Assert.assertTrue(new File(tmpFolderPath, queryId1 + ".plan").exists());
Assert.assertTrue(new File(tmpFolderPath, queryId2 + ".plan").exists());
// Test stored file
final AvroDag loadedDag1 = store.load(queryId1);
Assert.assertEquals(avroDag1.getEdges(), loadedDag1.getEdges());
Assert.assertEquals(avroDag1.getSchema(), loadedDag1.getSchema());
testVerticesEqual(avroDag1.getAvroVertices(), loadedDag1.getAvroVertices());
final AvroDag loadedDag2 = store.load(queryId2);
Assert.assertEquals(avroDag2.getEdges(), loadedDag2.getEdges());
Assert.assertEquals(avroDag2.getSchema(), loadedDag2.getSchema());
testVerticesEqual(avroDag2.getAvroVertices(), loadedDag2.getAvroVertices());
// Test deletion
store.delete(queryId1);
store.delete(queryId2);
Assert.assertFalse(store.isStored(queryId1));
Assert.assertFalse(new File(tmpFolderPath, queryId1 + ".plan").exists());
Assert.assertFalse(store.isStored(queryId2));
Assert.assertFalse(new File(tmpFolderPath, queryId2 + ".plan").exists());
for (final String path : paths) {
Assert.assertFalse(new File(path).exists());
}
folder.delete();
}
Aggregations