Feature/rosbag

Adds support for rosbag2.

So, //ros2/test/rosbag:tests works, meaning to me that rosbag2 stuff works. However, the cli app segfaults. Example:

Run in the examples folder: bazel run //chatter
And in the repo root: bazel run //ros2:ros2_bag -- record /topic. It looks like the app starts up but on CTRL+C segfaults:

bazel run //ros2:ros2_bag -- record /topic
INFO: Analyzed target //ros2:ros2_bag (49 packages loaded, 11500 targets configured).
INFO: Found 1 target...
Target //ros2:ros2_bag up-to-date:
  bazel-bin/ros2/ros2_bag.py
  bazel-bin/ros2/ros2_bag
INFO: Elapsed time: 8.299s, Critical Path: 7.25s
INFO: 10 processes: 1 internal, 9 linux-sandbox.
INFO: Build completed successfully, 10 total actions
INFO: Running command line: bazel-bin/ros2/ros2_bag record /topic
[ERROR] [1674339231.732949368] [rosbag2_cpp]: Unable to create class loader instance: package 'rosbag2_cpp' not found, searching: [ros2/ros2_bag_ament_setup]  # Ignore this for the moment
[INFO] [1674339231.739594184] [rosbag2_recorder]: Press SPACE for pausing/resuming
[INFO] [1674339231.741430007] [rosbag2_storage]: Opened database 'rosbag2_2023_01_21-23_13_51/rosbag2_2023_01_21-23_13_51_0.db3' for READ_WRITE.
[INFO] [1674339231.741541053] [rosbag2_recorder]: Event publisher thread: Starting
[INFO] [1674339231.741749758] [rosbag2_recorder]: Listening for topics...
[INFO] [1674339231.742830969] [rosbag2_recorder]: Subscribed to topic '/topic'
[INFO] [1674339231.743211045] [rosbag2_recorder]: All requested topics are subscribed. Stopping discovery...
[INFO] [1674339234.384837410] [rclcpp]: signal_handler(signum=2)
Segmentation fault (core dumped)

The problem seems to be in the cleanup of subscriptions: https://github.com/ros2/rosbag2/blob/0.15.3/rosbag2_transport/src/rosbag2_transport/recorder.cpp#L115.
@ahans I am digging into this, but another pair of eyes on this would help.
Except this issue, I have to clean up some Bazel-related macros before this lands in main. + fix some tests.

So, //ros2/test/rosbag:tests works, meaning to me that rosbag2 stuff works. However, the cli app segfaults.

Thanks for this! However, I can't repro the segfault. Tried on Ubuntu 20.04 as well as 22.04 hosts. Have you pushed some commits after writing this?
What I did notice:

