Skip to content

Add a shared-memory message broker.#272

Merged
ehpor merged 141 commits intodevelopfrom
feature/message_broker
May 7, 2025
Merged

Add a shared-memory message broker.#272
ehpor merged 141 commits intodevelopfrom
feature/message_broker

Conversation

@ehpor
Copy link
Copy Markdown
Collaborator

@ehpor ehpor commented Dec 17, 2024

This PR adds a MessageBroker class for distributing arbitrary-sized messages. Messages are put in shared memory, either CPU or GPU shared memory (the latter not implemented), and can be distributed between processes.

A Message contains:

  1. A topic. We use a string, e.g. boston_dm/correction_howfs/value or boston_dm/correction_howfs/set, which follows a hierarchical naming convention.
  2. Metadata. We chose to use a limited number of key-value pairs. The keys are stored statically for each message, the values are stored for each message.
  3. Data. This is an array-like structure. The shape and dtype of this array does not have to be the same from message to message.

The MessageBroker allows us to listen to new messages at any level in the hierarchical structure. This means that we can listen to either a single message topic or many message topics at the same time. The MessageBroker also allows us to send messages with any topic.

Relies on #289.

@ehpor ehpor added the enhancement New feature or request label Dec 17, 2024
@ehpor ehpor self-assigned this Dec 17, 2024
@ehpor ehpor changed the title Feature/message broker Add a shared-memory message broker. Dec 17, 2024
@ehpor ehpor force-pushed the feature/message_broker branch 4 times, most recently from cb233fb to 45704c2 Compare December 23, 2024 23:31
@ehpor ehpor force-pushed the feature/message_broker branch from 714535a to 43f7f7b Compare January 24, 2025 00:18
@ehpor ehpor force-pushed the feature/message_broker branch 7 times, most recently from 9ffe87f to f8c80fd Compare February 25, 2025 22:28
@ehpor ehpor force-pushed the feature/message_broker branch 3 times, most recently from a9ccf76 to 7ece328 Compare March 18, 2025 19:03
@ehpor
Copy link
Copy Markdown
Collaborator Author

ehpor commented Mar 19, 2025

Performed the first benchmarks:

4.09438e+06 messages per second
244 ns per message

This is single-threaded. The biggest bottlenecks are:

  • ~40%: the lookup of the topic header and event for a topic.
  • ~25%: the Event structure providing notification of other processes (MacOS specific).
  • ~15%: the allocators (combined freelist and pool allocator).
  • ~15%: getting a timestamp.
  • ~5%: misc processing.
image (benchmark using samply)

For the topic header and event lookup for a topic: this can in principle be condensed into a single hash map/calculation. But I'll postpone this for later. This is enough for now. All low-hanging fruit has been taken care of.

@ehpor
Copy link
Copy Markdown
Collaborator Author

ehpor commented Mar 19, 2025

When walking home, I realized that the subtopics are very predictable. Doing a full lookup every subtopic might be avoidable with clever ordering. This is also work for the future, if required.

@ehpor
Copy link
Copy Markdown
Collaborator Author

ehpor commented Mar 20, 2025

I'm having some problems with the Python bindings. The polymorphism for Memory, SharedMemory and LocalMemory is not working as expected. I don't really understand why not. Pybind11 knows about the inheritance structure and should upcast the shared_ptr to a shared_ptr just fine.

@ehpor
Copy link
Copy Markdown
Collaborator Author

ehpor commented Apr 19, 2025

I've moved to a cheaper memory allocator, based on a thread-local pool fed by a buddy allocator. This is the final iteration of the allocator. I've also moved to a single Event structure for signaling.

New benchmarks:

5.54217e+06 messages per second
180 ns per message

Distributed as follows:

  • 10% generating UUIDs
  • 23% allocating and deallocating
  • 21% getting topic header
  • 7% getting a timestamp
  • 4% looping through subtopics
  • 4% signaling the event
  • 3% updating the frame counter per topic
  • 9% updating the framerates
  • 19% misc other stuff

 This has been replaced by Event.
Copy link
Copy Markdown
Collaborator

@ivalaginja ivalaginja left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am slowly getting accustomed to this new concept but it's taking some time. I have a first round of questions that I was hoping to get answers to before being able to wrap this up on my side.

Comment thread tests/test_message_broker.py
data = b'hello world'
arr = np.frombuffer(data, dtype='uint8')

