Thomas Braun (c4148791) at 20 Mar 15:08
The use case is https://gitlab.com/tango-controls/docker/ci/cpp/debian12 where we right now have different branches for each version. The reason is that only with this approach we can use the Docker.gitlab.yml because it requires the docker file to be Dockerfile and also only pushes to the a registry destination named like the branch.
We would like to move away from these multiple branches and just use one branch (main).
Then we would have multiple docker files a la
Dockerfile.main
Dockerfile.lts
...
and some customized CI on top of Docker.gitlab.yml:
build-image-main:
extends: build-image
variables:
DOCKERFILE: "Dockerfile.main"
DESTINATION: "cppTango_version_main"
build-image-lts:
extends: build-image
variables:
DOCKERFILE: "Dockerfile.lts"
DESTINATION: "cppTango_version_lts"
...
The build-image job should then also not complain that there is no Dockerfile.
@beenje Is that feasible?
Thomas Braun (6ed43950) at 20 Mar 15:08
Merge branch 'improve-docker-template' into 'main'
... and 1 more commit
Allow to extend the build-image job to build images based on different Dockerfiles.
Fix #14
I tested with parallel here: https://gitlab.com/tango-controls/docker/tango-test/-/jobs/10976621086
Or with extend: https://gitlab.com/tango-controls/docker/tango-test/-/jobs/10976666940
If you want the job to run with the default values and add an extra job, I'd use extend.
If you don't want the default values, parallel might be better.
Anyway, if DOCKERFILE doesn't exist, the job won't run. So you don't have to overwrite the default build-image if Dockerfile doesn't exist.
Yes sorry, this sunk too deep on the todo list. Yes let's merge now.
I already added an entry to AOB for the next kernel meeting.
@dlacoste-esrf And I'm glad to already found some supporter ;)
Thanks for chiming in. The cpptango-dbg package holds the stripped off debug symbols, see https://github.com/conda-forge/cpptango-feedstock/blob/b467aa7b6828feb9dde44d4abe830b82427a2a88/recipe/build.sh#L21. The build prefix is only a minor issue and that can be worked around with gdb's solib-search-path.
I can do it if you want or we squeeze it in this one and be doneā¦
Feel free to squeeze it in here. This is also easy to test, see `catch2_tango_type_traits.cpp. Yes we really do have some unit tests.
I've created TangoTickets#134 with my learnings about getting symbol info for conda packages.
As to the crash this is in the mysql client library. So it looks like we are doing something wrong. I'll try to come up with a reproducer.
In the logs from 1 I see
Mar 18 09:29:58 tangohost01 start_Databaseds[69686]: 2026-03-18T09:29:58,491907+0100 ERROR (DatabaseConnectionPool.cpp:209) sys/database/2 DatabaseConnectionPool::GetDatabase: Error pinging the database with connection 0 with Lost connection to MySQL server during query
Mar 18 09:29:58 tangohost01 start_Databaseds[69686]: 2026-03-18T09:29:58,491914+0100 ERROR (DatabaseConnectionPool.cpp:211) sys/database/2 Trying reconnection now ...
and it might be the case that the connection recreation is somehow faulty.
What I mean is that the DevState check should be in is_enum_compatible and that used everywhere.
We use get_ref_type for describe output in the matchers. If that also matches DevState then this needs fixing as also
$git grep DevState | grep enum
src/include/tango/server/Attribute.h: template <class T, std::enable_if_t<std::is_enum_v<T> && !std::is_same_v<T, Tango::DevState>, T> * = nullptr>
src/include/tango/server/Attribute_templ.h:template <class T, std::enable_if_t<std::is_enum_v<T> && !std::is_same_v<T, Tango::DevState>, T> *>
src/include/tango/server/WAttribute.h: template <class T, std::enable_if_t<std::is_enum_v<T> && !std::is_same_v<T, Tango::DevState>, T> * = nullptr>
src/include/tango/server/WAttribute_templ.h:template <class T, std::enable_if_t<std::is_enum_v<T> && !std::is_same_v<T, Tango::DevState>, T> *>
tests/catch2_test_dtypes.cpp:struct is_scalar_state_boolean_string_enum<Tango::DevState> : std::true_type
looks suspicous. But not here or?
Well generating a stacktrace when the binaries are from conda is ... fun ..
Stacktrace:
#0 0x00007f56189c53f9 in free_state_change_info(MYSQL_EXTENSION*) () from /home/thomas/micromamba/envs/database-115-repro/lib/libmysqlclient.so.24.1.0
#1 0x00007f56189d40a6 in mysql_send_query () from /home/thomas/micromamba/envs/database-115-repro/lib/libmysqlclient.so.24.1.0
#2 0x00007f56189d41b6 in mysql_real_query () from /home/thomas/micromamba/envs/database-115-repro/lib/libmysqlclient.so.24.1.0
#3 0x0000562b4577e50a in DataBase_ns::DataBase::simple_query (this=this@entry=0x562b6c9ba730,
sql_query={static npos = 18446744073709551615, _M_dataplus = {<std::allocator<char>> = {<std::__new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x7f5598003a60 "SELECT exported,ior,version,pid,server,host,class FROM device WHERE name = 'dserver/bahrmannsteppermotorcontrol/17192821';"}, _M_string_length = 122, {_M_local_buf = "z\000\000\000\000\000\000\000{\000\000\000\000\000\000", _M_allocated_capacity = 122}}, method=method@entry=0x562b457975b3 "db_import_device()",
dch=@0x7f560cff7478: {m_dcp = {<std::__shared_ptr<DatabaseConnectionPool, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<DatabaseConnectionPool, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x562b6c9af870, _M_refcount = {_M_pi = 0x562b6c9af860}}, <No data fields>}, m_id = 0, m_db = 0x7f5600006a40}) at /usr/local/src/conda/tango-database-5.28/DataBaseUtils.cpp:463
#4 0x0000562b45781643 in DataBase_ns::DataBase::query (this=this@entry=0x562b6c9ba730,
sql_query={static npos = 18446744073709551615, _M_dataplus = {<std::allocator<char>> = {<std::__new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x7f55980039d0 "SELECT exported,ior,version,pid,server,host,class FROM device WHERE name = 'dserver/bahrmannsteppermotorcontrol/17192821';"}, _M_string_length = 122, {_M_local_buf = "z\000\000\000\000\000\000\000\000'\266\025F\257\316\004", _M_allocated_capacity = 122}}, method=method@entry=0x562b457975b3 "db_import_device()",
dch=@0x7f560cff7478: {m_dcp = {<std::__shared_ptr<DatabaseConnectionPool, (__gnu_cxx::_Lock_policy)2>> = {<std::__shared_ptr_access<DatabaseConnectionPool, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x562b6c9af870, _M_refcount = {_M_pi = 0x562b6c9af860}}, <No data fields>}, m_id = 0, m_db = 0x7f5600006a40}) at /usr/local/src/conda/tango-database-5.28/DataBaseUtils.cpp:500
#5 0x0000562b4574332d in DataBase_ns::DataBase::db_import_device (this=0x562b6c9ba730, argin=<optimized out>) at /usr/local/src/conda/tango-database-5.28/DataBase.cpp:5582
#6 0x0000562b4575f26c in DataBase_ns::DbImportDeviceClass::execute (this=0x562b6c9b5f10, device=0x562b6c9ba730,
in_any=@0x7f55980051a0: {pd_tc = 0x7f55980051d0, pd_mbuf = 0x7f5598005050, pd_data = 0x7f55980035c0, pd_marshal = 0x7f5618624500 <marshalString_fn(cdrStream&, void*)>, pd_destructor = 0x7f56186244f0 <deleteString_fn(void*)>})
at /usr/local/src/conda/tango-database-5.28/DataBaseClass.cpp:1316
#7 0x00007f5619538150 in Tango::DeviceClass::command_handler(Tango::DeviceImpl*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, CORBA::Any const&) () from /home/thomas/micromamba/envs/database-115-repro/lib/libtango.so.10.1.2
#8 0x00007f56194e3c85 in Tango::DeviceImpl::command_inout(char const*, CORBA::Any const&) () from /home/thomas/micromamba/envs/database-115-repro/lib/libtango.so.10.1.2
#9 0x00007f56191e5370 in Tango::Device_2Impl::command_inout_2(char const*, CORBA::Any const&, Tango::DevSource) [clone .cold] () from /home/thomas/micromamba/envs/database-115-repro/lib/libtango.so.10.1.2
#10 0x00007f561952353d in Tango::Device_4Impl::command_inout_4(char const*, CORBA::Any const&, Tango::DevSource, Tango::ClntIdent const&) () from /home/thomas/micromamba/envs/database-115-repro/lib/libtango.so.10.1.2
#11 0x00007f5619400e61 in _0RL_lcfn_6fe2f94a21a10053_a3000000(omniCallDescriptor*, omniServant*) () from /home/thomas/micromamba/envs/database-115-repro/lib/libtango.so.10.1.2
#12 0x00007f56194ce9a9 in Tango::client_call_interceptor(omniCallDescriptor*, omniServant*) () from /home/thomas/micromamba/envs/database-115-repro/lib/libtango.so.10.1.2
#13 0x00007f56188c939a in omniCallHandle::upcall(omniServant*, omniCallDescriptor&) () from /home/thomas/micromamba/envs/database-115-repro/lib/libomniORB4.so.3.4
#14 0x00007f561941a250 in Tango::_impl_Device_4::_dispatch(omniCallHandle&) () from /home/thomas/micromamba/envs/database-115-repro/lib/libtango.so.10.1.2
#15 0x00007f56188c246f in omni::omniOrbPOA::dispatch(omniCallHandle&, omniLocalIdentity*) () from /home/thomas/micromamba/envs/database-115-repro/lib/libomniORB4.so.3.4
#16 0x00007f56188a26c4 in omniLocalIdentity::dispatch(omniCallHandle&) () from /home/thomas/micromamba/envs/database-115-repro/lib/libomniORB4.so.3.4
#17 0x00007f56188e73b4 in omni::GIOP_S::handleRequest() () from /home/thomas/micromamba/envs/database-115-repro/lib/libomniORB4.so.3.4
#18 0x00007f56188e7a31 in omni::GIOP_S::dispatcher() () from /home/thomas/micromamba/envs/database-115-repro/lib/libomniORB4.so.3.4
#19 0x00007f56188e5026 in omni::giopWorker::execute() () from /home/thomas/micromamba/envs/database-115-repro/lib/libomniORB4.so.3.4
#20 0x00007f5618895c1f in omniAsyncWorker::real_run() () from /home/thomas/micromamba/envs/database-115-repro/lib/libomniORB4.so.3.4
#21 0x00007f56188960be in omniAsyncPoolServer::workerRun(omniAsyncWorker*) () from /home/thomas/micromamba/envs/database-115-repro/lib/libomniORB4.so.3.4
#22 0x00007f5618895699 in omniAsyncWorker::mid_run() () from /home/thomas/micromamba/envs/database-115-repro/lib/libomniORB4.so.3.4
#23 0x00007f561968dc2c in Tango::Util::create_CORBA_objects()::{lambda(omni::omniInterceptors::createThread_T::info_T&)#1}::_FUN(omni::omniInterceptors::createThread_T::info_T&) () from /home/thomas/micromamba/envs/database-115-repro/lib/libtango.so.10.1.2
#24 0x00007f5618895b24 in omniAsyncWorker::run(void*) () from /home/thomas/micromamba/envs/database-115-repro/lib/libomniORB4.so.3.4
#25 0x00007f56187c40bd in omni_thread_wrapper () from /home/thomas/micromamba/envs/database-115-repro/lib/libomnithread.so.4.4
#26 0x00007f5618069ac3 in ?? ()
#27 0x0000000000000000 in ?? ()
@dlacoste-esrf Updated the MR. We now also test unscoped enums.
Thomas Braun (38ead1d8) at 19 Mar 18:35
tests/catch2_change_event.cpp: Add variant with unscoped enum as well
... and 2 more commits
This is the best thing to do. Less code is less code to maintain and test.
Close #1636
Thomas Braun (2436959b) at 19 Mar 14:47
tests/catch2_change_event.cpp: Prefer Enumeration values instead of...
... and 3 more commits