#1456: Cleaned up and refactored exaudfclient cc#642
Conversation
| #ifdef ENABLE_JAVA_VM | ||
| #include "javacontainer/javacontainer_builder.h" | ||
| #endif //ENABLE_JAVA_VM | ||
|
|
||
| #ifdef ENABLE_PYTHON_VM | ||
| #include "python/pythoncontainer.h" | ||
| #endif //ENABLE_PYTHON_VM | ||
|
|
||
| #ifdef UDF_PLUGIN_CLIENT | ||
| #include "protegrityclient.h" | ||
| #endif //UDF_PLUGIN_CLIENT | ||
|
|
||
| #ifdef ENABLE_STREAMING_VM | ||
| #include "streaming_container/streamingcontainer.h" | ||
| #endif | ||
|
|
||
| #ifdef ENABLE_BENCHMARK_VM | ||
| #include "benchmark_container/benchmark_container.h" | ||
| #endif |
There was a problem hiding this comment.
Can be moved into exaudfclient/exa_vm_factory.cc
| if((error = dlerror()) != nullptr) { | ||
| std::stringstream sb; | ||
| sb << "Error when trying to load symbol '" << symbol_name << "': " << error; | ||
| fprintf(stderr, "dlsym error: %s loading symbol %s\n", error, sb.str().c_str()); |
There was a problem hiding this comment.
We already using streams for constructing sb, so we probably can also use cerr directly and don't need the string stream and the fprintf
|
|
||
| void* handle = dlmopen(LM_ID_NEWLM, stdLibPath.c_str(), RTLD_NOW); | ||
| if (!handle) { | ||
| fprintf(stderr, "dlmopen error: %s; while loading %s\n", dlerror(), stdLibPath.c_str()); |
There was a problem hiding this comment.
We probably could move this also to cerr
|
|
||
| void setup_environment() { | ||
| if (::setenv("HOME", "/tmp", 1) == -1) { | ||
| fprintf(stderr, "Failed setting HOME env var: %s\n", std::strerror(errno)); |
There was a problem hiding this comment.
We probably move this also to cerr
| DBGVAR(std::cerr, libexaudflibPath); | ||
| void* handle = exa_load_libary(libexaudflibPath); | ||
| if (!handle) { | ||
| fprintf(stderr, "Failed to load library: %s\n", libexaudflibPath.c_str()); |
There was a problem hiding this comment.
We are already using cerr, so we probably can use it here, too
| exit(EXIT_FAILURE); | ||
| } | ||
| std::string libexaudflibPath; | ||
| #ifdef CUSTOM_LIBEXAUDFLIB_PATH |
There was a problem hiding this comment.
Maybe we should move the ifdef into its own function, this would make this function easier to read
|
|
||
| mb_useCtpgParser = false; | ||
| if(argc == 4) { | ||
| mb_useCtpgParser = is_use_ctpg_parser(argv[3]); |
There was a problem hiding this comment.
This introduces a bug: If there is no fourth CLI parameter, the environment variable SCRIPT_OPTIONS_PARSER_VERSION is never eveluated!
|
|
||
| // Parser option 2 means use ctpg parser. | ||
| // argv_parser_option is command line argument as it is | ||
| bool ExaUdfClientBase::is_use_ctpg_parser(const std::string& argv_parser_option) { |
There was a problem hiding this comment.
is_use_ctpg_parser is a strange name. Maybe just use_ctpg_parser?
| #endif //ENABLE_PYTHON_VM | ||
|
|
||
| void ExaUdfClientPython::usage(const std::string& programName) { | ||
| std::cerr << "Usage: " << programName << " <socket> lang=python <scriptOptionsParserVersion=1|2>" |
There was a problem hiding this comment.
scriptOptionsParserVersion is actually only relevant for Java
|
|
||
| setup_environment(); | ||
| std::function<SWIGVMContainers::SWIGVM*()> vmMaker; | ||
| switch(m_lang) { |
There was a problem hiding this comment.
The Base class should be an abstract class and call here create_vm, however don't implement it. You mixed implementation of the client that supports all languages with the implementation of the abstract class. For the moment, we need the ExaudfclientBase as abstract class, ExaudfclientAllLangs, and we can add for each language its Exaudfclient{Lang} if we want to, however I would wait with later until we do the split into repos.
tkilias
left a comment
There was a problem hiding this comment.
Accidentally approved, please see my comments
| void* exa_load_libary(const std::string& stdLibPath); | ||
| void* exa_load_symbol(void *handle, const std::string& symbol_name); No newline at end of file |
There was a problem hiding this comment.
Should be moved into a separate namespace?
| @@ -0,0 +1,3 @@ | |||
| #pragma once | |||
|
|
|||
| void setup_environment(); No newline at end of file | |||
|
|
||
| void setup_environment() { | ||
| if (::setenv("HOME", "/tmp", 1) == -1) { | ||
| std::cerr << "Failed setting HOME env var: " << std::strerror(errno) << std::endl; |
There was a problem hiding this comment.
In the old implementation we raised an exception.
| std::cerr << "Failed setting HOME env var: " << std::strerror(errno) << std::endl; | ||
| } | ||
| if (::setlocale(LC_ALL, "en_US.utf8") == nullptr) { | ||
| std::cerr << "Failed setting locale: " << std::strerror(errno) << std::endl; |
| DBGMSG(std::cerr, "Load libexaudflib"); | ||
| DBGVAR(std::cerr, libexaudflibPath); | ||
| void* exaudflib_handle = exa_load_libary(libexaudflibPath); | ||
| if (!exaudflib_handle) { | ||
| std::cerr << "Failed to load library: " << libexaudflibPath << std::endl; | ||
| exit(EXIT_FAILURE); | ||
| } | ||
| set_exaudflib_handle(exaudflib_handle); | ||
|
|
||
| MAIN_FUN exaudfclient_main = (MAIN_FUN)exa_load_symbol(exaudflib_handle, "exaudfclient_main"); | ||
| SET_SWIGVM_PARAMS set_SWIGVM_params = (SET_SWIGVM_PARAMS)exa_load_symbol(exaudflib_handle, "set_SWIGVM_params"); | ||
|
|
||
| setup_environment(); | ||
| std::function<SWIGVMContainers::SWIGVM*()> vmMaker = create_vm(); | ||
|
|
||
| SWIGVMContainers::SWIGVM_params = new SWIGVMContainers::SWIGVM_params_t(true); | ||
| set_SWIGVM_params(SWIGVMContainers::SWIGVM_params); | ||
| return exaudfclient_main(vmMaker, argc, argv); |
| void ExaUdfClient::parse_arguments(int argc, char** argv) { | ||
| // Now assumption is that all cmd line aguments are already validated. | ||
| m_languageArg = argv[2]; | ||
|
|
There was a problem hiding this comment.
Add comment from old implementation
| /* | |
| * The given script-options-parser version set by the environment variable "SCRIPT_OPTIONS_PARSER_VERSION" | |
| * must have priority over the CLI argument "scriptOptionsParserVersion=x". | |
| * This allows clients to override the parser version in a specific UDF, if needed, | |
| * via "%env SCRIPT_OPTIONS_PARSER_VERSION=x". | |
| */ |
| if executable.startswith("/opt/conda"): | ||
| expected_prefix = "/opt/conda" | ||
| else: | ||
| expected_prefix = "/usr" |
There was a problem hiding this comment.
This can't work.
For the udf-client with the bug (PATH variable without /opt/conda/bin) the executable was empty.
My suggestion: create two folders under ./test_container/tests/test/python3:
python_apt
python_conda
and then configure the flavor ci.config accordingly.
Also remember we should execute this test for the debug build.
For me it's ok to fix this later in another PR, we just need to create a ticket.
| #include "exaudflib/vm/swig_vm.h" | ||
|
|
||
| void* handle; | ||
| static void* exaudflib_handle; |
| exaudflib_handle = handle; | ||
| } | ||
|
|
||
| void* load_dynamic(const char* name) { |
There was a problem hiding this comment.
Check if exaudflib_handle != nullptr
relates to #1456