broker.publish_data(topic, data)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How is this different from publish_message()? Also, what is data? Is it a synonym for payload? Trying to relate things to the figures in #272 (comment).

Copy link
Copy Markdown
Collaborator

@alexisyslau alexisyslau May 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ehpor Please correct me if I am wrong. (and yes, I did dive a bit into the C++ code to see what's going on)

The difference is that publish_message already has a message object ready to be published to the broker, but that is not the case here. In this example, we only have topic and data, without any message object being created yet.

Without publishing a message, the broker has no access to any information.
So publish_data() needs to do several things:

  • Assign a trace_id, which is needed to trace our message.
  • Prepare a message, meaning it creates a message object (Header and Payload, see the message content fig. ) ready for publication.
  • Set the data information for the message, so it is complete and ready to be published.
  • Publish the message, making it available to the broker.

Hence, assert (retrieved_message.payload == arr).all() should pass. payload stores the data of the message.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ivalaginja Data is not a synonym for payload. A payload is part of a message. Data is not part of a message. But a payload is data.

The reason for this function is similar to the Datastream.submit_data() vs. Datastream.request_new_frame() & Datastream.submit_frame(). The first is a convenience function for the latter two. Maybe my naming can be improved?

@alexisyslau Exactly. Unless you're hyperoptimizing, most people are not using the Datastream.request_new_frame() and Datastream.submit_frame() separately. Using those allows, in some cases, to remove a copy of the image. But most people will be using the Datastream.submit_data(), which combines the two, and the memory copy in between.

The same thing is true here. I'm expecting very little use of MessageBroker.prepare_message() & MessageBroker.publish_message() in favor of MessageBroker.publish_data() which combines the two and the memory copy in between. However, similar to the case of Datastreams, I want it to be available when people need it.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see! Thanks to both of you! I think the naming is fine, especially when you trace it back to the data streams. Makes sense!

broker.publish_data(topic, data * 2)
message_2 = broker.get_newest_message(topic)

assert str(message_2.trace_id) != str(message_1.trace_id)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are the differences between trace_id, message_id and Partial frame ID?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A trace ID is set for each new information. It is typically assigned to the original data that came in, ie. the source of the "information". Eg. a camera service would create new trace IDs for each camera image. But a WFS reconstructor service would retain the same trace ID of the image that it computed the reconstruction for. Therefore, by using the trace ID, we can trace the flow of that camera information through the entire system. The technical term for this is "distributed tracing".

A payload ID is unique per data. In case partial messages are submitted (ie. pixel streaming), the payload for these messages will be the same, so they retain the same payload ID. A payload ID identifies a unique array.

A message/frame ID is sequential numbering per topic. The trace ID and payload ID are not. It allows us to figure out whether we missed frames, and to request the previous/next message for a particular message.

A partial frame ID is a numbering within a message. It increments sequentially, starting from zero. It gets incremented each time a partial message is submitted. I didn't test the partial message generation in this PR. It probably needs more work.

Comment thread tests/test_event.py Outdated
Comment on lines +27 to +28
waiting.wait(1)
assert waiting.is_set()
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this times out without a signal, shouldn't waiting.is_set() return False?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this is checking that the wait didn't time out. I could also do:

assert waiting.wait(1)

I'll add comments.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added more comments to the test.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh I had inverted the purpose of the test in my head. Makes sense! Thanks!

ArrayInfo &array_info = message.m_Header->payload_info.array_info;

array_info.data_type = 'u';
array_info.byte_order = '=';
Copy link
Copy Markdown
Collaborator

@alexisyslau alexisyslau May 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most of the CPUs and GPUs should be little-endian so using the native order should be ok normally. But is it better to force it to be little-endian <? This will make sure we always interpret the array in the same way.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since the data type here is a byte (u), which is one byte long, the byte order doesn't matter. But, I'm not sure why I chose = compared to @, which are native byte order and native alignment, and native byte order and no alignment respectively. Again, no difference in this case, but native everything should be the default in other parts of the code, e.g. when submitting an array.

Copy link
Copy Markdown
Collaborator

@ivalaginja ivalaginja left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I left a couple more questions about some details, but over all things make a lot more sense now. I also still need to run these tests.

def test_message_subscription(broker):
topic = "test_message_subscription"

subscription_newest = broker.subscribe(topic, mode=MessageSubscriptionMode.NewestOnly)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New question: why do we need to subscribe to the broker, and then work through the subscription? Intuitively, I would have asked the broker directly for a next message, next message ID etc. Is it only to be able to define the subscription mode or is there more behind it?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One big problem currently with datastreams is that the next frame ID is linked to your opened datastream. Furthermore, service proxies cache the datastream object, since closing and reopening is an expensive operation and so we are minimizing that. This means that if you do stream.get_next_frame() on the same stream, given to you on the same service, the threads will compete for the next frame. Ie. the threads are bound to the same subscription.

By splitting the subscription up from the message broker / datastream, you avoid this problem. The next frame id to read is stored in the subscription, where it's supposed to be, rather than in the message broker / datastream. This was an oversight when developing catkit2 datastreams, and I'm kinda surprised that we haven't run into bugs of this kind so far.

assert message_2.payload[0] == 10
assert message_3.payload[0] == 11

assert subscription_newest.try_get_next_message() is None
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So this means once I get a message through a subscription, that message does not exist anymore? Would make sense, just double-checking - and trying to find the correct vocabulary for this ^^

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, a single subscription can only access a certain message once. The try_get_next_frame() function is there for datastreams as well, but hidden behind a timeout=0, which reads badly.

So, there is get_next_message() which gets the next message in your subscription, according to your MessageSubscriptionMode, which will wait for that message if it's not there yet or return immediately if it is. And we have try_get_next_message() which doesn't wait and will return None if it's not available yet.

assert subscription_sequential.try_get_next_message() is None

subscription_newest2 = broker.subscribe(topic, starting_frame_id=1, mode=MessageSubscriptionMode.NewestOnly)
assert subscription_newest2.next_message_id == 2
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this 2 if you give it a starting ID of 2? Does it not give you the same one? The sequential subscription below shows the behavior I expect, so why does the "newest" subscription mode automatically up the message id?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MessageSubscriptionMode.Sequential will try to give you messages without dropped frames, even if there are newer messages available. MessageSubscriptionMode.NewestOnly will instead drop frames to give you the most recent update. In this case, subscription_newest2 is trying to read frame 1, but sees that frame 2 is already there, so it will skip frame 1 and give you frame 2. subscription_sequential2 will not skip frames, and so will give you frame 1 first, then frame 2 afterwards (untested here, because that was already tested a few asserts above).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Potentially stupid) follow-up question: How come there is frame 2 already there?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We submitted three frames to the message broker: frame 0, 1 and 2.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or I'm misunderstanding the question.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Submitted where? I only see them submitted at the very top, and we access them all later on, so they shouldn't be there anymore, no? Or does a new subscription have access to all the messages?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Messages are not consumed. You can access historical data as well. The last N messages are kept for each topic (currently N = 32), similar to how the last N frames are kept for datastreams.

