All Versions
22
Latest Version
Avg Release Cycle
64 days
Latest Release
806 days ago

Changelog History
Page 1

  • v0.18.5 Changes

    July 16, 2021

    ๐Ÿ›  Fixed

    • 0.18.4 introduced a potential crash when using the OpenSSL module and encountering SSL_ERROR_WANT_READ. The crash manifested if CAF resumed a write operation but failed to fully reset its state. The state management (and consequently the crash) has been fixed.
    • CAF now clears the actor registry before calling the destructors of loaded modules. This fixes undefined behavior that could occur in rare cases where actor cleanup code could run after loaded modules had been destroyed.
  • v0.18.4 Changes

    July 07, 2021

    โž• Added

    • The new class caf::telemetry::importer::process allows users to get access to process metrics even when not configuring CAF to export metrics to Prometheus via HTTP.

    ๐Ÿ”„ Changed

    • Message views now perform the type-check in their constructor. With this change, the make_* utility functions are no longer mandatory and users may instead simply construct the view directly.

    ๐Ÿ›  Fixed

    • ๐Ÿ–จ Printing a config_value that contains a zero duration timespan now properly prints 0s instead of 1s (#1262). This bug most notably showed up when setting a timespan parameter such as caf.middleman.heartbeat-interval via config file or CLI to 0s and then printing the config parameter, e.g., via --dump-config.
    • ๐Ÿš€ Blocking actors now release their private thread before decrementing the running-actors count to resolve a race condition during system shutdown that could result in the system hanging (#1266).
    • When using the OpenSSL module, CAF could run into a state where the SSL layer wants to read data while CAF is trying to send data. In this case, CAF did not properly back off, causing high CPU load due to spinning and in some scenarios never recovering. This issue has been resolved by properly handling SSL_ERROR_WANT_READ on the transport (#1060).
    • โฑ Scheduled actors now accept default handlers for down messages etc. with non-const apply operator such as lambda expressions declared as mutable.

    โœ‚ Removed

    • โฌ‡๏ธ Dropped three obsolete (and broken) macros in the unit_test.hpp header: CAF_CHECK_FAILED, CAF_CHECK_FAIL and CAF_CHECK_PASSED.
  • v0.18.3 Changes

    May 21, 2021

    โž• Added

    • The actor_system_config now has an additional member called config_file_path_alternatives. With this, users can configure fallback paths for locating a configuration file. For example, an application my-app on a UNIX-like system could set config_file_path to my-app.conf and then add /etc/my-app.conf to config_file_path_alternatives in order to follow the common practice of looking into the current directory first before looking for a system-wide configuration file.

    ๐Ÿ”„ Changed

    • Counters in histogram buckets are now always integers, independently on the value type of the histogram. Buckets can never increase by fractional values.

    ๐Ÿ—„ Deprecated

    • All parse function overloads in actor_system_config that took a custom configuration file path as argument were deprecated in favor of consistently asking users to use the config_file_path and config_file_path_alternatives member variables instead

    ๐Ÿ›  Fixed

    • For types that offer implicit type conversion, trying to construct a result<T> could result in ambiguity since compilers could construct either T itself or expected<T> for calling a constructor of result<T>. To fix the ambiguity, result<T> now accepts any type that allows constructing a T internally without requiring a type conversion to T as an argument (#1245).
    • ๐Ÿ›  Fix configuration parameter lookup for the work-stealing scheduler policy.
    • Applications that expose metrics to Prometheus properly terminate now.
  • v0.18.2 Changes

    March 26, 2021

    โž• Added

    • CAF includes two new inspector types for consuming and generating JSON-formatted text: json_writer and json_reader.

    ๐Ÿ”„ Changed

    • Setter functions for fields may now return either bool, caf::error or void. Previously, CAF only allowed bool.

    ๐Ÿ›  Fixed

    • Passing a getter and setter pair to an inspector via apply produced a compiler error for non-builtin types. The inspection API now recursively inspects user-defined types instead, as was the original intend (#1216).
    • The handle type typed_actor now can construct from a typed_actor_pointer. This resolves a compiler error when trying to initialize a handle for my_handle from a self pointer of type my_handle::pointer_view (#1218).
    • Passing a function reference to the constructor of an actor caused a compiler error when building with logging enabled. CAF now properly handles this edge case and logs such constructor arguments as <unprintable> (#1229).
    • ๐Ÿ“œ The CLI parser did not recognize metrics filters. Hence, passing --caf.metrics-filters.actors.includes=... to a CAF application resulted in an error. The includes and excludes filters are now consistently handled and accepted in config files as well as on the command line (#1238).
    • ๐Ÿ—„ Silence a deprecated-enum-conversion warning for std::byte (#1230).
    • ๐Ÿ›  Fix heap-use-after-free when accessing the meta objects table in applications that leave the main function while the actor system and its worker threads are still running (#1241).
    • โœ… The testing DSL now properly accounts for the message prioritization of actors (suspending regular behavior until receiving the response) when using request.await (#1232).
  • v0.18.1 Changes

    March 19, 2021

    ๐Ÿ›  Fixed

    • ๐Ÿ”– Version 0.18.0 introduced a regression on the system parameter caf.middleman.heartbeat-interval (#1235). We have addressed the issue by porting the original fix for CAF 0.17.5 (#1095) to the 0.18 series.
  • v0.18.0 Changes

    January 25, 2021

    โž• Added

    • The enum caf::sec received an additional error code: connection_closed.
    • The new byte_span and const_byte_span aliases provide convenient definitions when working with sequences of bytes.
    • The base metrics now include four new histograms for illuminating the I/O module: caf.middleman.inbound-messages-size, caf.middleman.outbound-messages-size, caf.middleman.deserialization-time and caf.middleman.serialization-time.
    • โž• The macro CAF_ADD_TYPE_ID now accepts an optional third parameter for allowing users to override the default type name.
    • The new function pair get_as and get_or model type conversions on a config_value. For example, get_as<int>(x) would convert the content of x to an int by either casting numeric values to int (with bound checks) or trying to parse the input of x if it contains a string. The function get_or already existed for settings, but we have added new overloads for generalizing the function to config_value as well.
    • The typed_response_promise received additional member functions to mirror the interface of the untyped response_promise.
    • ๐Ÿ”ง Configuration files now allow dot-separated notation for keys. For example, users may write caf.scheduler.max-threads = 4 instead of the nested form caf { scheduler { max-threads = 4 } }.

    ๐Ÿ—„ Deprecated

    • The new get_as and get_or function pair makes type conversions on a config_value via get, get_if, etc. obsolete. We will retain the STL-style interface for treating a config_value as a variant-like type.

    ๐Ÿ”„ Changed

    • 0๏ธโƒฃ When using CAF_MAIN, CAF now looks for the correct default config file name, i.e., caf-application.conf.
    • Simplify the type inspection API by removing the distinction between apply_object and apply_value. Instead, inspectors only offer apply and users may now also call map, list, and tuple for unboxing simple wrapper types. Furthermore, CAF no longer automatically serializes enumeration types using their underlying value because this is fundamentally unsafe.
    • ๐Ÿ“œ CAF no longer parses the input to string options on the command line. For example, my_app '--msg="hello"' results in CAF storing "hello" (including the quotes) for the config option msg. Previously, CAF tried to parse any string input on the command-line that starts with quotes in the same way it would parse strings from a config file, leading to very unintuitive results in some cases (#1113).
    • Response promises now implicitly share their state when copied. Once the reference count for the state reaches zero, CAF now produces a broken_promise error if the actor failed to fulfill the promise by calling either dispatch or delegate.

    ๐Ÿ›  Fixed

    • Setting an invalid credit policy no longer results in a segfault (#1140).
    • ๐Ÿ”– Version 0.18.0-rc.1 introduced a regression that prevented CAF from writing parameters parsed from configuration files back to variables. The original behavior has been restored, i.e., variables synchronize with user input from configuration files and CLI arguments (#1145).
    • โช Restore correct functionality of middleman::remote_lookup (#1146). This fixes a regression introduced in version 0.18.0-rc.1
    • ๐Ÿ›  Fixed an endless recursion when using the default_inspector from inspect overloads (#1147).
    • ๐Ÿ‘ CAF 0.18 added support for make_behavior in state classes. However, CAF erroneously picked this member function over running the function body when spawning function-based actors (#1149).
    • When passing nullptr or custom types with implicit conversions to const char* to deep_to_string, CAF could run into a segfault in the former case or do unexpected things in the latter case. The stringification inspector now matches precisely on pointer types to stop the compiler from doing implicit conversions in the first place.
    • ๐Ÿง Building executables that link to CAF on 32-bit Linux versions using GCC failed due to undefined references to __atomic_fetch symbols. Adding a CMake dependency for caf_core to libatomic gets executables to compile and link as expected (#1153).
    • ๐Ÿ›  Fixed a regression for remote groups introduced in 0.18.0-rc.1 (#1157).
    • CAF 0.18 introduced the option to set different excluded-components filters for file and console log output. However, CAF rejected all events that matched either filter. The new implementation uses the intersection of both filters to reject log messages immediately (before enqueueing it to the logger's queue) and then applies the filters individually when generating file or console output.
    • ๐Ÿ›  Fix memory leaks when deserializing URIs and when detaching the content of messages (#1160).
    • ๐Ÿ›  Fix undefined behavior in string_view::compare (#1164).
    • ๐Ÿ›  Fix undefined behavior when passing --config-file= (i.e., without actual argument) to CAF applications (#1167).
    • Protect against self-assignment in a couple of CAF classes (#1169).
    • Skipping high-priority messages resulted in CAF lowering the priority to normal. This unintentional demotion has been fixed (#1171).
    • ๐Ÿ›  Fix undefined behavior in the experimental datagram brokers (#1174).
    • Response promises no longer send empty messages in response to asynchronous messages.
    • โž• CAF_ADD_TYPE_ID now works with types that live in namespaces that also exist as nested namespace in CAF such as detail or io (#1195).
    • Solved a race condition on detached actors that blocked ordinary shutdown of actor systems in some cases (#1196).
  • v0.18.0-rc.1 Changes

    September 09, 2020

    โž• Added

    • The new fan_out_request function streamlines fan-out/fan-in work flows (see
      the new example in examples/message_passing/fan_out_request.cpp as well as
      ๐Ÿ‘ the new manual entry). The policy-based design further allows us to support
      more use cases in the future (#932, #964).
    • We introduced the lightweight template class error_code as an alternative to
      the generic but more heavyweight class error. The new error code abstraction
      simply wraps an enumeration type without allowing users to add additional
      context such as error messages. However, whenever such information is
      unneeded, the new class is much more efficient than using error.
    • Tracing messages in distributed systems is a common practice for monitoring
      and debugging message-based systems. The new tracing_data abstraction in CAF
      enables users to augment messages between actors with arbitrary meta data.
      ๐Ÿ— This is an experimental API that requires building CAF with the CMake option
      CAF_ENABLE_ACTOR_PROFILER (#981).
    • โž• Add compact from..to..step list notation in configuration files. For
      example, [1..3] expands to [1, 2, 3] and [4..-4..-2] expands to
      [4, 2, 0, -2, -4] (#999).
    • ๐Ÿ‘ Allow config keys to start with numbers (#1014).
    • The fan_out_request function got an additional policy for picking just the
      fist result: select_any (#1012).
    • โš™ Run-time type information in CAF now uses 16-bit type IDs. Users can assign
      this ID by specializing type_id manually (not recommended) or use the new
      API for automatically assigning ascending IDs inside CAF_BEGIN_TYPE_ID_BLOCK
      and CAF_END_TYPE_ID_BLOCK code blocks.
    • The new typed view types typed_message_view and const_typed_message_view
      ๐Ÿ‘‰ make working with message easier by providing a std::tuple-like interface
      (#1034).
    • The class exit_msg finally got its missing operator== (#1039).
    • ๐Ÿ“œ The class node_id received an overload for parse to allow users to convert
      the output of to_string back to the original ID (#1058).
    • Actors can now monitor and demonitor CAF nodes (#1042). Monitoring a CAF
      node causes the actor system to send a node_down_msg to the observer when
      losing connection to the monitored node.
    • In preparation of potential future API additions/changes, CAF now includes an
      RFC4122-compliant uuid class.
    • The new trait class is_error_code_enum allows users to enable conversion of
      custom error code enums to error and error_code.
    • CAF now enables users to tap into internal CAF metrics as well as adding their
      own instrumentation! Since this addition is too large to cover in a changelog
      entry, please have a look at the new Metrics Section of the manual to learn
      more.

    ๐Ÿ—„ Deprecated

    • 0๏ธโƒฃ The to_string output for error now renders the error code enum by default.
      This renders the member functions actor_system::render and
      actor_system_config::render obsolete.
    • ๐Ÿ‘ป Actors that die due to an unhandled exception now use sec::runtime_error
      consistently. This makes exit_reason::unhandled_exception obsolete.

    ๐Ÿ”„ Changed

    • ๐Ÿ— CAF now requires C++17 to build.
    • On UNIX, CAF now uses visibility hidden by default. All API functions and
      types that form the ABI are explicitly exported using module-specific macros.
      ๐Ÿ On Windows, this change finally enables building native DLL files.
    • ๐Ÿ’… We switched our coding style to the C++17 nested namespace syntax.
    • CAF used to generate the same node ID when running on the same machine and
      only differentiates actors systems by their process ID. When running CAF
      instances in a container, this process ID is most likely the same for each
      โš™ run. This means two containers can produce the same node ID and thus
      equivalent actor IDs. In order to make it easier to use CAF in a containerized
      environment, we now generate unique (random) node IDs (#970).
    • We did a complete redesign of all things serialization. The central class
      ๐Ÿšš data_processor got removed. The two classes for binary serialization no
      longer extend the generic interfaces serializer and deserializer in order
      to avoid the overhead of dynamic dispatching as well as the runtime cost of
      error return values. This set of changes leads so some code duplication,
      because many CAF types now accept a generic (de)serializer as well as a
      ๐ŸŽ binary_(de)serializer but significantly boosts performance in the hot code
      paths of CAF (#975).
    • ๐Ÿ‘ With C++17, we no longer support compilers without support for thread_local.
      ๐Ÿšš Consequently, we removed all workarounds and switched to the C++ keyword
      (#996).
    • Our manual now uses reStructuredText instead of LaTeX. We hope this makes
      extending the manual easier and lowers the barrier to entry for new
      contributors.
    • A stateful_actor now forwards excess arguments to the State rather than to
      0๏ธโƒฃ the Base. This enables states with non-default constructors. When using
      stateful_actor<State> as pointer type in function-based actors, nothing
      ๐Ÿ”„ changes (i.e. the new API is backwards compatible for this case). However,
      calling spawn<stateful_actor<State>>(xs...) now initializes the State with
      the argument pack xs... (plus optionally a self pointer as first
      argument). Furthermore, the state class can now provide a make_behavior
      member function to initialize the actor (this has no effect for function-based
      actors).
    • In order to stay more consistent with naming conventions of the standard
      library, we have renamed some values of the pec enumeration:
      • illegal_escape_sequence => invalid_escape_sequence
      • illegal_argument => invalid_argument
      • illegal_category => invalid_category
    • CAF no longer automagically flattens tuple, optional, or expected when
      returning these types from message handlers. Users can simply replace
      std::tuple<A, B, C> with caf::result<A, B, C> for returning more than one
      value from a message handler.
    • A caf::result can no longer represent skip. Whether a message gets skipped
      0๏ธโƒฃ or not is now only for the default handler to decide. Consequently, default
      ๐Ÿ– handlers now return skippable_result instead of result<message>. A
      skippable result is a variant over delegated<message>, message, error,
      or skip_t. The only good use case for message handlers that skip a message
      in their body was in typed actors for getting around the limitation that a
      typed behavior always must provide all message handlers (typed behavior assume
      a complete implementation of the interface). This use case received direct
      support: constructing a typed behavior with partial_behavior_init as first
      argument suppresses the check for completeness.
    • In order to reduce complexity of typed actors, CAF defines interfaces as a set
      of function signatures rather than using custom metaprogramming facilities.
      Function signatures must always wrap the return type in a result<T>. For
      example: typed_actor<result<double>(double)>. We have reimplemented the
      metaprogramming facilities racts_to<...> and replies_to<...>::with<...>
      as an alternative way of writing the function signature.
    • All parsing functions in actor_system_config that take an input stream
      ๐Ÿ”ง exclusively use the new configuration syntax (please consult the manual for
      ๐Ÿ”ง details and examples for the configuration syntax).
    • The returned string of name() must not change during the lifetime of an
      actor. Hence, stateful_actor now only considers static name members in its
      State for overriding this function. CAF always assumed names belonging to
      types, but did not enforce it because the name was only used for logging.
      Since the new metrics use this name for filtering now, we enforce static names
      in order to help avoid hard-to-find issues with the filtering mechanism.
    • The type inspection API received a complete overhaul. The new DSL for writing
      inspect functions exposes the entire structure of an object to CAF. This
      enables inspectors to read and write a wider range of data formats. In
      ๐Ÿ”ง particular human-readable, structured data such as configuration files, JSON,
      XML, etc. The inspection API received too many changes to list them here.
      Please refer to the manual section on type inspection instead.

    โœ‚ Removed

    • A vendor-neutral API for GPGPU programming sure sounds great. Unfortunately,
      OpenCL did not catch on in the way we had hoped. At this point, we can call
      ๐Ÿ‘ OpenCL dead and gone. There is only legacy support available and recent
      ๐Ÿ”– versions of the standard were never implemented in the first place.
      Consequently, we've dropped the opencl module.
    • The old duration type is now superseded by timespan (#994).
    • The enum match_result became obsolete. Individual message handlers can no
      longer skip messages. Hence, message handlers can only succeed (match) or not.
      Consequently, invoking a message handler or behavior now returns a boolean.
    • โฑ All member functions of scheduled_actor for adding stream managers (such as
      ๐Ÿšš make_source) were removed in favor their free-function equivalent, e.g.,
      attach_stream_source
    • ๐Ÿ”ง The configuration format of CAF has come a long way since first starting to
      ๐Ÿ‘ allow user-defined configuration via .ini files. Rather than sticking with
      the weird hybrid that evolved over the years, we finally get rid of the last
      pieces of INI syntax and go with the much cleaner, scoped syntax. The new
      ๐Ÿ”ง default file name for configuration files is caf-application.conf.

    ๐Ÿ›  Fixed

    • ๐Ÿ›  Fix uninstall target when building CAF as CMake subdirectory.
    • Using inline_all_enqueues in deterministic unit tests could result in
      deadlocks when calling blocking functions in message handlers. This function
      now behaves as expected (#1016).
    • Exceptions while handling requests now trigger error messages (#1055).
    • The member function demonitor falsely refused typed actor handles. Actors
      could monitor typed actors but not demonitoring it again. This member function
      is now a template that accepts any actor handle in the same way monitor
      already did.
    • The typed_actor_view decorator lacked several member functions such as
      link_to, send_exit, etc. These are now available.
    • Constructing a typed_actor handle from a pointer view failed du to a missing
      constructor overload. This (explicit) overload now exists and the conversion
      should work as expected.
    • Sending floating points to remote actors changed infinity and NaN to
      ๐Ÿ›  garbage values (#1107). The fixed packing / unpacking routines for IEEE 754
      values keep these non-numeric values intact now. It is worth mentioning that
      โฌ‡๏ธ the new algorithm downgrades signaling NaN values to silent NaN values,
      because the standard API does not provide predicates to distinguish between the
      two. This should have no implications for real-world applications, because
      ๐Ÿšฆ actors that produce a signaling NaN trigger trap handlers before sending
      the result to another actor.
    • ๐Ÿ“œ The URI parser stored IPv4 addresses as strings (#1123). Users can now safely
      ๐Ÿ“œ assume that the parsed URI for tcp://127.0.0.1:8080 returns an IP address
      when calling authority().host.
  • v0.17.7 Changes

    ๐Ÿ›  Fixed

    • Datagram servants of UDP socket managers were not added as children to their parent broker on creation, which prevented proper system shutdown in some cases. Adding all servants consistently to the broker should make sure UDP brokers terminate correctly (#1133).
    • Backport stream manager fix from CAF 0.18 for fused downstream managers that prevent loss of messages during regular actor shutdown.
  • v0.17.6 Changes

    July 24, 2020

    ๐Ÿ›  Fixed

    • Trying to connect to an actor published via the OpenSSL module with the I/O
      module no longer hangs indefinitely (#1119). Instead, the OpenSSL module
      immediately closes the socket if initializing the SSL session fails.
  • v0.17.5 Changes

    May 13, 2020

    โž• Added

    • In order to allow users to start migrating towards upcoming API changes, CAF
      0.17.5 includes a subset of the CAF 0.18 type_id API. Listing all
      user-defined types between CAF_BEGIN_TYPE_ID_BLOCK and
      CAF_END_TYPE_ID_BLOCK assigns ascending type IDs. Only one syntax for
      โž• CAF_ADD_ATOM exists, since the atom text is still mandatory. Assigning type
      0๏ธโƒฃ IDs has no immediate effect by default. However, the new function
      actor_system_config::add_message_types accepts an ID block and adds
      โš™ runtime-type information for all types in the block.
    • In order to opt into the compile-time checks for all message types, users can
      set the CAF_ENABLE_TYPE_ID_CHECKS CMake flag to ON (pass
      ๐Ÿ— --enable-type-id-checks when using the configure script). Building CAF
      with this option causes compiler errors when sending a type without a type ID.
      This option in conjunction with the new add_message_types function removes a
      common source of bugs: forgetting to call add_message_type<T> for all types
      that can cross the wire.

    ๐Ÿ”„ Changed

    • Our manual now uses reStructuredText instead of LaTeX (backport from
      0.18).

    ๐Ÿ›  Fixed

    • ๐Ÿ›  Fix handling of OS-specific threading dependency in CMake.
    • ๐Ÿ›  Fix uninstall target when building CAF as CMake subdirectory (backport from
      0.18).
    • Fix potential deadlock with inline_all_enqueues (backport from 0.18).
    • Exceptions while handling requests now trigger error messages (backport from
      0.18).
    • ๐Ÿ›  Fix build on GCC 7.2
    • ๐Ÿ›  Fix build error in the OpenSSL module under some MSVC configurations
    • Serializer and deserializer now accept std::chrono::time_point for all clock
      types instead of hard-wiring std::system_clock.
    • In some edge cases, actors failed to shut down properly when hosting a stream
      ๐Ÿ›  source (#1076). The handshake process for a graceful shutdown has been fixed.
    • ๐Ÿ›  Fixed a compiler error on Clang 10 (#1077).
    • ๐Ÿ’ป Setting lists and dictionaries on the command line now properly overrides
      ๐Ÿ”ง default values and values from configuration files instead of appending to
      them (#942).
    • Using unquoted strings in command-line arguments inside lists now works as
      expected. For example, --foo=abc,def is now equivalent to
      --foo=["abc", "def"].