I got a compilation error complaining about a missing sqlite3.h include. First I thought you hadn't given that as a Bazel dep and just used the system one, but turns out your sqlite.BUILD.bazel is just missing a line includes = ["."],. I think it'd be a good idea to also put copts = ["-w"], to silence the warnings it generates (or only `-Wno-misleading-indentation to be more selective).
Upon startup there's this error message:[ERROR] [1674461886.354162316] [rosbag2_cpp]: Unable to create class loader instance: package 'rosbag2_cpp' not     found, searching: [ros2/ros2_bag_ament_setup]

A brief look at your changes indicates that this is expected. Would definitely be nice to fix that for a final solution, though.
When creating a rosbag with ros2 bag record, there's a file metadata.yaml next to the .db3 file. The recording made via //ros2:ros2_bag doesn't have that. So it looks like despite the apparent absence of the segfault for me, something's not quite right yet when shutting down.

Ok, after digging a bit, turns out what I report under 3. above seems to be related to what you see as explicit segfault. When I hit Ctrl-C, it doesn't shut down cleanly. This is the reason why metadata.yaml isn't written. If there are messages not written to disk yet, they would be lost as well. So this definitely needs to be fixed.

I can confirm it seems to be related to cleanup of subscriptions. More specifically, when I comment out the call to rcl_subscription_fini here, it terminates cleanly and metadata.yaml gets written. I followed that rcl_subscription_fini() call a bit further, it leads to rmw_destroy_subscription() and from there to destroy_subscription(), where this call to dds_delete is the one that segfaults. That is already part of CycloneDDS. I suspect something's wrong before and this is only the first visible symptom. I tried to run it under asan, but the fact that everything is a Python extension and the Python binary the main driver makes this hard. Asan barks already during what seems to be its setup. Not sure if that's real or a false alarm.
I will keep digging, but maybe this info already helps to give you some idea? You know better what's different here compared to a standard ROS 2 build. Maybe it has to do with shared vs static libraries? What are you building statically here that would be a shared library in the standard ROS setup?

So the issues with running asan also occur with stock ROS2, so that's unrelated.

Many thanks for digging into this. Regarding 1: hm, this is fishy. It probably means that compiler pulls sqlite from /usr folder somehow -- both on my local machine and on the CI; will double-check this. Regarding 2: yeah, this will be fixed before the merge: I'll convert those error statements into debug statements.
I am leaning towards Python bindings doing something fishy given that the unit test runs just fine. An alternative is that my unit test isn't representative enough and in that case the problem lies somewhere else. So far, my understanding was that there is no static init involved with the recorder node, but I have to double-check this. And I'll go again over compilation flags for those Python bindings. I'll keep you posted.

Yeah, it picks the sqlite3.h from /usr/include. Since you use the host compiler, this is expected behavior. With a custom toolchain it would break. The GitHub build image has a lot of tools and libs pre-installed, sqlite3 is apparently one of them. Just put includes = ["."] and it's fine.
Regarding the more "interesting issue": I was able to run this under asan now, this comment was gold! However, the only things it finds are unmatched delete/new (where it would always free less than it allocated before) and leaks. When disabling those two, only the segfault remains. I checked the obvious things like pointers being valid and the dds_entity_t (or something like that), which is what you get when you create a subscription and pass when you want to delete it, and those match (the handle is just an integer).
Will also do some more digging, but this seems to be quite a tough one ... ;-)

One more point: I was just able to also make the test fail by putting the recorder into a block so that its destructor runs before we call rclcpp::shutdown(). Like so:
  {
    auto recorder = std::make_shared<rosbag2_transport::Recorder>(
        std::move(writer), storage_options, record_options);
    recorder->record();
    executor.add_node(recorder);

    while (rclcpp::ok()) {
      executor.spin_once(std::chrono::milliseconds(10));
      if (msg_counter->msg_count() > 100) {
        break;
      }
    }
  }

  return rclcpp::shutdown() ? EXIT_SUCCESS : EXIT_FAILURE;

If it crashes for the same reason, it's unrelated to Python bindings.

Interesting, but, I cannot make that test fail. BTW, recorder is a shared_ptr, and unless I'm missing something, the executor still has a reference to the recorder even when the program goes outside the block.

You're right of course, I totally missed the shared_ptr. Guess it was just too late last night...
I did some research on sanitizer usage in ROS 2. There's an interesting thread. Bottom line: sanitizers are only run up until rcpputils, because code of packages further up hasn't fully been cleaned up yet. So rcl, rclcpp, as well as rmw aren't covered, at least not on a regular basis. So it's well possible we're triggering some pre-existing issue here...

Alright, I know what made the test fail for me. It wasn't the recorder in the block, it was a different break condition. Instead of msg_counter->msg_count() > 20, I used msg_counter->msg_count() > 100. That makes the recorder process timeout in tests.py's proc_info.assertWaitForShutdown() and SIGINT being sent. So when shutdown is initiated from the recorder itself, things are fine, but when it happens from the outside, some race condition seems to be triggered. I suppose the signal handler initiates some shutdown before rclcpp::ok() becomes false, or some other shutdown happens in some parallel thread, so that the situation is different once recorder's main() exits.

Another update: Running under asan provided a full stacktrace upon segfault. I thought the segfault happens in Cyclone DDS code, but it actually comes back to rmw_cyclonedds_cpp. The read of tp->type_support.typesupport_identifier_ here is what fails. Hard-coding something based on what we have in type_name I can make the segfault go away, mostly at. Only mostly, because there is also a function sertype_rmw_equal() that uses that same information and may also cause the segfault. It seems we have some sort of cleanup race where one thread deletes/overwrites with sertype_rmw structure when we actually still need it. I'm fairly certain it's some race, because after my hack for sertype_rmw_hash I sometimes do not see the segfault, but sometimes do.

Many thanks for the update. Can you please share how you run asan-enabled builds? -- such that I can replicate locally what you're doing. Thanks in advance.

So, with the following diff:
diff --git a/ros2/test/rosbag/recorder.cc b/ros2/test/rosbag/recorder.cc
index da8f46c..f3f0ad1 100644
--- a/ros2/test/rosbag/recorder.cc
+++ b/ros2/test/rosbag/recorder.cc
@@ -64,7 +64,7 @@ int main(int argc, char* argv[]) {

   while (rclcpp::ok()) {
     executor.spin_once(std::chrono::milliseconds(10));
-    if (msg_counter->msg_count() > 20) {
+    if (msg_counter->msg_count() > 100) {
       break;
     }
   }
diff --git a/ros2/test/rosbag/tests.py b/ros2/test/rosbag/tests.py
index 92ae3c7..7ece53a 100644
--- a/ros2/test/rosbag/tests.py
+++ b/ros2/test/rosbag/tests.py
@@ -42,7 +42,7 @@ def generate_test_description():
 class TestRecorder(unittest.TestCase):

     def test_recorder(self, proc_info, recorder):
-        proc_info.assertWaitForShutdown(process=recorder, timeout=5)
+        proc_info.assertWaitForShutdown(process=recorder, timeout=1)
         launch_testing.asserts.assertExitCodes(
             proc_info,
             allowable_exit_codes=[launch_testing.asserts.EXIT_OK],

locally the recorder always exits with exit code 1 (expected -11), e.g.:
...
[recorder-2] [INFO] [1674584602.762635722] [rosbag2_recorder]: Event publisher thread: Starting
[recorder-2] [INFO] [1674584602.762809222] [rosbag2_recorder]: Listening for topics...
[recorder-2] [INFO] [1674584602.763802947] [rosbag2_recorder]: Subscribed to topic '/topic'
[recorder-2] [INFO] [1674584602.764138239] [rosbag2_recorder]: All requested topics are subscribed. Stopping discovery...
[INFO] [recorder-2]: sending signal 'SIGINT' to process[recorder-2]
[INFO] [publisher-1]: sending signal 'SIGINT' to process[publisher-1]
[recorder-2] [INFO] [1674584603.755240684] [rclcpp]: signal_handler(signum=2)
[publisher-1] [INFO] [1674584603.756025957] [rclcpp]: signal_handler(signum=2)
[recorder-2] [INFO] [1674584603.758033110] [rosbag2_recorder]: Event publisher thread: Exiting
[INFO] [publisher-1]: process has finished cleanly [pid 17]
[ERROR] [recorder-2]: process has died [pid 19, exit code 1, cmd 'ros2/test/rosbag/recorder --ros-args'].
FAIL
...

I ran it a couple of times. Am I just being very lucky?
I'll look into threading of rosbag2 to see which additional threads it spawns and how they are stopped.

I'm not at my computer right now, will send you details about asan later today.
Re the test, I think what happens is that rclcpp::shutdown returns false because shutdown already happened. Then your test exits with EXIT_FAILURE. I'm currently under the impression that it is hard to make fail with the test.

What I also noticed is that signal_handler(signum=2) is printed twice when I Ctrl-C the ros2 bag record. Not sure if that's expected. I tried to trace the shutdown procedure from the signal handler, but so far was unable to figure out how it works.

Here's what I did:
diff --git a/ros2/cc_defs.bzl b/ros2/cc_defs.bzl
index 1586a9c..6137e88 100644
--- a/ros2/cc_defs.bzl
+++ b/ros2/cc_defs.bzl
@@ -13,7 +13,7 @@ def _ros2_cc_target(target, lang, name, ros2_package_name, **kwargs):
         all_copts = CPP_COPTS
     else:
         fail("lang must be set to c or cpp!")
-    all_copts = all_copts + kwargs.pop("copts", [])
+    all_copts = all_copts + kwargs.pop("copts", []) + ["-fsanitize=address", "-fsanitize-recover=all"]

     ros2_package_name = ros2_package_name or name
     all_local_defines = ["ROS_PACKAGE_NAME=\\\"{}\\\"".format(ros2_package_name)]
@@ -23,6 +23,7 @@ def _ros2_cc_target(target, lang, name, ros2_package_name, **kwargs):
         name = name,
         copts = all_copts,
         local_defines = all_local_defines,
+        linkopts = kwargs.pop("linkopts", []) + ["-fsanitize=address", "-fsanitize-recover=all"],
         **kwargs
     )

Then run like this:
export ASAN_OPTIONS=detect_leaks=0:new_delete_type_mismatch=0:halt_on_error=0
export LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libasan.so.6 /lib/x86_64-linux-gnu/libstdc++.so.6"
bazel run -c dbg //ros2:ros2_bag -- record /topic

Alright, some more progress: For some still unknown reason, libstd_msgs__rosidl_typesupport_cpp.so gets unloaded too early. When I comment out the body of SharedLibrary::~SharedLibrary() (part of rcpputils), the segfault goes away.
I also double-checked with a standard ROS installation the double printing of that signal_handler(signum=2) line: It doesn't happen there. At the same time, it seems odd that in Recorder::Recorder() in _transport.cpp we set up another signal handler, when that should actually be handled by the rclcpp::init() in there. Needless to say, when I comment out that extra signal handler, the second signal_handler(signum=2) message goes away, but the segfault doesn't. So it could be that in the Bazel setup, for whatever reason, the default ROS shutdown mechanism kicks in, whereas in the standard version the default one doesn't have any effect and the shutdown initiated from Recorder's signal handler? Many parts are still a mystery here, but we're slowly getting there ...

Recorder' signal handler cares only about SIGTERM, whereas Ctrl-C sends SIGINT. So this is something different.

So at the surface, this looks like an actual bug. What's very confusing is why this works in standard ROS ...
In rosbag2_transport::Recorder::subscriptions_ we store instances of std::shared_ptr<rclcpp::GenericSubscription>. As you correctly speculated in the very beginning, the call to clear() here is what eventually leads to the segfault. Now what happens is that rclcpp::GenericSubscription has a std::shared_ptr of the typesupport library. When this goes out of scope, after ~GenericSubscription() ran, the reference count goes to zero and the typesupport library is unloaded. However, rclcpp::GenericSubscription's base class, rclcpp::SubscriptionBase, apparently does some work in its own destructor that requires the type support to still be around. But destruction of the base class only starts once GenericSubscription's destruction is finished and the type support library unloaded. I think that shared_ptr should actually be a member of SubscriptionBase instead of GenericSubscription. As an ugly workaround, I changed Recorder::~Recorder to make sure the type support library stays loaded:
  std::vector<std::shared_ptr<rcpputils::SharedLibrary>> ts_libs;
  for (auto& [k, v] : subscriptions_) {
    ts_libs.push_back(v->ts_lib_);
  }
  subscriptions_.clear();

I had to make GenericSubscription::ts_lib_ public for that to work. But with this hack the segfault is gone.

Here's a patch for rclcpp that moves ts_lib into SubscriptionBase. It didn't work when I had it as the last member, because then the shared library is still unloaded too early. I put it as the first now just to be sure:
diff --git a/rclcpp/include/rclcpp/generic_subscription.hpp b/rclcpp/include/rclcpp/generic_subscription.hpp
index 673712ee..099b5ef1 100644
--- a/rclcpp/include/rclcpp/generic_subscription.hpp
+++ b/rclcpp/include/rclcpp/generic_subscription.hpp
@@ -82,9 +82,9 @@ public:
       *rclcpp::get_typesupport_handle(topic_type, "rosidl_typesupport_cpp", *ts_lib),
       topic_name,
       options.template to_rcl_subscription_options<rclcpp::SerializedMessage>(qos),
-      true),
-    callback_(callback),
-    ts_lib_(ts_lib)
+      true,
+      ts_lib),
+    callback_(callback)
   {
     // This is unfortunately duplicated with the code in subscription.hpp.
     // TODO(nnmm): Deduplicate by moving this into SubscriptionBase.
@@ -159,8 +159,6 @@ private:
   RCLCPP_DISABLE_COPY(GenericSubscription)

   std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)> callback_;
-  // The type support library should stay loaded, so it is stored in the GenericSubscription
-  std::shared_ptr<rcpputils::SharedLibrary> ts_lib_;
 };

 }  // namespace rclcpp
diff --git a/rclcpp/include/rclcpp/subscription_base.hpp b/rclcpp/include/rclcpp/subscription_base.hpp
index f21f27e8..8060e43f 100644
--- a/rclcpp/include/rclcpp/subscription_base.hpp
+++ b/rclcpp/include/rclcpp/subscription_base.hpp
@@ -29,6 +29,8 @@
 #include "rmw/impl/cpp/demangle.hpp"
 #include "rmw/rmw.h"

+#include "rcpputils/shared_library.hpp"
+
 #include "rclcpp/any_subscription_callback.hpp"
 #include "rclcpp/detail/cpp_callback_trampoline.hpp"
 #include "rclcpp/experimental/intra_process_manager.hpp"
@@ -84,7 +86,8 @@ public:
     const rosidl_message_type_support_t & type_support_handle,
     const std::string & topic_name,
     const rcl_subscription_options_t & subscription_options,
-    bool is_serialized = false);
+    bool is_serialized = false,
+    std::shared_ptr<rcpputils::SharedLibrary> ts_lib = {});

   /// Destructor.
   RCLCPP_PUBLIC
@@ -526,6 +529,10 @@ public:
   rclcpp::ContentFilterOptions
   get_content_filter() const;

+private:
+  // The type support library should stay loaded, so it is stored in the GenericSubscription
+  std::shared_ptr<rcpputils::SharedLibrary> ts_lib_;
+
 protected:
   template<typename EventCallbackT>
   void
diff --git a/rclcpp/src/rclcpp/subscription_base.cpp b/rclcpp/src/rclcpp/subscription_base.cpp
index 300f465a..51f03c50 100644
--- a/rclcpp/src/rclcpp/subscription_base.cpp
+++ b/rclcpp/src/rclcpp/subscription_base.cpp
@@ -39,8 +39,10 @@ SubscriptionBase::SubscriptionBase(
   const rosidl_message_type_support_t & type_support_handle,
   const std::string & topic_name,
   const rcl_subscription_options_t & subscription_options,
-  bool is_serialized)
-: node_base_(node_base),
+  bool is_serialized,
+  std::shared_ptr<rcpputils::SharedLibrary> ts_lib)
+: ts_lib_(ts_lib),
+  node_base_(node_base),
   node_handle_(node_base_->get_shared_rcl_node_handle()),
   node_logger_(rclcpp::get_node_logger(node_handle_.get())),
   use_intra_process_(false),

The same issue should be present for the recorder executable in the test, but there I just can't make it fail, although I was able to confirm that the shared library also there is unloaded before destruction of SubscriptionBase starts. For some weird reason the memory is still valid in that case and in the Python binding it's not? The library is definitely unloaded, I also used LD_DEBUG=files to confirm.

Remove the MessageCounter node and also recorder.cc segfaults. That node kept the shared library around. It probably uses some other subscription mechanism that doesn't have that ts_lib bug.
Forcing the shared library to stay in memory by using something like
export LD_PRELOAD=$HOME/.cache/[...]/libstd_msgs__rosidl_typesupport_cpp.so

makes it also work.
Now, what is different between the way stock ros2 bag record works and your setup? Does the default ament setup do something that makes the libraries stick around?

Remove the MessageCounter node and also recorder.cc segfaults. That node kept the shared library around. It probably uses some other subscription mechanism that doesn't have that ts_lib bug.

I tried that locally, but I couldn't reproduce the segfault with the test.

Now, what is different between the way stock ros2 bag record works and your setup? Does the default ament setup do something that makes the libraries stick around?

ament_setup just lays out file structure such that ament_index_cpp can find necessary files. Nothing fancy.

Root cause for the segfault is the fact that stock ROS 2 builds two typesupport libraries, e.g., for std_msgs those would be
libstd_msgs__rosidl_typesupport_cpp.so and libstd_msgs__rosidl_typesupport_introspection_cpp.so, but rules_ros2 puts the functionality of both into the _typesupport_cpp.so one. As outlined above, *_typesupport_cpp.so lives as a std::shared_ptrrcpputils::SharedLibrary in GenericSubscription, but *_typesupport_introspection_cpp.so is loaded here. There's no matching delete for that new, so that one stays loaded for the lifetime of the process.

When libstd_msgs__rosidl_typesupport_cpp.so needs to be loaded, ament_index_cpp is called to get a path to the library. If it's not present on the ament_prefix_path -> an exception is thrown. So, if e.g. libstd_msgs__rosidl_typesupport_introspection_cpp.so would be needed, I'd expect I should know about that by now by seeing an exception coming from ament_index_cpp code. BTW, I put some debug fprintf statements in that get_typesupport_handle_function from your link, but it looks like it's not called -- still have to dig a bit deeper. At the moment I have the feeling ros doesn't dynamically load typessupport introspection libs, only typesupport libs.
One more thing: type_support depends on typesupport_introspection, at least auto-generated code tells that.
I committed your patch in d9ca94c: please let me know if you want me to decorate it with extra text.
Many thanks for your help! :)
The PR still needs some cleanup before it can be merged, besides possibly digging deeper into dynamic loading stuff.
This PR still needs more cleanup,

IMO, the rclcpp patch is OKish at the moment.
I also tried splitting interface generation stuff, but it turned out not to be so trivial -- I know what I need to do but would take more time given the current code struct that I would need to split. Plus, given the typesupport depends on introspection code, I am not sure yet this is the path to go. It would help if we can definitely rule out whether introspection libs are dyn loaded, or not.

@ahans WDYT?

In fact, from what I can see, get_typesupport_handle_function doesn't get called at all when I run bazel run //ros2:ros2_bag -- record /topic when I inject
fprintf(stderr, "get_typesupport_handle_function: %s", identifier);
::exit(1);

at the top of the function.

I'm fairly certain that splitting the libraries is the proper solution here. The introspection one is loaded in stock ROS from SubscriptionBase, and it is loaded in a way that it is only unloaded when the proceas terminates. The non-introspection one is unloaded just the same way as we do here in rules_ros2, but in stock ROS that's fine, because the introspection one remains loaded. I can give you the exact stack traces tomorrow.
Why we don't even try to load it with yours, I don't know. My suspicion still is that it has to do with symbols lookup and in the case of the all-in-one Liv the requested symbols are already there. I tried to follow the path as well in the debugger, but at some point we call into C code that gdb cannot properly resolve. Interestingly, though, for the standard ROS build this is not an issue at all.

Remove the MessageCounter node and also recorder.cc segfaults. That node kept the shared library around. It probably uses some other subscription mechanism that doesn't have that ts_lib bug.

I tried that locally, but I couldn't reproduce the segfault with the test.

When testing before, I had the talker run in parallel and manually executed the recorder binary. But with this diff I can also make the recorder die with -11. By only using GenericSubscription, we trigger the issue with unloading the shared library too early.
diff --git a/ros2/test/rosbag/recorder.cc b/ros2/test/rosbag/recorder.cc
index da8f46c..1971966 100644
--- a/ros2/test/rosbag/recorder.cc
+++ b/ros2/test/rosbag/recorder.cc
@@ -16,22 +16,23 @@
 #include "rosbag2_storage/storage_options.hpp"
 #include "rosbag2_transport/reader_writer_factory.hpp"
 #include "rosbag2_transport/record_options.hpp"
-#include "std_msgs/msg/string.hpp"

 constexpr auto kTopicName = "topic";

 class MessageCounter : public rclcpp::Node {
  public:
   MessageCounter() : Node("message_counter") {
-    subscription_ = create_subscription<std_msgs::msg::String>(
-        kTopicName, 10,
-        [this](std_msgs::msg::String::SharedPtr /*msg*/) { ++msg_count_; });
+    subscription_ = create_generic_subscription(
+        kTopicName, "std_msgs/msg/String", rclcpp::SensorDataQoS{},
+        [this](std::shared_ptr<rclcpp::SerializedMessage> message) {
+          ++msg_count_;
+        });
   }

   auto msg_count() const { return msg_count_; }

  private:
-  rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
+  std::shared_ptr<rclcpp::GenericSubscription> subscription_;
   int msg_count_ = 0;
 };

IMO, the rclcpp patch is OKish at the moment.

It's a workaround, but not the proper solution. Having a cc_library that has the two .so files as outputs (or two cc_library targets with one per .so) would be the way forward IMHO: A rosbag rule would depend on those in its data attribute, while for the cc_binary that a  ros2_cpp_binary produces it could end up on either data or deps, but in either case be loaded dynamically. Putting it in deps would have the advantage that we can probably get away without having to rely on ament index, because Bazel would put it into the NEEDED section and set RPATH properly.
In any case, a standard ROS build loads type support dynamically from shared objects, no matter if it's a C++ binary for a user node or a rosbag recorder. I think we should try to stay as close as possible to the standard ROS structure.
Going with my patch for rclcpp for now I can live with. But there should be a TODO saying that this is tech debt that needs to be fixed eventually.

I also tried splitting interface generation stuff, but it turned out not to be so trivial -- I know what I need to do but would take more time given the current code struct that I would need to split. Plus, given that typesupport depends on introspection code, I am not sure yet this is the path to go.

Since this is what the standard ROS build does, it is the way to go IMHO.

It would help if we can definitely rule out whether introspection libs are dyn loaded, or not.

Introspection libs are definitely loaded dynamically. I was able to confirm my previous observations using a standard ROS build.
Based on test_generic_pubsub.cpp I implemented a test like this:
TEST_F(RclcppGenericNodeFixture, generic_pubsub_cleanup)
{
  using namespace std::chrono_literals;
  std::string topic_name = "/topic";
  std::string topic_type = "std_msgs/msg/String";
  {
    auto subscription = node_->create_generic_subscription(
        topic_name, topic_type, rclcpp::SensorDataQoS{},
        [](std::shared_ptr<rclcpp::SerializedMessage>/* message */) {std::cerr << "message" << std::endl;});
    for (auto i = 0; i < 10; ++i) {
      rclcpp::spin_some(node_);
      std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
  }
  ASSERT_TRUE(true);
}

The only really relevant part is that we call create_generic_subscription() and eventually destroy the subscription object.
Then we load the non-instrospection library from create_generic_subscription. Full stack trace is this:

#0  rcpputils::SharedLibrary::SharedLibrary (this=0x5555556eaf40, library_path=...) at /home/ahans/src/ros2_rolling/src/ros2/rcpputils/src/shared_library.cpp:28
#1  0x00007ffff7dfb59b in __gnu_cxx::new_allocator<rcpputils::SharedLibrary>::construct<rcpputils::SharedLibrary, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&> (this=0x7fffffff822f, __p=0x5555556eaf40) at /usr/include/c++/11/ext/new_allocator.h:162
#2  0x00007ffff7dfb42c in std::allocator_traits<std::allocator<rcpputils::SharedLibrary> >::construct<rcpputils::SharedLibrary, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&> (__a=..., __p=0x5555556eaf40) at /usr/include/c++/11/bits/alloc_traits.h:516
#3  0x00007ffff7dfb214 in std::_Sp_counted_ptr_inplace<rcpputils::SharedLibrary, std::allocator<rcpputils::SharedLibrary>, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&> (this=0x5555556eaf30, __a=...) at /usr/include/c++/11/bits/shared_ptr_base.h:519
#4  0x00007ffff7dfae58 in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<rcpputils::SharedLibrary, std::allocator<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&> (this=0x7fffffff8498, __p=@0x7fffffff8490: 0x0, __a=...) at /usr/include/c++/11/bits/shared_ptr_base.h:650
#5  0x00007ffff7dfabdc in std::__shared_ptr<rcpputils::SharedLibrary, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&> (this=0x7fffffff8490, __tag=...) at /usr/include/c++/11/bits/shared_ptr_base.h:1342
#6  0x00007ffff7dfa9a5 in std::shared_ptr<rcpputils::SharedLibrary>::shared_ptr<std::allocator<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&> (this=0x7fffffff8490, __tag=...) at /usr/include/c++/11/bits/shared_ptr.h:409
#7  0x00007ffff7dfa7dd in std::allocate_shared<rcpputils::SharedLibrary, std::allocator<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&> (__a=...) at /usr/include/c++/11/bits/shared_ptr.h:863
#8  0x00007ffff7dfa61a in std::make_shared<rcpputils::SharedLibrary, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&> () at /usr/include/c++/11/bits/shared_ptr.h:879
#9  0x00007ffff7df9e81 in rclcpp::get_typesupport_library (type=..., typesupport_identifier=...) at /home/ahans/src/ros2_rolling/src/ros2/rclcpp/rclcpp/src/rclcpp/typesupport_helpers.cpp:101
#10 0x00005555555b92d9 in rclcpp::create_generic_subscription<std::allocator<void> >(std::shared_ptr<rclcpp::node_interfaces::NodeTopicsInterface>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (topics_interface=..., topic_name=..., topic_type=..., qos=..., callback=..., options=...) at /home/ahans/src/ros2_rolling/src/ros2/rclcpp/rclcpp/include/rclcpp/create_generic_subscription.hpp:60
#11 0x00005555555b7e8b in rclcpp::Node::create_generic_subscription<std::allocator<void> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (this=0x55555568d300, topic_name=..., topic_type=..., qos=..., callback=..., options=...) at /home/ahans/src/ros2_rolling/src/ros2/rclcpp/rclcpp/include/rclcpp/node_impl.hpp:238
#12 0x00005555555b3549 in RclcppGenericNodeFixture_generic_pubsub_cleanup_Test::TestBody (this=0x55555568d1a0) at /home/ahans/src/ros2_rolling/src/ros2/rclcpp/rclcpp/test/rclcpp/test_generic_pubsub.cpp:278
[testing framework functions omitted]

Two lines later in that function, we construct GenericSubscription, which triggers the load of the type support introspection library:
#0  rcpputils::SharedLibrary::SharedLibrary (this=0x555555710570, library_path=...) at /home/ahans/src/ros2_rolling/src/ros2/rcpputils/src/shared_library.cpp:26
#1  0x00007ffff6b34634 in rosidl_typesupport_cpp::get_typesupport_handle_function<rosidl_message_type_support_t> (handle=0x7ffff0b573c0 <std_msgs::msg::rosidl_typesupport_cpp::String_message_type_support_handle>, identifier=0x7ffff718a000 "rosidl_typesupport_introspection_cpp") at /home/ahans/src/ros2_rolling/src/ros2/rosidl_typesupport/rosidl_typesupport_cpp/src/type_support_dispatch.hpp:74
#2  0x00007ffff6b34400 in rosidl_typesupport_cpp::get_message_typesupport_handle_function (handle=0x7ffff0b573c0 <std_msgs::msg::rosidl_typesupport_cpp::String_message_type_support_handle>, identifier=0x7ffff718a000 "rosidl_typesupport_introspection_cpp") at /home/ahans/src/ros2_rolling/src/ros2/rosidl_typesupport/rosidl_typesupport_cpp/src/message_type_support_dispatch.cpp:27
#3  0x00007ffff6b3c6d1 in get_message_typesupport_handle (handle=0x7ffff0b573c0 <std_msgs::msg::rosidl_typesupport_cpp::String_message_type_support_handle>, identifier=0x7ffff718a000 "rosidl_typesupport_introspection_cpp") at /home/ahans/src/ros2_rolling/src/ros2/rosidl/rosidl_runtime_c/src/message_type_support.c:28
#4  0x00007ffff696e660 in get_typesupport (type_supports=0x7ffff0b573c0 <std_msgs::msg::rosidl_typesupport_cpp::String_message_type_support_handle>) at /home/ahans/src/ros2_rolling/src/ros2/rmw_cyclonedds/rmw_cyclonedds_cpp/src/rmw_node.cpp:1955
#5  0x00007ffff697291c in create_cdds_subscription (dds_ppant=662357872, dds_sub=115765071, type_supports=0x7ffff0b573c0 <std_msgs::msg::rosidl_typesupport_cpp::String_message_type_support_handle>, topic_name=0x55555570b330 "/topic", qos_policies=0x7fffffff4590, ignore_local_publications=false) at /home/ahans/src/ros2_rolling/src/ros2/rmw_cyclonedds/rmw_cyclonedds_cpp/src/rmw_node.cpp:2811
#6  0x00007ffff697303b in create_subscription (dds_ppant=662357872, dds_sub=115765071, type_supports=0x7ffff0b573c0 <std_msgs::msg::rosidl_typesupport_cpp::String_message_type_support_handle>, topic_name=0x55555570b330 "/topic", qos_policies=0x7fffffff4590, subscription_options=0x7fffffff7d70) at /home/ahans/src/ros2_rolling/src/ros2/rmw_cyclonedds/rmw_cyclonedds_cpp/src/rmw_node.cpp:2895
#7  0x00007ffff69738d0 in rmw_create_subscription (node=0x5555556ae730, type_supports=0x7ffff0b573c0 <std_msgs::msg::rosidl_typesupport_cpp::String_message_type_support_handle>, topic_name=0x55555570b330 "/topic", qos_policies=0x7fffffff7cf0, subscription_options=0x7fffffff7d70) at /home/ahans/src/ros2_rolling/src/ros2/rmw_cyclonedds/rmw_cyclonedds_cpp/src/rmw_node.cpp:2983
#8  0x00007ffff6cc51c8 in rmw_create_subscription (v5=0x5555556ae730, v4=0x7ffff0b573c0 <std_msgs::msg::rosidl_typesupport_cpp::String_message_type_support_handle>, v3=0x55555570b330 "/topic", v2=0x7fffffff7cf0, v1=0x7fffffff7d70) at /home/ahans/src/ros2_rolling/src/ros2/rmw_implementation/rmw_implementation/src/functions.cpp:393
#9  0x00007ffff71da541 in rcl_subscription_init (subscription=0x55555570b2f0, node=0x555555690dc0, type_support=0x7ffff0b573c0 <std_msgs::msg::rosidl_typesupport_cpp::String_message_type_support_handle>, topic_name=0x7fffffff8550 "/topic", options=0x7fffffff7cf0) at /home/ahans/src/ros2_rolling/src/ros2/rcl/rcl/src/rcl/subscription.c:101
#10 0x00007ffff7d62469 in rclcpp::SubscriptionBase::SubscriptionBase (this=0x555555701050, node_base=0x55555568d770, type_support_handle=..., topic_name=..., subscription_options=..., is_serialized=true) at /home/ahans/src/ros2_rolling/src/ros2/rclcpp/rclcpp/src/rclcpp/subscription_base.cpp:68
#11 0x00005555555be34f in rclcpp::GenericSubscription::GenericSubscription<std::allocator<void> >(rclcpp::node_interfaces::NodeBaseInterface*, std::shared_ptr<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (this=0x555555701050, node_base=0x55555568d770, ts_lib=..., topic_name=..., topic_type=..., qos=..., callback=..., options=...) at /home/ahans/src/ros2_rolling/src/ros2/rclcpp/rclcpp/include/rclcpp/generic_subscription.hpp:87
#12 0x00005555555bdfe4 in __gnu_cxx::new_allocator<rclcpp::GenericSubscription>::construct<rclcpp::GenericSubscription, rclcpp::node_interfaces::NodeBaseInterface*, std::shared_ptr<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&>(rclcpp::GenericSubscription*, rclcpp::node_interfaces::NodeBaseInterface*&&, std::shared_ptr<rcpputils::SharedLibrary>&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (this=0x7fffffff80ff, __p=0x555555701050) at /usr/include/c++/11/ext/new_allocator.h:162
#13 0x00005555555bdcb7 in std::allocator_traits<std::allocator<rclcpp::GenericSubscription> >::construct<rclcpp::GenericSubscription, rclcpp::node_interfaces::NodeBaseInterface*, std::shared_ptr<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&>(std::allocator<rclcpp::GenericSubscription>&, rclcpp::GenericSubscription*, rclcpp::node_interfaces::NodeBaseInterface*&&, std::shared_ptr<rcpputils::SharedLibrary>&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (__a=..., __p=0x555555701050) at /usr/include/c++/11/bits/alloc_traits.h:516
#14 0x00005555555bd911 in std::_Sp_counted_ptr_inplace<rclcpp::GenericSubscription, std::allocator<rclcpp::GenericSubscription>, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<rclcpp::node_interfaces::NodeBaseInterface*, std::shared_ptr<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&>(std::allocator<rclcpp::GenericSubscription>, rclcpp::node_interfaces::NodeBaseInterface*&&, std::shared_ptr<rcpputils::SharedLibrary>&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (this=0x555555701040, __a=...) at /usr/include/c++/11/bits/shared_ptr_base.h:519
#15 0x00005555555bcf6d in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<rclcpp::GenericSubscription, std::allocator<rclcpp::GenericSubscription>, rclcpp::node_interfaces::NodeBaseInterface*, std::shared_ptr<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&>(rclcpp::GenericSubscription*&, std::_Sp_alloc_shared_tag<std::allocator<rclcpp::GenericSubscription> >, rclcpp::node_interfaces::NodeBaseInterface*&&, std::shared_ptr<rcpputils::SharedLibrary>&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (this=0x7fffffff85e8, __p=@0x7fffffff85e0: 0x0, __a=...) at /usr/include/c++/11/bits/shared_ptr_base.h:650
#16 0x00005555555bc968 in std::__shared_ptr<rclcpp::GenericSubscription, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<rclcpp::GenericSubscription>, rclcpp::node_interfaces::NodeBaseInterface*, std::shared_ptr<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&>(std::_Sp_alloc_shared_tag<std::allocator<rclcpp::GenericSubscription> >, rclcpp::node_interfaces::NodeBaseInterface*&&, std::shared_ptr<rcpputils::SharedLibrary>&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (this=0x7fffffff85e0, __tag=...) at /usr/include/c++/11/bits/shared_ptr_base.h:1342
#17 0x00005555555bbf49 in std::shared_ptr<rclcpp::GenericSubscription>::shared_ptr<std::allocator<rclcpp::GenericSubscription>, rclcpp::node_interfaces::NodeBaseInterface*, std::shared_ptr<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&>(std::_Sp_alloc_shared_tag<std::allocator<rclcpp::GenericSubscription> >, rclcpp::node_interfaces::NodeBaseInterface*&&, std::shared_ptr<rcpputils::SharedLibrary>&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (this=0x7fffffff85e0, __tag=...) at /usr/include/c++/11/bits/shared_ptr.h:409
#18 0x00005555555bb2bc in std::allocate_shared<rclcpp::GenericSubscription, std::allocator<rclcpp::GenericSubscription>, rclcpp::node_interfaces::NodeBaseInterface*, std::shared_ptr<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&>(std::allocator<rclcpp::GenericSubscription> const&, rclcpp::node_interfaces::NodeBaseInterface*&&, std::shared_ptr<rcpputils::SharedLibrary>&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (__a=...) at /usr/include/c++/11/bits/shared_ptr.h:863
#19 0x00005555555ba34a in std::make_shared<rclcpp::GenericSubscription, rclcpp::node_interfaces::NodeBaseInterface*, std::shared_ptr<rcpputils::SharedLibrary>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&>(rclcpp::node_interfaces::NodeBaseInterface*&&, std::shared_ptr<rcpputils::SharedLibrary>&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) () at /usr/include/c++/11/bits/shared_ptr.h:879
#20 0x00005555555b935c in rclcpp::create_generic_subscription<std::allocator<void> >(std::shared_ptr<rclcpp::node_interfaces::NodeTopicsInterface>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (topics_interface=..., topic_name=..., topic_type=..., qos=..., callback=..., options=...) at /home/ahans/src/ros2_rolling/src/ros2/rclcpp/rclcpp/include/rclcpp/create_generic_subscription.hpp:63
#21 0x00005555555b7e8b in rclcpp::Node::create_generic_subscription<std::allocator<void> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&, std::function<void (std::shared_ptr<rclcpp::SerializedMessage>)>, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&) (this=0x55555568d300, topic_name=..., topic_type=..., qos=..., callback=..., options=...) at /home/ahans/src/ros2_rolling/src/ros2/rclcpp/rclcpp/include/rclcpp/node_impl.hpp:238
#22 0x00005555555b3549 in RclcppGenericNodeFixture_generic_pubsub_cleanup_Test::TestBody (this=0x55555568d1a0) at /home/ahans/src/ros2_rolling/src/ros2/rclcpp/rclcpp/test/rclcpp/test_generic_pubsub.cpp:278
[...]

Frame #1 is where we do the new SharedLibrary that has no matching delete.
When I delete/rename libstd_msgs__rosidl_typesupport_introspection_cpp.so, the test fails.
When I replace the original libstd_msgs__rosidl_typesupport_cpp.so with the one built via rules_ros2, I get the exact same behavior: libstd_msgs__rosidl_typesupport_introspection_cpp.so is not loaded and upon shutdown there's a segfault.
Interestingly, in the ROS build I can follow the entire execution flow in the debugger. It basically confirmed that if we use the merged library, we don't even try to load the introspection one.

So the decision whether to load the library or if it is considered to be already loaded happens here:

When the library is not loaded, func points at rosidl_typesupport_cpp::get_typesupport_handle_function, where we eventually load the introspection library. In the last stacktrace above the call to func happens in frame #3.
When we have the library loaded, func points at the get_message_typesupport_handle_function() that is defined further down in the same file here. For the _cpp version that will then return handle. When having loaded the "merged" library, also also stay in the same file and never call the get_message_typesupport_handle_function that loads the introspection library.

I haven't figured out where those function pointers are set, but overall it makes sense to me.

Thanks for looking into this this deep, I really appreciate this.

It's a workaround, but not the proper solution. Having a cc_library that has the two .so files as outputs (or two cc_library targets with one per .so) would be the way forward IMHO: A rosbag rule would depend on those in its data attribute, while for the cc_binary that a ros2_cpp_binary produces it could end up on either data or deps, but in either case be loaded dynamically. Putting it in deps would have the advantage that we can probably get away without having to rely on ament index, because Bazel would put it into the NEEDED section and set RPATH properly.
In any case, a standard ROS build loads type support dynamically from shared objects, no matter if it's a C++ binary for a user node or a rosbag recorder. I think we should try to stay as close as possible to the standard ROS structure.

In deps you put stuff that you want linked with a linker with your libs/binary. Runtime .so plugins typically go to the data section (from what I know so far).
And this brings us to the point that: if you want to link ros nodes/libs against IDL libs it's fine to use deps. If you want to use IDL as plugins (generic subscriptions, rosbag), well, then ament index kicks in and generation of shared libs for all those plugins.
After quite some thinking, I think that we want here that e.g. cpp_ros2_interface_library behaves more as a cc_library, such that we can generate .so libs (that can be used as plugins) on demand that are dynamically linked to it's dependencies. For static linking things are solved (for now), but for dynamic linking there is more work to be done. Let's say we have std_msgs cpp library. Besides the fact we want it's introspection lib to be a shared lib and that corresponding typesupport shared lib dynamically links against it, we want that it's dependency builtin_interfaces is also linked as a shared lib. I think this should be possible to do in Starlark, but... it's an unexplored territory for me :) Once this works, a separate rule+aspect can be used to generate an ament-compatible file tree -- this is just a hunch at the moment TBH.
And then there is indeed rpath handling which should be done correctly by Bazel.
At the moment, I think I'll just finish up this PR, merge it, and then open an issue for the tech debt. The correct approach will possibly require some serious work (and experimentation).
Sadly, this isn't the first time that it was revealed that  ROS relies on linking mechanism to work correctly. The very first patch #2 / https://github.com/ros2/rmw_cyclonedds/pull/320 is (possibly) related to linking.

In deps you put stuff that you want linked with a linker with your libs/binary. Runtime .so plugins typically go to the data section (from what I know so far).

This is true for the stock ROS setup. However, when assembling entire launches in BUILD files, we know at compile/link time exactly what we need at runtime. Having the linker put the reference to the .so plugin in that case I would find reasonable, if it makes our life easier in some other place. But yes, if we want to replicate what stock ROS does as closely as possible, data is the way to go.

And this brings us to the point that: if you want to link ros nodes/libs against IDL libs it's fine to use deps. If you want to use IDL as plugins (generic subscriptions, rosbag), well, then ament index kicks in and generation of shared libs for all those plugins.

I was under the impression that there are different mechanisms in place. One that explicitly builds a library's path and explicitly wants that through a dlopen call. And another, that first checks if the library/symbol is already present. For the former, we still have to make ament happy, agreed. However, even in that case I think it would be good enough to do the bare minimum, which seems to be having some directory under $AMENT_PREFIX_PATH/**/share/** in place. The standard mechanism involving dlopen will respect $LD_LIBRARY_PATH, which means it will also consider libraries already loaded due to being mentioned in the NEEDED section.

After quite some thinking, I think that we want here that e.g. cpp_ros2_interface_library behaves more as a cc_library, such that we can generate .so libs (that can be used as plugins) on demand that are dynamically linked to it's dependencies. For static linking things are solved (for now), but for dynamic linking there is more work to be done. Let's say we have std_msgs cpp library. Besides the fact we want it's introspection lib to be a shared lib and that corresponding typesupport shared lib dynamically links against it, we want that it's dependency builtin_interfaces is also linked as a shared lib. I think this should be possible to do in Starlark, but... it's an unexplored territory for me :) Once this works, a separate rule+aspect can be used to generate an ament-compatible file tree -- this is just a hunch at the moment TBH.

Sounds good! I totally agree about the cc_library part. Honestly, I was a bit confused that running bazel build on a cpp_ros2_interface_library did not cause any compilation action. ;-) Having cpp_ros2_interface_library be a cc_library in the end that produces .a and/or .so files would be less surprising, at least to me.
About the dependencies, why wouldn't it work to put a dependency's cpp_ros2_interface_library (which in the end is another cc_library) in the cc_library's deps section? Then Bazel would make sure the dep is built and also properly linked against (RPATH and all).

At the moment, I think I'll just finish up this PR, merge it, and then open an issue for the tech debt. The correct approach will possibly require some serious work (and experimentation).

That sounds acceptable. It's good that we have (almost?) fully understood what's happening. In that case we're not blindly applying a workaround, but are well aware of the implications.

Sadly, this isn't the first time that it was revealed that ROS relies on linking mechanism to work correctly. The very first patch #2 / ros2/rmw_cyclonedds#320 is (possibly) related to linking.

Yeah, it looks like ROS relies heavily on dynamic linking at runtime, which offers quite a chances for bugs going unnoticed, because there are so many situations that in theory should work, but only so many (probably just a single constellation) are routinely tested in practice.
I think ROS also heavily profits from user testing (who do this willingly or not). AFAIU, their CI setup doesn't even test optimized builds, which may surface issues that in a debug build go unnoticed. When you then deviate from the standard setup (as we do here), you can rely a lot less on the indirect user testing. That's part of the reason why I said above (or elsewhere) that we should try to stay as close as possible to what standard ROS does.

Honestly, I was a bit confused that running bazel build on a cpp_ros2_interface_library did not cause any compilation action.

About the dependencies, why wouldn't it work to put a dependency's cpp_ros2_interface_library (which in the end is another cc_library) in the cc_library's deps section? Then Bazel would make sure the dep is built and also properly linked against (RPATH and all).

That works for static linking today and to some extent (IIUC) it should work with dynamic loading. For some part of dynamic loading ament setup is still required. Bazel has it's own system to lay out folder structure for .so files, and we need to at least symlink those libs (one day) to a file tree that ament can process.

@ahans Many thanks once again for all your help!


Integration error: ecotrend_ista - Requirements for ecotrend_ista not found: ['pyecotrend_ista==1.0.35'].

After updating HA core to:
Home Assistant 2022.12.1
Supervisor 2022.11.2
Operating System 9.3
Frontend 20221208.0 - latest
The intefration stopped working. The log gives errors about missing requirements.
Integration error: ecotrend_ista - Requirements for ecotrend_ista not found: ['pyecotrend_ista==1.0.35'].

Updated to last release, but still not working.
Unable to install package pyecotrend_ista==1.0.37: ERROR: Cannot install pyecotrend-ista==1.0.37 because these package versions have conflicting dependencies. ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-with-dependency-conflicts [notice] A new release of pip available: 22.3 -> 22.3.1 [notice] To update, run: pip install --upgrade pip


Used the proper GRPC_TRACE value in run_tests.py

Please give this a few runs through Jenkins to catch any flakiness introduced by additional logging.

@ctiller A'ight.
As far as the change is concerned, LGTM.

It looks like this caused the C# tests and possibly the Python dbg test to time out.

The Python timeout might just be related to #3577/#3585... Still need to get to those.

That C# timeout looks very consistent, and the Python timeout happens about half the time.

Jenkins is now green.


 It will also not load the hook_source of deoplete.nvim. This configuration should throw an error.

I noticed something really weird.
Here is the init.vim
set runtimepath^=/tmp/dein/repos/github.com/Shougo/dein.vim
if dein#load_state('/tmp/dein')
  call dein#begin('/tmp/dein')
  call dein#load_toml('/tmp/dein.toml')
  call dein#end()
  call dein#save_state()
endif

dein.toml is the file given above.
Weirdly enough, deoplete works fine the first time neovim is launched, but every time after that, deoplete is not automatically enabled.
Here is a video https://asciinema.org/a/7jemrxquyzqavt8dy0asdbo3w
This seems to only happen with dein#load_state, if you remove that if statement then deoplete always loads fine.

I have implemented the feature.
Please create new issue if you have en-counted the problem.


feat(Settings): added settings layout comp

Fixed design on general settings
Close #16
Close #55

👍

@TanyaDolgopolova You can merge stuff on your own, when you've got the reviews you need :)

Hi @TanyaDolgopolova! Have you finished with the design implementation for this?

Hi @TanyaDolgopolova! Have you finished with the design implementation for this?

This is still in progress. I will add this list of views to the kit project and connect it to this component. For now I left it like that

This is still WIP, correct? Can you add a WIP: syntax while it is?

This is still WIP, correct? Can you add a WIP: syntax while it is?

It still in progress. I will add it

This has become stale, closing it. Reopen if need be. 👍


Remove version: CeVIO.CeVIOAI version 9.1.9

[Automated] It returns code over 400 in all urls
Microsoft Reviewers: Open in CodeFlow

URL: https://cevio.jp/storage/cevio_ai/CeVIO_AI_Setup_x64_(<IP_ADDRESS>).msi
Response Error: The remote server returned an error: (404) Not Found.
(Automated message - build 911)


 This is a bit prettier like this plus it will be a bit easier for me to rebase with only one run to apply.

Can we enforce it in the black setting file as well?

Can we enforce it in the black setting file as well?

I don't think so, that's not really a fix on current code but just a cleaner application of black to master~1. (Current master is considered Ok by black, maybe the trailing comma can matter in python 3.6 ?)

Accordant to the documentation:

One exception to adding trailing commas is function signatures containing *, *args, or **kwargs. In this case a trailing comma is only safe to use on Python 3.6. Black will detect if your file is already 3.6+ only and use trailing commas in this situation. If you wonder how it knows, it looks for f-strings and existing use of trailing commas in function signatures that have stars in them. In other words, if you’d like a trailing comma in this situation and Black didn’t recognize it was safe to do so, put it there manually and Black will keep it.


⚠ API (search) has degraded performance

In cfea01b, API (search) (https://api.dev.package-search.services.jetbrains.com/search-packages) experienced degraded performance:

HTTP code: 200
Response time: 2935 ms

Resolved: API (search) performance has improved in cdfe03a after 9 minutes.


移除 Joda-Time-Android，使用 ThreeTenABP 替代

joda-time-android：
https://github.com/dlew/joda-time-android
ThreeTenABP：
https://github.com/JakeWharton/ThreeTenABP
要求 minSdkVersion = 15

替换原因：
ThreeTen 为 jsr310 标准的兼容实现，更符合 Java 标准

Attention: Development on this library is winding down. Please consider switching to Android Gradle plugin 4.0, java.time.*, and its core library desugaring feature in the coming months.


[WIP] - refactor - modularise tests and improve readability

Hi, my commit message is about exactly what it is that I am doing. In this case I did so almost completely with the internals.test.ts file. Though, of course, I am still working on this.
Let me know if it is bothersome that I have to repeat code in the beforeEach at times. Though, know this is a rough draft as you stated you wanted me to push immediately. I will make sure it looks very clean in the end.
Also, I added .dist to .gitignore, I can make that is deleted at the end of the request.
And I am not sure while events.test.ts is in this request, as I did not write that.
Thanks!

Hey @jMuzsik as I guess you notice, the events.test.ts showed up because your branch was out of sync with master.
While the merge helps, it is better to do a git rebase master. This will also potentially turn up some merge conflicts that you can solve the same way, however it will put your changes on top and thus result in a better history. This is why I would ask you to reset to 9d44b54 before the merge and do a git rebase instead.
Also the dist can not be added to gitignore, because on master I do need to push dist for releases.
I will have a more in-depth look, but from what I saw now it looks very good. 👍
Sadly I have to tell you that the _attached function was removed from the code, so the test is unnecessary and will probably fail once you rebased.
Looking forward to you updates, thank you!

Coverage remained the same at 84.11% when pulling cb69b0cc617edec92985f67d6b8ca2b3119fe760 on jMuzsik:refactor_internal_tests into 9682291c6369565180126741e9b4b0725ff42bc3 on lukasoppermann:master.

Ok, I thought I did rebase but, yes, I do not have much experience doing so. I brought my commit back to 9d44b54. Ok, I'll make sure that the dist and all else is in the right place in the final commit. I'll make sure to delete the _attached test.
Thanks for the helpful comments!

Hey, nice. If you need help with the rebase, just let me know.

Let me know if I'm on the right track. Hope that I did the right work within the terminal but there is uncertainty.

Hey, sadly the rebase seems not to have worked. You should not have any merges and also not my pushes in your history. (Careful there a renew pushes you need to pull down first).
Do you want to try this again? (Maybe this is good: https://nathanleclaire.com/blog/2014/09/14/dont-be-scared-of-git-rebase/) Otherwise I can have a look and check out how best to rebase it tomorrow.


luci-app-tor-hs: add new application

This PR adds luci app for tor-hs package which helps with creating tor hidden services for router so they can be accessible  throught tor network.
https://github.com/openwrt/packages/tree/master/net/tor-hs

Rebased on master with suggested changes.
@feckert What do you think now ?

@feckert ping

While @ja-pa seems missing and the PR stalled I would like to propose mine PR https://github.com/openwrt/luci/pull/6476#issuecomment-1664804640


The definition of Token::Number could be changed to require less space

Instead of storing an Op, we could store an enum with two choices.

This seems to have no impact on code size.


atoti.value() or atoti.agg._single_value() error

Steps to reproduce

import atoti as tt
import pandas as pd
session = tt.create_session()
df1 = pd.DataFrame({
    "l1": ["a", "b"]
})

df2 = pd.DataFrame({
    "l2": ["a", "b"],
    "m2": [2,3]
})
store_1 = session.read_pandas(df1, store_name="1")
store_2 = session.read_pandas(df2, keys =["l2"], store_name="2")
store_1.join(store_2, mapping={"l1": "l2"})
cube = session.create_cube(store_1)
cube.measures["fail"] = tt.value(store_2["m2"])

If you remove the keys of store_2 it is working, else the single value generate an error when you try to create it.
It does not work neither with the atoti.agg._single_value().
It was working on 0.4.3 with the atoti.agg.single_value().
Actual Result

Expected Result
Environment

atoti: <IP_ADDRESS>01208125600
Python: 3.9.1
Operating System: win32

Logs (if relevant)

If l1 has the same name as l2 it solves the issue too.
import atoti as tt
import pandas as pd
session = tt.create_session()
df1 = pd.DataFrame({
    "l1": ["a", "b"]
})

df2 = pd.DataFrame({
    "l1": ["a", "b"],
    "m2": [2,3]
})
store_1 = session.read_pandas(df1, store_name="1")
store_2 = session.read_pandas(df2, keys =["l1"], store_name="2")
store_1.join(store_2, mapping={"l1": "l1"})
cube = session.create_cube(store_1)
cube.measures["fail"] = tt.value(store_2["m2"])

Hi,
There have indeed been some changes with the value operations. They always create a measure which has empty values above the levels of its key fields (unless specified otherwise) now. The bug you found is related to atoti not being able to understand that l1 and l2 are linked to the same cube level.
Thanks for reporting this bug, it is currently under investigation.

Hello,
This issue has been fixed and the fix will be part of the next released version.

Hello,
This issue has been fixed and the fix will be part of the next released version.


fix debug option in config file

Maybe we should provide verbosity leveled logging more and provide a -v flag instead as an alias to -d that sets the verbosity to 100.
More on that what I mean https://kubernetes.io/docs/concepts/cluster-administration/system-logs/#log-verbosity-level

fixed in #77


feat: not allow changelog generation with an unclean branch

Describe the feature
Would like the option for changelogen to stop if the working copy isn't clean.  This will ensure all commits are done first.
Additional information

[x] Would you be willing to help implement this feature?

If you'd be interested in a PR, let me know.  Thinking to add a --clean parameter that checks for clean with git status -s and bails if its not clean.

Any chance we could get this merged?  Along with some of the other PRs?  Thanks!


get_db_graph_string not defined in the data.py under text2sql

!

cannot get get_db_graph_string from data.py under text2sql

cannot get get_db_graph_string from data.py under text2sql

I also faced the same issue.

Thank you for mentioning, will fix this by tonight.

Hi, this issue is still not fixed yet.

Hi @yashbonde
Is the Issue fixed?

Hi @yashbonde , I tried to find a solution to this issue but the function generates a custom string format defined by you. Maybe you could share the function and I can create a PR.

Hi @yashbonde
The issue still exists. Can you explain what changes are required so that I can make it on my end.


[SPARK-10492][Streaming][Documentation] Update Streaming documentation about rate limiting and backpressure

Merged build triggered.

Merged build started.

Test build #42149 has started for   PR 8656 at commit 986cdd6.

Test build #42149 has finished for   PR 8656 at commit 986cdd6.

This patch passes all tests.
This patch merges cleanly.
This patch adds no public classes.

Test PASSed.
Refer to this link for build results (access rights to CI server needed):
https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder/42149/
Test PASSed.

Merged build finished. Test PASSed.

oh nvm its merged in already, ignore my minor comment.


Does optimize_every_n_nodes do the same as sampling_ratio?

From my understanding the sampling ratio basically triggers the optimization every 1 / sampling_ratio time it gets called.
This seems analog to optimize_every_n_nodes?
So in the end one ends up optimizing every optimize_every_n_nodes * (1 / sampling_ratio) nodes?
Is there any other difference to the parameters?

From my understanding the sampling ratio basically triggers the optimization every 1 / sampling_ratio time it gets called.

No, it just drops input data. So any other setting than 1.0 is hardly useful.

Is there any other difference to the parameters?

Yes.
Use optimize_every_n_nodes to adjust the optimization frequency.
Of course, it also depends on the node frequency, which so num_accumulated_range_data makes it less frequent.

Okay. The default value for the sampling_ratio currently is 0.3.
What's the merit of having a lower optimization frequency (with optimize_every_n_nodes > 1)?
Doesn't it just change the computation effort from continuous "low" usage to bursts (which are usually worse)?

You two had a misunderstanding. @gaschler referred to sampling ratios in cartographer_ros - these just drop the input data. @AlexReimann that sampling ratio determines which ratio of scans/nodes the constraint builder tries to use for loop closing i.e. performs scan matching against finished submaps, which might result in a loop closure constraint.

Sorry for the confusion. @ojura is right.

What's the merit of having a lower optimization frequency (with optimize_every_n_nodes > 1)?

Optimization takes time and blocks all background threads that usually search for constraints.

Doesn't it just change the computation effort from continuous "low" usage to bursts (which are usually worse)?

Optimization works on all nodes (that are not frozen), not only new ones.
I didn't measure it, but when you have many new constraints, optimization doesn't really require more iterations, so it is not a much longer burst.


[RFC] docs: add playlist songs to queue

Added information about the return object structure, when a request happens from music player to add songs of a playlist to queue.

The change in markdown preview:-


feat: authorization changes for keys with no namespace and for reserved keys

fixes https://github.com/atsign-foundation/at_server/issues/1830
- What I did

Changes to isAuthorized check for keys with no namespace and for reserved keys
- How I did it
added key name as param to isAuthorized method and moved namespace fetching logic from verb handlers to isAuthorized
Added _isReserved in isAuthorized. Reserved keys will be accessible by all apps.
if namespace is not available for a key, check for * namespace in enrollment and then check for read allowed or write allowed
minor code refactoring in isAuthorized to remove too many conditions
added tests in update_verb_test.dart,delete_verb_test.dart, local_lookup_verb_test.dart
- How to verify it
tests should pass

Looks good so far; please do not forget to implement authorization logic for notifications

if from another atSign, behaviour should be the same as it is now
if from the current atSign, then use isAuthorized check on the notification's key

I will work on the changes today

Looks good so far; please do not forget to implement authorization logic for notifications

if from another atSign, behaviour should be the same as it is now
if from the current atSign, then use isAuthorized check on the notification's key

I will work on the changes today

@gkc I have completed the changes for notify and notifyall
https://github.com/atsign-foundation/at_server/commit/3f967b5ac4e6a137ce2761dcc5676f2975ff2aa5
I have query on other notify verbs e.g notify list, notify fetch, notify status. these verbs have either notification id as param or no param. how can we check the access since we need a at key to compare with apkam namespace access. But in order to get the at key we have to query notification key store

Looks good so far; please do not forget to implement authorization logic for notifications

if from another atSign, behaviour should be the same as it is now
if from the current atSign, then use isAuthorized check on the notification's key

I will work on the changes today

@gkc I have completed the changes for notify and notifyall 3f967b5 I have query on other notify verbs e.g notify list, notify fetch, notify status. these verbs have either notification id as param or no param. how can we check the access since we need a namespace from at key to compare with apkam namespace access. But in order to get the at key we have to query notification key store

@murali-shris  I think we have to check the authorization, therefore I'd say:

For list: Retrieve then check authorization on the keys for each item that would have been returned
For notify fetch and status: Fetch first, then check authorization on the key

https://github.com/atsign-foundation/at_server/actions/runs/8247868568
Marked as "do not merge" until end2end test failure inconsistency is figured out

https://github.com/atsign-foundation/at_server/actions/runs/8247868568 Marked as "do not merge" until end2end test failure inconsistency is figured out

ran secondary servers from this branch and ran the end2end test for notify locally. Unable to replicate the issue

@murali-shris FYI I had to rerun the unit tests as one of the enroll_verb_test unit tests is flaking. Please can you (or someone else) create a ticket to look into that and fix it? (Fix doesn't need to be on this PR)
  Expected: <true>
    Actual: <false>

  package:matcher                   expect
  test/enroll_verb_test.dart 545:7  main.<fn>.<fn>

LGTM but as this is a significant change which may fail in cases not covered by the atServer tests, please can you

run at_client tests against a server running this branch
run NoPorts locally with atServers running this branch and verify it works OK

For running locally

ensure vip.ve.atsign.zone is in your /etc/hosts pointing to 127.0.01

run local redis, root, and atServers using scripts in tools/run_locally

install redis if not already installed, and edit its config as described in the at_redis script
run at_redis script
run at_root script
run at_server -a @alice -p 10001 -s alice
run at_server -a @bob -p 10002 -s bob
run at_server -a @chuck -p 10003 -s chuck

create atKeys if not already done
bin/activate_cli -a @alice -c alice -r vip.ve.atsign.zone
bin/activate_cli -a @bob  -c bob -r vip.ve.atsign.zone
bin/activate_cli -a @chuck -c chuck -r vip.ve.atsign.zone

run srvd
bin/srvd -a @chuck --root-domain vip.ve.atsign.zone --ip <IP_ADDRESS> -v

run sshnpd
bin/sshnpd --root-domain vip.ve.atsign.zone -m @alice -a @bob -d local -v -u -s

run sshnp
bin/sshnp -f @alice -d local -s ~/.ssh/<keyname>.pub -i ~/.ssh/<keyname> -t @bob -h @chuck --root-domain vip.ve.atsign.zone

I will work on this testing today

Ran local virtual env.Replaced the server binary with the binary from this branch

@gkc I am getting an error while running sshnp
 ./srvd -a @murali🛠 --root-domain vip.ve.atsign.zone --ip <IP_ADDRESS> -v
 ./sshnpd --root-domain vip.ve.atsign.zone -m @jagan🛠 -a @kevin🛠 -d local -v -u -s
 ./sshnp --root-domain vip.ve.atsign.zone -f @jagan🛠 -d local -s ~/.ssh/noports_ed25519.pub -i ~/.ssh/noports_ed25519 -t @kevin🛠 -h @murali🛠

sshnp logs:
2024-03-14 15:22:59.258548 : Sending session request to the device daemon
2024-03-14 15:22:59.287963 : Waiting for response from the device daemon
SHOUT|2024-03-14 15:22:59.410842| SshnpdChannel |invalid daemon response: Failed to start up the daemon side of the srv socket tunnel : Exception running srv : SocketException: Connection refused (OS Error: Connection refused, errno = 61), address = localhost, port = 65062
Error : No response from the device daemon
sshnpd logs:INFO|2024-03-14 15:22:59.310910| sshnpd |svr.result is a bool
INFO|2024-03-14 15:22:59.310914| sshnpd |svr.result is true
INFO|2024-03-14 15:22:59.310921| sshnpd |Setting up ports for direct ssh session using openssh (openssh) from: @jagan🛠 session: 51727984-1f45-4f54-8581-18e4b5a63a81
INFO|2024-03-14 15:22:59.315317|SrvImplExec|SrvImplExec.run(): executing /Users/murali/IdeaProjects/atsign/noports/packages/dart/sshnoports/srv -h <IP_ADDRESS> -p 65061 --local-port 22 --local-host localhost --rv-auth --rv-e2ee
INFO|2024-03-14 15:22:59.344654|SrvImplExec|rv stderr | Exception running srv : SocketException: Connection refused (OS Error: Connection refused, errno = 61), address = localhost, port = 65062
SEVERE|2024-03-14 15:22:59.344739| sshnpd |startDirectSsh failed with unexpected error : Exception running srv : SocketException: Connection refused (OS Error: Connection refused, errno = 61), address = localhost, port = 65062

@murali-shris please run all three noports programs with -v flag, and email me the full output from all three

[update] noports programs all worked fine once ssh was enabled on local machine


Alternatively, if SAC : CMD is not working.

[Enter feedback here]
1.Create a New NIC from Network Interfaces Blade, with free ip in the subnet.
2.Stop/deallocate the VM.
3.Attach the new NIC created in step 1.
4.Boot up the VM , connect with the new IP.
5.Enable the 'disabled' network interface.
6.Validate reachability.
7.Then,stop/deallocate the VM.
8.Delete the temporary NIC created.

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: 88d5b9b6-087b-7b1a-76f4-62147295519e
Version Independent ID: a97ab17c-33f2-c8c6-5467-f00491f354da
Content: Cannot connect remotely to Azure Virtual Machines because the NIC is disabled - Virtual Machines
Content Source: support/azure/virtual-machines/troubleshoot-rdp-nic-disabled.md
Service: virtual-machines
GitHub Login: @genlin
Microsoft Alias: genli

@VGSandz, Thank you for the feedback, If the SAC does not work, user can reset the NIC by using the steps in https://docs.microsoft.com/en-us/troubleshoot/azure/virtual-machines/reset-network-interface


Adds solution for 739. Daily Temperatures in Kotlin

File(s) Modified: 739-Daily-Temperatures.kt
Language(s) Used: kotlin.
Submission URL: _https://leetcode.com/submissions/detail/763422090/_

Thanks, @t3chkid!


Herobrine Example

I just think this is what we have to do eventually.
On the technical side to show-off fake players with bare-bones AI.
And on a spriritual side to appease the awe-inspiring Herobrine.
To be honest I have no idea what is needed for this and how far we are on the "fake player" front, but I would take a stab on this eventually.

I believe valence has everything needed to work with fake players. I think an example demonstrating AI would be great.

I think a Herobrine appearing logic can be implemented using some kind of a reverse occlusion culling algorithm.


Node and npm versions in package.json

Version: 0.44

Platform:

Subsystem:

Severity: Low

Description:

When installing dependencies with node v16 as specified in package.json, the warning:
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package<EMAIL_ADDRESS>npm WARN EBADENGINE   required: { node: '>=18' },
npm WARN EBADENGINE   current: { node: 'v16.15.1', npm: '8.11.0' }
npm WARN EBADENGINE }

is printed in the console as one of the dependencies requires node v18.
Shouldn't "engines" be updated in package.json ?
Steps to reproduce the error:

npm install using nodejs v16

Thanks for raising this, it seems to be related to a transitive dependency that we use for automating our releases through project management tool, perhaps we should update it there since aegir is a devDependency Would you care to open a PR?

Hi @maschad , thanks for the reply. It looks like this is already being worked on.
https://github.com/ipfs/aegir/tree/fix/min-node-version

Closing as it was fixed by this PR.


About Page Updates - Features and Enhancements + Support the Data Lab

Context
We will be revamping the About Page and we should break up this up.
This issue is just for the "Features and Enhancements" and "Support the Data Lab" sections. This should be a responsive implementation. These changes should not require any custom components.
Problem or idea
The updated mockup for the About page and a link to the new copy can be found in this figjam file
Solution or next step

Update content in "Impact" section to the new "Features and Enhancements" section
Add additonal copy and image to "Support the Data Lab" section.

Merged #534


Add support for democracynow.org

Supports downloading clips or entire shows. Subtitle support

broken merge, resubmitting

Closed the wrong PR

Thanks for your work @atomicdryad. I've made some changes, especially removing start=X and end=Y parameters from the final URLs.
And, would you like to be listed in AUTHORS? If so, under what name?


[Fix](Full compaction) Fix local variable using in test case

Proposed changes
Issue Number: close #xxx

In this case, some variables use global variables, causing test errors during concurrency.
Further comments
If this is a relatively large or complex change, kick off the discussion at<EMAIL_ADDRESS>by explaining why you chose the solution you did and what alternatives you considered, etc...

run buildall

run buildall

run buildall


create mode 100644 PubSub/src/V1/Gapic/SchemaServiceGapicClient.php
 create mode 100644 PubSub/src/V1/GetSchemaRequest.php
 create mode 100644 PubSub/src/V1/ListSchemasRequest.php
 create mode 100644 PubSub/src/V1/ListSchemasResponse.php
 create mode 100644 PubSub/src/V1/Schema.php
 create mode 100644 PubSub/src/V1/Schema/Type.php
 create mode 100644 PubSub/src/V1/SchemaServiceClient.php
 create mode 100644 PubSub/src/V1/SchemaServiceGrpcClient.php
 create mode 100644 PubSub/src/V1/SchemaSettings.php
 create mode 100644 PubSub/src/V1/SchemaView.php
 create mode 100644 PubSub/src/V1/Schema_Type.php
 create mode 100644 PubSub/src/V1/ValidateMessageRequest.php
 create mode 100644 PubSub/src/V1/ValidateMessageResponse.php
 create mode 100644 PubSub/src/V1/ValidateSchemaRequest.php
 create mode 100644 PubSub/src/V1/ValidateSchemaResponse.php
 create mode 100644 PubSub/src/V1/resources/schema_service_client_config.json
 create mode 100644 PubSub/src/V1/resources/schema_service_descriptor_config.php
 create mode 100644 PubSub/src/V1/resources/schema_service_rest_client_config.php
 create mode 100644 PubSub/tests/Unit/V1/SchemaServiceClientTest.php
2021-01-27 05:50:21,565 autosynth [DEBUG] > Running: git reset --hard HEAD
HEAD is now at 10120ee8 chore: update Go generator, rules_go, and protobuf
2021-01-27 05:50:21,609 autosynth [DEBUG] > Running: git checkout autosynth-pubsub
Switched to branch 'autosynth-pubsub'
2021-01-27 05:50:21,638 autosynth [DEBUG] > Running: git diff HEAD..autosynth-pubsub-277 -- . :(exclude)synth.metadata
2021-01-27 05:50:21,643 autosynth [DEBUG] > Running: git diff HEAD autosynth-pubsub-277
2021-01-27 05:50:21,647 autosynth [DEBUG] > Running: git apply /tmpfs/tmp/tmpilm9uigx/autosynth-pubsub-277.patch
error: cannot apply binary patch to 'PubSub/metadata/V1/Pubsub.php' without full index line
error: PubSub/metadata/V1/Pubsub.php: patch does not apply
error: cannot apply binary patch to 'PubSub/metadata/V1/Schema.php' without full index line
error: PubSub/metadata/V1/Schema.php: patch does not apply
Traceback (most recent call last):
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 354, in <module>
    main()
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 189, in main
    return _inner_main(temp_dir)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 334, in _inner_main
    commit_count = synthesize_loop(x, multiple_prs, change_pusher, synthesizer)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 104, in synthesize_loop
    return synthesize_loop_single_pr(toolbox, change_pusher, synthesizer)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 126, in synthesize_loop_single_pr
    synthesize_inner_loop(toolbox, synthesizer)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 152, in synthesize_inner_loop
    synthesize_range(toolbox, synthesizer)
  File "/tmpfs/src/github/synthtool/autosynth/synth.py", line 170, in synthesize_range
    toolbox.patch_merge_version(young)
  File "/tmpfs/src/github/synthtool/autosynth/synth_toolbox.py", line 182, in patch_merge_version
    git.patch_merge(sub_branch, patch_file_path)
  File "/tmpfs/src/github/synthtool/autosynth/git.py", line 151, in patch_merge
    executor.check_call(["git", "apply", patch_file_path], cwd=git_repo_dir)
  File "/tmpfs/src/github/synthtool/autosynth/executor.py", line 29, in check_call
    subprocess.check_call(command, **args)
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/subprocess.py", line 311, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['git', 'apply', '/tmpfs/tmp/tmpilm9uigx/autosynth-pubsub-277.patch']' returned non-zero exit status 1.

Google internal developers can see the full log here.

Autosynth passed, closing! :green_heart:

Autosynth passed, closing! :green_heart:


Merge release/2.3.0 branch into master branch

What does this PR do?
This PR merges release/2.3.0 branch into master branch.
Review checklist (to be filled by reviewers)

[ ] Feature or bugfix MUST have appropriate tests (unit, integration, e2e)
[ ] Make sure you discussed the feature or bugfix with the maintaining team in an Issue
[ ] Make sure each commit and the PR mention the Issue number (cf the CONTRIBUTING doc)

Codecov Report

Merging #1741 (5e59e1e) into master (34b298a) will decrease coverage by 0.24%.
The diff coverage is 86.64%.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1741      +/-   ##
==========================================
- Coverage   83.59%   83.35%   -0.24%
==========================================
  Files         458      465       +7
  Lines       15767    16179     +412
  Branches     2354     2411      +57
==========================================
+ Hits        13180    13486     +306
- Misses       1962     2030      +68
- Partials      625      663      +38

Files
Coverage Δ

...tlin/com/datadog/android/api/net/RequestFactory.kt
100.00% <ø> (ø)

...android/api/storage/FeatureStorageConfiguration.kt
100.00% <100.00%> (ø)

...n/kotlin/com/datadog/android/core/StrictModeExt.kt
100.00% <100.00%> (ø)

...android/core/configuration/BatchProcessingLevel.kt
100.00% <100.00%> (ø)

...om/datadog/android/core/configuration/BatchSize.kt
100.00% <100.00%> (ø)

...atadog/android/core/configuration/Configuration.kt
96.51% <100.00%> (+0.31%)
:arrow_up:

...adog/android/core/configuration/UploadFrequency.kt
100.00% <100.00%> (ø)

...n/com/datadog/android/core/internal/CoreFeature.kt
87.83% <100.00%> (+0.09%)
:arrow_up:

.../internal/configuration/DataUploadConfiguration.kt
100.00% <100.00%> (ø)

...g/android/core/internal/data/upload/DataFlusher.kt
95.00% <100.00%> (+0.26%)
:arrow_up:

... and 79 more

... and 20 files with indirect coverage changes


Usage fix

It looks ok, but can you post the test result?

The code is already is being used on daily basis to send out emails to LISDEV team.
And you can see current results here : Utilities/job/tool-monitor-subscription-usage/


i18n(de): translate tutorial/0-introducation/index.mdx

Description (required)

translate tutorial/0-introducation/index.mdx

Related issues & labels (optional)

Suggested label: i18n

Lunaria Status Overview
🌕 This pull request will trigger status changes.

Learn more
By default, every PR changing files present in the Lunaria configuration's files property will be considered and trigger status changes accordingly.
You can change this by adding one of the keywords present in the ignoreKeywords property in your Lunaria configuration file in the PR's title (ignoring all files) or by including a tracker directive in the merged commit's description.

Tracked Files

File
Note

de/tutorial/0-introduction/index.mdx
Localization added, will be marked as complete.

Warnings reference

Icon
Description

🔄
The source for this localization has been updated since the creation of this pull request, make sure all changes in the source have been applied.

tutorial needs to be one PR, closing


Queryable intervals

Pull request for feature from #522

A few minor comments, but I am :+1:

Hi @noddi, i have a few minor comments and I'm good to merge this after that.

Hello @fjy
Thanks for code review.
Changes:

license header
removed "this"
moved duplicated code to setProperties method
extracted getDatasources method to new InventoryViewUtils class

@noddi Thanks for the contrib! Can you sign the CLA here: http://druid.io/community/cla.html and we'll get this merged in

:+1:

Hi @noddi, have you had a chance to sign the CLA?

Hello @fjy
I'm sorry for delay, CLA signed.

Got the CLA, thanks @noddi !


grype: 0.28.0 -> 0.30.0

Motivation for this change
Bump grype to 0.30.0
Also:
Added myself as a maintainer
Removed docker as a propagated build input - grype can be used without the docker service and having it as a propagated build input doesn't guarentee the service/socket is running
Added completions
Cleaned up meta
cc: @fabaff
Things done

Built on platform(s)

[X] x86_64-linux
[ ] aarch64-linux
[ ] x86_64-darwin
[ ] aarch64-darwin

[X] For non-Linux: Is sandbox = true set in nix.conf? (See Nix manual)
[X] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[X] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[X] Tested basic functionality of all binary files (usually in ./result/bin/)
22.05 Release Notes (or backporting 21.11 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module
[ ] (Release notes changes) Ran nixos/doc/manual/md-to-db.sh to update generated release notes

[X] Fits CONTRIBUTING.md.


Edit client/src/App.js

As you're working on your component, add it to the app . js to see it finished through the end :)


[Feature] If the cell is selected, the column and column information is returned. For example, if the cell 'A3' is selected, the 'A3' is returned in onBeforeCommandExecute. It is difficult to handle this by yourself.

初始清单

[X] 这真的是个问题吗？
[X] 我已经在 Github Issues 中搜索过了，但没有找到类似的问题。

问题
If the cell is selected, the column and column information is returned. For example, if the cell 'A3' is selected, the 'A3' is returned in onBeforeCommandExecute. It is difficult to handle this by yourself.
解决方案
onBeforeCommandExecute  command  return info

I'm not very sure whether you mean this facade api or not.
https://univer.ai/zh-cn/guides/facade/sheet/#监听选区变化
The current version (v0.1.7) may throw an error. Although it DOES NOT affect usage, we have fixed it here. https://github.com/dream-num/univer/pull/2066


Crash when opening character after adding attributes and sections

Actions performed:

Opened character with no Attributes
Added two attribute sections
Added one different attribute to each section
Save character
Tap on character again from character list

This caused the app to crash on the titleForHeaderInSection function in CharacterDetailTableViewController with an index out of range. It was trying to load section index 2 but the only value in allSections was the "Character" section. This occurred in commit eb5df1ecb55299302d3c0782273bd88c3a06fe0b. It has not been able to be reproduced.

Had this happen again after removing a section from a character and saving.


nordzy-cursor-theme: 0.6.0 -> 2.3.0

Update to latest upstream release v2.3.0.
There is a GitHub repo owner change alvatip -> guillaumeboehm
Brings:

hyprcursor support
catppuccin theme
lefthand variation of every theme

Things done

Built on platform(s)

[x] x86_64-linux
[ ] aarch64-linux
[ ] x86_64-darwin
[ ] aarch64-darwin

For non-Linux: Is sandboxing enabled in nix.conf? (See Nix manual)

[ ] sandbox = relaxed
[ ] sandbox = true

[ ] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[ ] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[ ] Tested basic functionality of all binary files (usually in ./result/bin/)
24.11 Release Notes (or backporting 23.11 and 24.05 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module

[x] Fits CONTRIBUTING.md.

Add a :+1: reaction to pull requests you find important.

@alexnortung can you take a look, please

@ofborg build nordzy-cursor-theme


General problem description

Summary

Steps to reproduce

Expected behavior

Actual behavior

Error: no known factory address for this network

Error: no known factory address for this network

Your configured swap-endpoint is likely not pointing to a goerli node.  Doublecheck your swap-endpoint.  If using infura.io, make sure you selected Goerli from the drop-down before copying the URL.

Oh, and these sorts of things are best asked first in the #bee-support channel of the Discord server.


Test with own dataset

Thank you for your great work!
I am curious about testing with my own dataset.
I just want to get a mask image from my data.
Thank you very much.

Thank you for your interest to our work. You can download our trained models and run the inference code, input your image and a sentence describing the target object.

Thank you for your great work!
I am curious about testing with my own dataset. I just want to get a mask image from my data.
Thank you very much.

Thank you for your interest to our work. You can download our trained models and run the inference code python vlt.py test [PATH_TO_CONFIG_FILE], input your image and a sentence describing the target object.
You could also considering our recent method ReLA.

Thank you for the response.
I am little confused about preparing the dataset json file.
Can you give me an example json file or samples for inference?


accounts soft banned.

My account was botting from lvl 17 to 22. And it got catch flee ban today when I noticed it's not catching any mons and the poke balls are depleting fast.

well, it's been unbanned.


Error "Dank Item Level 6 cannot open Dank Inventory Level 5"

I am having a problem with upgrading my storage. When I go from 5 to 6 and then try to open it I get the error "Dank Item Level 6 cannot open Dank Inventory Level 5" this one is done on a crafting station slab from Improved Stations.
Dank Storage v 1.18.1-3.44
Improved Stations v 2.0.8
Modpace All of Fabric 5 v 0.2.9
Minecraft 1.18.1
Fabric Loader 0.12.12
Java 17.0.1 64bit

Update to 1.18.1-3.4.1


FlxMenu, dynamic checkboxes in MenuOptionToggle

Rather than read from a tilesheet, dynamically create the graphic of checkboxes,
this way the size/shadow/colors can be more customizable and visually precise.
Also, this is optional, as user can still choose to use an image to use as a checkbox

Latest dev update now supports pushing custom spritesheets for the on/off state of the checkbox.
Also updated the default icons system. All icons now have dynamic optional shadows that can be set in the optionStyle var.
There are now 3 different sprite sizes for checkboxes. Depending on the font-size one is selected automatically, if the fontsize is bigger than 26 then the checkbox will get scaled up. If you are using AA, it will scale badly(lots of blur), but with no AA, it looks fine.
Still no dynamic generation and I think I will leave it as that, because, on the rare occasion an extra large checkbox is required, it could be set as an image using custom tilesheets with
optionStyle.icons.tileSheet


File naming convention improvement: .ffxml -> .offxml

At the meeting, I mentioned (and it was agreed to) that we will try to name our force field files using the extension .offxml rather than .ffxml to reduce the temptation for people to say, "Well, this is just a normal .ffxml file like OpenMM uses for force field libraries, so I should be able to use it with OpenMM's createSystem", and the to contact us when it doesn't work. Using the .offxml extension will make it more clear that these are not the same at all.

This was done in PR #101 I'm going to close this issue now


Quitting sunbeam with esc returns a non-zero exit code

If I execute sunbeam and leave it by pressing esc the shell returns an exit code of 1 (e.g. error), when I would expect it to return a 0.

This is expected.
It is useful when you use sunbeam in a pipe (ex: sunbeam my-command | other-command).
If you cancel your selection, you will be able to detect it from the shell and not run the following command.

OK, so there is a reason for it.
I use Warp as a terminal though and those error 1 look odd there though as they are highlighted in red.
Here is a quick example of running sunbeam files vs broot/br

I though about it, and I think a good middle ground would be to only return set the exit code to 1 if sunbeam is part of a pipe

fixed by d775b8ccb95c661429b29b6f4464e1cbe1a6b3e8


didSelectItemAt not firing when only one item in a row

I'm noticing that when a row only contains one cell, didSelectItemAt is not firing when tapped. As long as more than one item is present everything works fine (including tapping the first cell).
Expected Behavior
Even if a cell is the only cell in a particular row it should still call didSelectItemAt when tapped
Actual Behavior
When a cell is the only cell in a row didSelectItemAt does not trigger after the only cell is tapped.

@phalladar please make sure that you're assigned a delegate property and you're not going to check willExpand or didExpand methods, since they not going to fire because if you have only one row there is no way to actually expand.
Note that in demo project delegate is not set up.

Hey @Jauzee, the delegate is assigned which is why I'm receiving didSelect events for all rows with more than 1 cell. Are you not able to reproduce this? If not I can make a sample project for you.

@phalladar I'm unable to reproduce it, tried with only one cell & one row. Yes please.

Here's the repo with my code: https://github.com/phalladar/gliding-bug
You'll notice that didSelect is not called for rows 3 and 4 where only one cell is present.
Appreciate you taking a look.

@phalladar got it. This issue actually related to transition animation which have a bug inside of it (it remains overlay layer so we can't tap a cell more). I'll try to fix it asap.

Awesome. 👍

Fixed in 1.0.3