Sorry, I should have said that earlier. This is different than Apacha Kafka or Aeron, if you're familiar with those. In those frameworks, messages are only delivered once, and only accessible if published after you created your subscription. In our message broker, messages are delivered once and then can be accessed later, kinda like a time series database. I'm not fully convinced about the latter capability, since I don't think we ever used it on HiCAT. And it complicates the networking interface that I'm building now.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah gotcha!! I don't know those in particular, but that's the type of systems I was in touch with previously. Makes sense, thanks a lot for the effort you put into all these explanations!

@ivalaginja
Copy link
Copy Markdown
Collaborator

@ehpor I am unsure what I am doing wrong. I am trying to reinstall catkit2 so that I can test the tests, but the installation fails with the below error message. I am slowly acquiring PTSD from Cmake errors 😬

(catkit2) maintenances-MacBook-Pro-6:catkit2 ilaginja$ pip install -e .
Obtaining file:///Users/ilaginja/repos/catkit2
  Installing build dependencies ... done
  Checking if build backend supports build_editable ... done
  Getting requirements to build editable ... done
  Installing backend dependencies ... done
  Preparing editable metadata (pyproject.toml) ... done
Building wheels for collected packages: catkit2
  Building editable for catkit2 (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  × Building editable for catkit2 (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [41 lines of output]
      2025-05-07 09:28:20,644 - scikit_build_core - INFO - RUN: /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/cmake -E capabilities
      2025-05-07 09:28:20,674 - scikit_build_core - INFO - CMake version: 3.29.3
      *** scikit-build-core 0.11.2 using CMake 3.29.3 (editable)
      2025-05-07 09:28:20,724 - scikit_build_core - INFO - Build directory: /private/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmptmubhn3l/build
      *** Configuring CMake...
      2025-05-07 09:28:20,765 - scikit_build_core - INFO - RUN: ninja --version
      2025-05-07 09:28:21,413 - scikit_build_core - INFO - Ninja version: 1.11.1
      2025-05-07 09:28:21,415 - scikit_build_core - INFO - RUN: /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/cmake -S. -B/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmptmubhn3l/build -DCMAKE_BUILD_TYPE:STRING=Release -C/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmptmubhn3l/build/CMakeInit.txt -DCMAKE_INSTALL_PREFIX=/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmptmubhn3l/wheel/platlib -DCMAKE_MAKE_PROGRAM=ninja
      loading initial cache file /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmptmubhn3l/build/CMakeInit.txt
      -- The C compiler identification is AppleClang 13.0.0.13000027
      -- The CXX compiler identification is AppleClang 13.0.0.13000027
      -- Detecting C compiler ABI info
      -- Detecting C compiler ABI info - done
      -- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/clang - skipped
      -- Detecting C compile features
      -- Detecting C compile features - done
      -- Detecting CXX compiler ABI info
      -- Detecting CXX compiler ABI info - done
      -- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/clang++ - skipped
      -- Detecting CXX compile features
      -- Detecting CXX compile features - done
      CMake Error at catkit_core/CMakeLists.txt:41 (find_package):
        By not providing "Findcppzmq.cmake" in CMAKE_MODULE_PATH this project has
        asked CMake to find a package configuration file provided by "cppzmq", but
        CMake did not find one.
      
        Could not find a package configuration file provided by "cppzmq" with any
        of the following names:
      
          cppzmqConfig.cmake
          cppzmq-config.cmake
      
        Add the installation prefix of "cppzmq" to CMAKE_PREFIX_PATH or set
        "cppzmq_DIR" to a directory containing one of the above files.  If "cppzmq"
        provides a separate development package or SDK, be sure it has been
        installed.
      
      
      -- Configuring incomplete, errors occurred!
      
      *** CMake configuration failed
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building editable for catkit2
Failed to build catkit2
ERROR: Could not build wheels for catkit2, which is required to install pyproject.toml-based projects
(catkit2) maintenances-MacBook-Pro-6:catkit2 ilaginja$ 

@ehpor
Copy link
Copy Markdown
Collaborator Author

ehpor commented May 7, 2025

For me, this has always been a problem of not activating the environment, or, worse, conda telling me the environment is activated while it is not. After deactivating the environment, then reactivating it again, it works for me. Another check is to see if cppzmq is installed conda list cppzmq. It should be.

FYI: I've been becoming so fed up with this, that there is #312 which removes cppzmq as dependency (not the root cause btw), and #276 (for doing a correct build of the library).

@ivalaginja
Copy link
Copy Markdown
Collaborator

... it actually seems like I don't have cppmq installed? No output when I run conda list cppzmq, or conda list |grep cpp (tried the latter just in case I mistyped).

@ivalaginja
Copy link
Copy Markdown
Collaborator

I'll just install it manually. God knows on what outdated env file I created this environment.

@ivalaginja
Copy link
Copy Markdown
Collaborator

Uuughh. Time for a completely new environment from scratch?

(catkit2) maintenances-MacBook-Pro-6:catkit2 ilaginja$ pip install -e .                                        
Obtaining file:///Users/ilaginja/repos/catkit2                                                                 
  Installing build dependencies ... done                                                                       
  Checking if build backend supports build_editable ... done                                                   
  Getting requirements to build editable ... done                                                              
  Installing backend dependencies ... done                                                                     
  Preparing editable metadata (pyproject.toml) ... done                                                        
Building wheels for collected packages: catkit2
  Building editable for catkit2 (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  × Building editable for catkit2 (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [37 lines of output]
      2025-05-07 09:42:40,744 - scikit_build_core - INFO - RUN: /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/cmake -E capabilities
      2025-05-07 09:42:40,772 - scikit_build_core - INFO - CMake version: 3.29.4
      *** scikit-build-core 0.11.2 using CMake 3.29.4 (editable)
      2025-05-07 09:42:40,820 - scikit_build_core - INFO - Build directory: /private/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmpbgzqkwlc/build
      *** Configuring CMake...
      2025-05-07 09:42:40,855 - scikit_build_core - INFO - RUN: ninja --version
      2025-05-07 09:42:41,118 - scikit_build_core - INFO - Ninja version: 1.11.1
      2025-05-07 09:42:41,120 - scikit_build_core - INFO - RUN: /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/cmake -S. -B/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmpbgzqkwlc/build -DCMAKE_BUILD_TYPE:STRING=Release -C/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmpbgzqkwlc/build/CMakeInit.txt -DCMAKE_INSTALL_PREFIX=/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmpbgzqkwlc/wheel/platlib -DCMAKE_MAKE_PROGRAM=ninja
      loading initial cache file /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmpbgzqkwlc/build/CMakeInit.txt
      -- The C compiler identification is AppleClang 13.0.0.13000027
      -- The CXX compiler identification is AppleClang 13.0.0.13000027
      -- Detecting C compiler ABI info
      -- Detecting C compiler ABI info - done
      -- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/clang - skipped
      -- Detecting C compile features
      -- Detecting C compile features - done
      -- Detecting CXX compiler ABI info
      -- Detecting CXX compiler ABI info - done
      -- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/clang++ - skipped
      -- Detecting CXX compile features
      -- Detecting CXX compile features - done
      CMake Error at catkit_core/CMakeLists.txt:45 (find_package):
        Could not find a package configuration file provided by "Eigen3" with any
        of the following names:
      
          Eigen3Config.cmake
          eigen3-config.cmake
      
        Add the installation prefix of "Eigen3" to CMAKE_PREFIX_PATH or set
        "Eigen3_DIR" to a directory containing one of the above files.  If "Eigen3"
        provides a separate development package or SDK, be sure it has been
        installed.
      
      
      -- Configuring incomplete, errors occurred!
      
      *** CMake configuration failed
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building editable for catkit2
Failed to build catkit2
ERROR: Could not build wheels for catkit2, which is required to install pyproject.toml-based projects
(catkit2) maintenances-MacBook-Pro-6:catkit2 ilaginja$ 

@ivalaginja
Copy link
Copy Markdown
Collaborator

@ehpor I really don't know what I am doing wrong. I ran conda env update --file environment.yml on this branch, then pip install -e . and I still can't install things.

(catkit2) maintenances-MacBook-Pro-6:catkit2 ilaginja$ pip install -e .
Obtaining file:///Users/ilaginja/repos/catkit2
  Installing build dependencies ... done
  Checking if build backend supports build_editable ... done
  Getting requirements to build editable ... done
  Installing backend dependencies ... done
  Preparing editable metadata (pyproject.toml) ... done
Building wheels for collected packages: catkit2
  Building editable for catkit2 (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  × Building editable for catkit2 (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [94 lines of output]
      2025-05-07 09:49:08,924 - scikit_build_core - INFO - RUN: /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/cmake -E capabilities
      2025-05-07 09:49:08,975 - scikit_build_core - INFO - CMake version: 3.27.4
      *** scikit-build-core 0.10.7 using CMake 3.27.4 (editable)
      2025-05-07 09:49:09,068 - scikit_build_core - INFO - Build directory: /private/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build
      *** Configuring CMake...
      2025-05-07 09:49:09,130 - scikit_build_core - INFO - RUN: ninja --version
      2025-05-07 09:49:09,380 - scikit_build_core - INFO - Ninja version: 1.11.1
      2025-05-07 09:49:09,384 - scikit_build_core - INFO - RUN: /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/cmake -S. -B/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build -DCMAKE_BUILD_TYPE:STRING=Release -C/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/CMakeInit.txt -DCMAKE_INSTALL_PREFIX=/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/wheel/platlib -DCMAKE_MAKE_PROGRAM=ninja
      loading initial cache file /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/CMakeInit.txt
      -- The C compiler identification is AppleClang 13.0.0.13000027
      -- The CXX compiler identification is AppleClang 13.0.0.13000027
      -- Detecting C compiler ABI info
      -- Detecting C compiler ABI info - done
      -- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/gcc - skipped
      -- Detecting C compile features
      -- Detecting C compile features - done
      -- Detecting CXX compiler ABI info
      -- Detecting CXX compiler ABI info - done
      -- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/g++ - skipped
      -- Detecting CXX compile features
      -- Detecting CXX compile features - done
      -- Found nlohmann_json: /Users/ilaginja/opt/miniconda3/envs/catkit2/lib/cmake/nlohmann_json/nlohmann_jsonConfig.cmake (found version "3.9.1")
      -- Found Protobuf: /Users/ilaginja/opt/miniconda3/envs/catkit2/lib/libprotobuf.dylib (found version "3.20.3")
      CMake Warning (dev) at /Users/ilaginja/opt/miniconda3/envs/catkit2/lib/python3.7/site-packages/pybind11/share/cmake/pybind11/FindPythonLibsNew.cmake:101 (message):
        Policy CMP0148 is not set: The FindPythonInterp and FindPythonLibs modules
        are removed.  Run "cmake --help-policy CMP0148" for policy details.  Use
        the cmake_policy command to set the policy and suppress this warning, or
        preferably upgrade to using FindPython, either by calling it explicitly
        before pybind11, or by setting PYBIND11_FINDPYTHON ON before pybind11.
      Call Stack (most recent call first):
        /Users/ilaginja/opt/miniconda3/envs/catkit2/lib/python3.7/site-packages/pybind11/share/cmake/pybind11/pybind11Tools.cmake:50 (find_package)
        /Users/ilaginja/opt/miniconda3/envs/catkit2/lib/python3.7/site-packages/pybind11/share/cmake/pybind11/pybind11Common.cmake:228 (include)
        /Users/ilaginja/opt/miniconda3/envs/catkit2/lib/python3.7/site-packages/pybind11/share/cmake/pybind11/pybind11Config.cmake:250 (include)
        catkit2/CMakeLists.txt:10 (find_package)
      This warning is for project developers.  Use -Wno-dev to suppress it.
      
      -- Found PythonInterp: /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/python3.7 (found suitable version "3.7.16", minimum required is "3.7")
      -- Found PythonLibs: /Users/ilaginja/opt/miniconda3/envs/catkit2/lib/libpython3.7m.dylib
      -- Performing Test HAS_FLTO_THIN
      -- Performing Test HAS_FLTO_THIN - Success
      -- Found pybind11: /Users/ilaginja/opt/miniconda3/envs/catkit2/lib/python3.7/site-packages/pybind11/include (found version "2.13.6")
      -- Found nlohmann_json: /Users/ilaginja/opt/miniconda3/envs/catkit2/lib/cmake/nlohmann_json/nlohmann_jsonConfig.cmake (found suitable version "3.9.1", minimum required is "3.2.0")
      -- Configuring done (4.4s)
      -- Generating done (0.1s)
      -- Build files have been written to: /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build
      *** Building project with Ninja...
      2025-05-07 09:49:13,954 - scikit_build_core - INFO - RUN: /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/cmake --build /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build -v
      Change Dir: '/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build'
      
      Run Build Command(s): ninja -v
      [1/61] cd /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit2 && /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/protoc --proto_path=/Users/ilaginja/repos/catkit2/catkit2/../proto/ --python_out=/Users/ilaginja/repos/catkit2/catkit2/./proto/ /Users/ilaginja/repos/catkit2/catkit2/../proto/core.proto /Users/ilaginja/repos/catkit2/catkit2/../proto/logging.proto /Users/ilaginja/repos/catkit2/catkit2/../proto/service.proto /Users/ilaginja/repos/catkit2/catkit2/../proto/testbed.proto /Users/ilaginja/repos/catkit2/catkit2/../proto/tracing.proto
      [2/61] cd /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core && /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/protoc --cpp_out /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen/ -I /Users/ilaginja/repos/catkit2/catkit_core -I /Users/ilaginja/repos/catkit2/proto /Users/ilaginja/repos/catkit2/proto/core.proto
      [3/61] cd /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core && /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/protoc --cpp_out /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen/ -I /Users/ilaginja/repos/catkit2/catkit_core -I /Users/ilaginja/repos/catkit2/proto /Users/ilaginja/repos/catkit2/proto/service.proto
      [4/61] cd /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core && /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/protoc --cpp_out /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen/ -I /Users/ilaginja/repos/catkit2/catkit_core -I /Users/ilaginja/repos/catkit2/proto /Users/ilaginja/repos/catkit2/proto/tracing.proto
      [5/61] cd /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core && /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/protoc --cpp_out /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen/ -I /Users/ilaginja/repos/catkit2/catkit_core -I /Users/ilaginja/repos/catkit2/proto /Users/ilaginja/repos/catkit2/proto/logging.proto
      [6/61] cd /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core && /Users/ilaginja/opt/miniconda3/envs/catkit2/bin/protoc --cpp_out /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen/ -I /Users/ilaginja/repos/catkit2/catkit_core -I /Users/ilaginja/repos/catkit2/proto /Users/ilaginja/repos/catkit2/proto/testbed.proto
      [7/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/LocalMemory.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/LocalMemory.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/LocalMemory.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/LocalMemory.cpp
      [8/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/HostName.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/HostName.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/HostName.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/HostName.cpp
      [9/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/BuddyAllocator.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/BuddyAllocator.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/BuddyAllocator.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/BuddyAllocator.cpp
      [10/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Log.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Log.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Log.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Log.cpp
      [11/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Event.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Event.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Event.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Event.cpp
      [12/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/HybridPoolAllocator.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/HybridPoolAllocator.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/HybridPoolAllocator.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/HybridPoolAllocator.cpp
      [13/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/HashMap.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/HashMap.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/HashMap.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/HashMap.cpp
      [14/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/LogConsole.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/LogConsole.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/LogConsole.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/LogConsole.cpp
      [15/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/PoolAllocator.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/PoolAllocator.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/PoolAllocator.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/PoolAllocator.cpp
      [16/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/LogFile.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/LogFile.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/LogFile.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/LogFile.cpp
      [17/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Client.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Client.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Client.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Client.cpp
      [18/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Command.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Command.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Command.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Command.cpp
      [19/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/ServiceState.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/ServiceState.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/ServiceState.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/ServiceState.cpp
      [20/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/SharedMemory.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/SharedMemory.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/SharedMemory.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/SharedMemory.cpp
      [21/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/DataStream.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/DataStream.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/DataStream.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/DataStream.cpp
      [22/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Server.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Server.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Server.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Server.cpp
      [23/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Property.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Property.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Property.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Property.cpp
      [24/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Timing.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Timing.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Timing.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Timing.cpp
      [25/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Shareable.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Shareable.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Shareable.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Shareable.cpp
      [26/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/MessageBroker.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/MessageBroker.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/MessageBroker.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/MessageBroker.cpp
      [27/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/proto/core.pb.cc.o -MF catkit_core/CMakeFiles/catkit_core.dir/proto/core.pb.cc.o.d -o catkit_core/CMakeFiles/catkit_core.dir/proto/core.pb.cc.o -c /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/proto/core.pb.cc
      FAILED: catkit_core/CMakeFiles/catkit_core.dir/proto/core.pb.cc.o
      /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/proto/core.pb.cc.o -MF catkit_core/CMakeFiles/catkit_core.dir/proto/core.pb.cc.o.d -o catkit_core/CMakeFiles/catkit_core.dir/proto/core.pb.cc.o -c /var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/proto/core.pb.cc
      clang: error: no such file or directory: '/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/proto/core.pb.cc'
      clang: error: no input files
      [28/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Util.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Util.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Util.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Util.cpp
      [29/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/LogForwarder.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/LogForwarder.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/LogForwarder.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/LogForwarder.cpp
      [30/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Tensor.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Tensor.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Tensor.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Tensor.cpp
      [31/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Uuid.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Uuid.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Uuid.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Uuid.cpp
      [32/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Tracing.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Tracing.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Tracing.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Tracing.cpp
      [33/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/ServiceProxy.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/ServiceProxy.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/ServiceProxy.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/ServiceProxy.cpp
      [34/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Types.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Types.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Types.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Types.cpp
      [35/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/Service.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/Service.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/Service.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/Service.cpp
      [36/61] /Library/Developer/CommandLineTools/usr/bin/g++ -DPROTOBUF_USE_DLLS -I/var/folders/28/w2xb9gbd7_g3wxh48m73qv840000gp/T/tmp0xk3ekoc/build/catkit_core/gen -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include -isystem /Users/ilaginja/opt/miniconda3/envs/catkit2/include/eigen3 -O3 -DNDEBUG -std=gnu++17 -arch x86_64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk -fPIC -g -MD -MT catkit_core/CMakeFiles/catkit_core.dir/TestbedProxy.cpp.o -MF catkit_core/CMakeFiles/catkit_core.dir/TestbedProxy.cpp.o.d -o catkit_core/CMakeFiles/catkit_core.dir/TestbedProxy.cpp.o -c /Users/ilaginja/repos/catkit2/catkit_core/TestbedProxy.cpp
      ninja: build stopped: subcommand failed.
      
      
      *** CMake build failed
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building editable for catkit2
Failed to build catkit2
ERROR: Could not build wheels for catkit2, which is required to install pyproject.toml-based projects

@ehpor
Copy link
Copy Markdown
Collaborator Author

ehpor commented May 7, 2025

@ivalaginja That looks like the same error that @brynickson had during the hackathon. I don't remember how she fixed that or what the problem was. I do remember if felt like magic.

@ehpor
Copy link
Copy Markdown
Collaborator Author

ehpor commented May 7, 2025

And yes, protobuf is also something that I intend to rip out after the message broker transition. We will not need it anymore after that.

@ivalaginja
Copy link
Copy Markdown
Collaborator

@ivalaginja That looks like the same error that @brynickson had during the hackathon. I don't remember how she fixed that or what the problem was. I do remember if felt like magic.

@raphaelpclt @brynickson any pointers on how this was fixed?

@ivalaginja
Copy link
Copy Markdown
Collaborator

@ivalaginja That looks like the same error that @brynickson had during the hackathon. I don't remember how she fixed that or what the problem was. I do remember if felt like magic.

@raphaelpclt @brynickson any pointers on how this was fixed?

@ehpor I am now told by @raphaelpclt that you were actually working through this with @brynickson, who is currently out of office ^^

@raphaelpclt
Copy link
Copy Markdown
Collaborator

@ivalaginja That looks like the same error that @brynickson had during the hackathon. I don't remember how she fixed that or what the problem was. I do remember if felt like magic.

@raphaelpclt @brynickson any pointers on how this was fixed?

@ehpor I am now told by @raphaelpclt that you were actually working through this with @brynickson, who is currently out of office ^^

From what I remember it was a compiling tools issue - a package needing to be updated. Maybe cmake?

@ivalaginja
Copy link
Copy Markdown
Collaborator

Ha. @raphaelpclt and I found a solution: upgrade cmake manually to version 3.31.2

Installation worked now. Tests tbd.

Copy link
Copy Markdown
Collaborator

@ivalaginja ivalaginja left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The python test code makes sense to me, and the tests pass on my MacOs 12.2. Note that I run a conda environment with Python 3.9.12 (THD2 default) and I had to upgrade cmake to 3.31.2.

If you could still answer my last question that'd be great, but that's just for my own understanding anyway.

I guess we better hold off of merging until we get more reviews in?

@ehpor
Copy link
Copy Markdown
Collaborator Author

ehpor commented May 7, 2025

Yep, forgot to show my testing:

  • Tested on Windows 11, AMD 5900X + benchmarks, Python 3.7
  • Tested on Ubuntu 20.04, AMD Threadripper 5995WX + benchmarks, Python 3.8 & 3.11
  • Tested on MacOS Sonoma 14.7, Macbook M2 Pro + benchmarks, Python 3.8, 3.11

There are two PRs open (#310 & #311), which reference this one, that make improvements / bugfixes. And a third one on the way working on network communications between message brokers (introducing a ShardedMessageBroker class).

@ivalaginja
Copy link
Copy Markdown
Collaborator

@ehpor btw, does this PR require rewriting some of the catkit2 docs? Or does this touch all our unwritten docs only? ^^

@ehpor
Copy link
Copy Markdown
Collaborator Author

ehpor commented May 7, 2025

Only touches the unwritten part of the docs 😭

@ehpor
Copy link
Copy Markdown
Collaborator Author

ehpor commented May 7, 2025

Merging at the end of today @RemiSoummer, unless you have objections.

@RemiSoummer
Copy link
Copy Markdown
Collaborator

@ehpor I haven't had a chance to even start looking at it, so go ahead if you need to merge it.

@ehpor ehpor merged commit 8d94635 into develop May 7, 2025
6 checks passed
@ehpor ehpor deleted the feature/message_broker branch May 7, 2025 22:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants