use of org.apache.drill.exec.proto.UserBitShared.Registry in project drill by axbaretto.
the class TestDynamicUDFSupport method testRegistrationFailDuringRegistryUpdate.
@Test
public void testRegistrationFailDuringRegistryUpdate() throws Exception {
final RemoteFunctionRegistry remoteFunctionRegistry = spyRemoteFunctionRegistry();
final Path registryPath = hadoopToJavaPath(remoteFunctionRegistry.getRegistryArea());
final Path stagingPath = hadoopToJavaPath(remoteFunctionRegistry.getStagingArea());
final Path tmpPath = hadoopToJavaPath(remoteFunctionRegistry.getTmpArea());
final String errorMessage = "Failure during remote registry update.";
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
assertTrue("Binary should be present in registry area", registryPath.resolve(default_binary_name).toFile().exists());
assertTrue("Source should be present in registry area", registryPath.resolve(default_source_name).toFile().exists());
throw new RuntimeException(errorMessage);
}
}).when(remoteFunctionRegistry).updateRegistry(any(Registry.class), any(DataChangeVersion.class));
copyDefaultJarsToStagingArea();
testBuilder().sqlQuery("create function using jar '%s'", default_binary_name).unOrdered().baselineColumns("ok", "summary").baselineValues(false, errorMessage).go();
assertTrue("Registry area should be empty", ArrayUtils.isEmpty(registryPath.toFile().listFiles()));
assertTrue("Temporary area should be empty", ArrayUtils.isEmpty(tmpPath.toFile().listFiles()));
assertTrue("Binary should be present in staging area", stagingPath.resolve(default_binary_name).toFile().exists());
assertTrue("Source should be present in staging area", stagingPath.resolve(default_source_name).toFile().exists());
}
use of org.apache.drill.exec.proto.UserBitShared.Registry in project drill by axbaretto.
the class TestDynamicUDFSupport method testSuccessfulRegistrationAfterSeveralRetryAttempts.
@Test
public void testSuccessfulRegistrationAfterSeveralRetryAttempts() throws Exception {
final RemoteFunctionRegistry remoteFunctionRegistry = spyRemoteFunctionRegistry();
final Path registryPath = hadoopToJavaPath(remoteFunctionRegistry.getRegistryArea());
final Path stagingPath = hadoopToJavaPath(remoteFunctionRegistry.getStagingArea());
final Path tmpPath = hadoopToJavaPath(remoteFunctionRegistry.getTmpArea());
copyDefaultJarsToStagingArea();
doThrow(new VersionMismatchException("Version mismatch detected", 1)).doThrow(new VersionMismatchException("Version mismatch detected", 1)).doCallRealMethod().when(remoteFunctionRegistry).updateRegistry(any(Registry.class), any(DataChangeVersion.class));
String summary = "The following UDFs in jar %s have been registered:\n" + "[custom_lower(VARCHAR-REQUIRED)]";
testBuilder().sqlQuery("create function using jar '%s'", default_binary_name).unOrdered().baselineColumns("ok", "summary").baselineValues(true, String.format(summary, default_binary_name)).go();
verify(remoteFunctionRegistry, times(3)).updateRegistry(any(Registry.class), any(DataChangeVersion.class));
assertTrue("Staging area should be empty", ArrayUtils.isEmpty(stagingPath.toFile().listFiles()));
assertTrue("Temporary area should be empty", ArrayUtils.isEmpty(tmpPath.toFile().listFiles()));
assertTrue("Binary should be present in registry area", registryPath.resolve(default_binary_name).toFile().exists());
assertTrue("Source should be present in registry area", registryPath.resolve(default_source_name).toFile().exists());
Registry registry = remoteFunctionRegistry.getRegistry(new DataChangeVersion());
assertEquals("Registry should contain one jar", registry.getJarList().size(), 1);
assertEquals(registry.getJar(0).getName(), default_binary_name);
}
use of org.apache.drill.exec.proto.UserBitShared.Registry in project drill by apache.
the class TestDynamicUDFSupport method testRegistrationFailDuringRegistryUpdate.
@Test
public void testRegistrationFailDuringRegistryUpdate() throws Exception {
RemoteFunctionRegistry remoteFunctionRegistry = spyRemoteFunctionRegistry();
Path registryPath = hadoopToJavaPath(remoteFunctionRegistry.getRegistryArea());
Path stagingPath = hadoopToJavaPath(remoteFunctionRegistry.getStagingArea());
Path tmpPath = hadoopToJavaPath(remoteFunctionRegistry.getTmpArea());
final String errorMessage = "Failure during remote registry update.";
doAnswer(invocation -> {
assertTrue("Binary should be present in registry area", registryPath.resolve(defaultBinaryJar).toFile().exists());
assertTrue("Source should be present in registry area", registryPath.resolve(defaultSourceJar).toFile().exists());
throw new RuntimeException(errorMessage);
}).when(remoteFunctionRegistry).updateRegistry(any(Registry.class), any(DataChangeVersion.class));
copyDefaultJarsToStagingArea();
testBuilder().sqlQuery("create function using jar '%s'", defaultBinaryJar).unOrdered().baselineColumns("ok", "summary").baselineValues(false, errorMessage).go();
assertTrue("Registry area should be empty", ArrayUtils.isEmpty(registryPath.toFile().listFiles()));
assertTrue("Temporary area should be empty", ArrayUtils.isEmpty(tmpPath.toFile().listFiles()));
assertTrue("Binary should be present in staging area", stagingPath.resolve(defaultBinaryJar).toFile().exists());
assertTrue("Source should be present in staging area", stagingPath.resolve(defaultSourceJar).toFile().exists());
}
use of org.apache.drill.exec.proto.UserBitShared.Registry in project drill by apache.
the class TestDynamicUDFSupport method testSuccessfulRegistrationAfterSeveralRetryAttempts.
@Test
public void testSuccessfulRegistrationAfterSeveralRetryAttempts() throws Exception {
RemoteFunctionRegistry remoteFunctionRegistry = spyRemoteFunctionRegistry();
Path registryPath = hadoopToJavaPath(remoteFunctionRegistry.getRegistryArea());
Path stagingPath = hadoopToJavaPath(remoteFunctionRegistry.getStagingArea());
Path tmpPath = hadoopToJavaPath(remoteFunctionRegistry.getTmpArea());
copyDefaultJarsToStagingArea();
doThrow(new VersionMismatchException("Version mismatch detected", 1)).doThrow(new VersionMismatchException("Version mismatch detected", 1)).doCallRealMethod().when(remoteFunctionRegistry).updateRegistry(any(Registry.class), any(DataChangeVersion.class));
String summary = "The following UDFs in jar %s have been registered:\n" + "[custom_lower(VARCHAR-REQUIRED)]";
testBuilder().sqlQuery("create function using jar '%s'", defaultBinaryJar).unOrdered().baselineColumns("ok", "summary").baselineValues(true, String.format(summary, defaultBinaryJar)).go();
verify(remoteFunctionRegistry, times(3)).updateRegistry(any(Registry.class), any(DataChangeVersion.class));
assertTrue("Staging area should be empty", ArrayUtils.isEmpty(stagingPath.toFile().listFiles()));
assertTrue("Temporary area should be empty", ArrayUtils.isEmpty(tmpPath.toFile().listFiles()));
assertTrue("Binary should be present in registry area", registryPath.resolve(defaultBinaryJar).toFile().exists());
assertTrue("Source should be present in registry area", registryPath.resolve(defaultSourceJar).toFile().exists());
Registry registry = remoteFunctionRegistry.getRegistry(new DataChangeVersion());
assertEquals("Registry should contain one jar", registry.getJarList().size(), 1);
assertEquals(registry.getJar(0).getName(), defaultBinaryJar);
}
use of org.apache.drill.exec.proto.UserBitShared.Registry in project drill by apache.
the class TestDynamicUDFSupport method testLazyInitConcurrent.
@Test
public void testLazyInitConcurrent() throws Exception {
FunctionImplementationRegistry functionImplementationRegistry = spyFunctionImplementationRegistry();
copyDefaultJarsToStagingArea();
test("create function using jar '%s'", defaultBinaryJar);
final CountDownLatch latch1 = new CountDownLatch(1);
final CountDownLatch latch2 = new CountDownLatch(1);
final String query = "select custom_lower('A') from (values(1))";
doAnswer(invocation -> {
latch1.await();
boolean result = (boolean) invocation.callRealMethod();
assertTrue("syncWithRemoteRegistry() should return true", result);
latch2.countDown();
return true;
}).doAnswer(invocation -> {
latch1.countDown();
latch2.await();
boolean result = (boolean) invocation.callRealMethod();
assertTrue("syncWithRemoteRegistry() should return true", result);
return true;
}).when(functionImplementationRegistry).syncWithRemoteRegistry(anyInt());
SimpleQueryRunner simpleQueryRunner = new SimpleQueryRunner(query);
Thread thread1 = new Thread(simpleQueryRunner);
Thread thread2 = new Thread(simpleQueryRunner);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
verify(functionImplementationRegistry, times(2)).syncWithRemoteRegistry(anyInt());
LocalFunctionRegistry localFunctionRegistry = (LocalFunctionRegistry) FieldUtils.readField(functionImplementationRegistry, "localFunctionRegistry", true);
assertEquals("Sync function registry version should match", 2, localFunctionRegistry.getVersion());
}
Aggregations