commit cbf6b8d7d1fc3b0c11577a7b988e9d82bab908ed Author: Greg Burd Date: Wed Apr 24 22:15:50 2024 -0400 initial import diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..97c11d2 --- /dev/null +++ b/.clang-format @@ -0,0 +1,39 @@ +--- +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: 'true' +AlignEscapedNewlines: Right +AlignTrailingComments: 'true' +AllowShortFunctionsOnASingleLine: 'true' +AllowShortBlocksOnASingleLine: 'true' +AlwaysBreakTemplateDeclarations: 'true' +AccessModifierOffset: -4 +BinPackArguments: 'false' +BinPackParameters: 'false' +BreakBeforeBraces: Mozilla +BreakBeforeInheritanceComma: 'true' +BreakBeforeTernaryOperators: 'true' +BreakConstructorInitializers: BeforeComma +BreakStringLiterals: 'true' +ColumnLimit: '80' +CompactNamespaces: 'false' +ConstructorInitializerAllOnOneLineOrOnePerLine: 'false' +FixNamespaceComments: 'true' +ForEachMacros: ['IMMER_CATCH', 'IMMER_TRY'] +IndentCaseLabels: 'false' +IndentWidth: '4' +IndentWrappedFunctionNames: 'false' +KeepEmptyLinesAtTheStartOfBlocks: 'false' +Language: Cpp +MaxEmptyLinesToKeep: '1' +NamespaceIndentation: None +PointerAlignment: Left +ReflowComments: 'true' +SortIncludes: 'true' +SortUsingDeclarations: 'true' +SpaceAfterCStyleCast: 'true' +SpaceAfterTemplateKeyword: 'true' +SpaceBeforeAssignmentOperators: 'true' +SpaceBeforeParens: ControlStatements +TabWidth: '4' +UseTab: Never +... diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 0000000..8adc4f1 --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,7 @@ +((nil . + ((indent-tabs-mode . nil) + (show-trailing-whitespace . t))) + (c-mode . + ((mode . c++))) + (c++-mode . + ((eval add-hook 'before-save-hook #'clang-format-buffer nil t)))) diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..47c52a0 --- /dev/null +++ b/.envrc @@ -0,0 +1,9 @@ +if ! has nix_direnv_version || ! nix_direnv_version 3.0.4; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.4/direnvrc" "sha256-DzlYZ33mWF/Gs8DDeyjr8mnVmQGx7ASYqA5WlxwvBG4=" +fi +watch_file devShell.nix shell.nix flake.nix +use flake || use nix + +CMAKE_GENERATOR=Ninja +CMAKE_MAKE_PROGRAM=Ninja + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adb818a --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# Seastar +seastar/ +app + +# CMake/Ninja +build/ + +# other... +.direnv + diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d877619 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "seastar"] + path = seastar + url = https://github.com/scylladb/seastar.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..38b1470 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,111 @@ +cmake_minimum_required(VERSION 3.18) + +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + message(FATAL_ERROR "Do not build in-source. Please remove CMakeCache.txt and the CMakeFiles/ directory. Then build out-of-source.") +endif() + +project(hanoidb + VERSION 0.1.0 + LANGUAGES C CXX) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(Seastar_CXX_DIALECT "gnu++20" CACHE STRING "") + +if(APPLE) +add_compile_options(-mmacosx-version-min=10.15) +endif() +############################ +## Modules and scripts ## +############################ + +# Standard CMake modules + +include(CTest) # Must be called before adding tests but after calling project(). This automatically calls enable_testing() and configures ctest targets when using Make/Ninja +include(CMakeDependentOption) # This is a really useful scripts that creates options that depends on other options. It can even be used with generator expressions ! +include(GNUInstallDirs) # This will define the default values for installation directories (all platforms even if named GNU) +include(InstallRequiredSystemLibraries) # Tell CMake that the `install` target needs to install required system libraries (eg: Windows SDK) +include(CMakePackageConfigHelpers) # Helper to create relocatable packages + +find_program(CCACHE_FOUND ccache) +if(CCACHE_FOUND) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) +endif(CCACHE_FOUND) + +# Custom modules and scripts + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") # Make our cmake scripts available + +#################### +## Dependencies ## +#################### + + +############### +## Options ## +############### + +option(ENABLE_INSTALL + "Should ${PROJECT_NAME} be added to the install list? Useful if included using add_subdirectory." ON) + +set(${PROJECT_NAME}_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" + CACHE STRING "Path to install ${PROJECT_NAME} Config*.cmake files to.") + +############### +## Targets ## +############### + +# Use the project root to find includes +include_directories(${PROJECT_SOURCE_DIR}) + +add_subdirectory(seastar) +add_subdirectory(src) + +############### +## Packaging ## +############### + +if(ENABLE_INSTALL) + # Use version checking helper provided by CMake so that users can + # safely use a version number in their find_package calls + write_basic_package_version_file( + ${PROJECT_NAME}ConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion) + + configure_package_config_file( + ${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + INSTALL_DESTINATION ${${PROJECT_NAME}_INSTALL_CMAKEDIR} + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO) + + install( + TARGETS hanoidb + EXPORT ${PROJECT_NAME}_Targets + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + + install(DIRECTORY ${PROJECT_NAME} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING PATTERN *.h) + + # This time, install all the exported targets under the + # ${PROJECT_NAME}_Targets name. + install( + EXPORT ${PROJECT_NAME}_Targets + NAMESPACE ${PROJECT_NAME}:: + FILE ${PROJECT_NAME}Targets.cmake + DESTINATION ${${PROJECT_NAME}_INSTALL_CMAKEDIR}) + + # So far we only installed the exported targets, now install the package config files. + # + # If you do not list headers in the PUBLIC_HEADER property, you will need to copy them using + # `install(FILES)` or `install(DIRECTORY)` too. + # + # In that case, you can use CMAKE_INSTALL_INCLUDEDIR as the base destination path. + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + DESTINATION ${${PROJECT_NAME}_INSTALL_CMAKEDIR}) +endif() diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d1ca0b5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM docker.io/fedora:34 +WORKDIR /home/src +RUN mkdir -p opt \ + && dnf -y update \ + && dnf -y install ccache git \ + && git clone https://github.com/scylladb/seastar.git --depth=1 --branch=master /opt/seastar \ + && /opt/seastar/install-dependencies.sh +CMD /bin/bash diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a699987 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +COMPILER = g++ +CFLAGS = -g +MODE = release + +app: /opt/seastar/build/$(MODE)/libseastar.a app.cc + $(COMPILER) app.cc $(shell pkg-config --libs --cflags --static /opt/seastar/build/$(MODE)/seastar.pc) $(CFLAGS) -o app + +/opt/seastar/build/$(MODE)/libseastar.a: + cd /opt/seastar && ./configure.py --mode="$(MODE)" --disable-dpdk --disable-hwloc --cflags="$(CFLAGS)" --compiler="$(COMPILER)" + ninja -C /opt/seastar/build/$(MODE) libseastar.a diff --git a/README.md b/README.md new file mode 100644 index 0000000..432ce63 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# Ready-to-use stub seastar application + +Seastar is an application framework for high-performance server-side applications. +* Website: http://seastar.io/ +* Github: https://github.com/scylladb/seastar.git +* Documentation: http://docs.seastar.io/master/index.html +* Tutorial: http://docs.seastar.io/master/tutorial.html + +Building seastar can be quite involved. This repo attempts to fast-track your way to your first seastar app, by providing a simple hello-world stub application, with simple build instruction that only require docker to work. Note that the setup instructions assume a UNIX-like environment (Linux, MacOS or WSL) but should work on Windows with minimal tweaking. + +## Prerequisites + +`docker` + +## Setup + +``` +$ docker build -t seastar-app-stub . +$ docker run --rm -it -v $(pwd):/home/src seastar-app-stub +``` +The rest of the instructions assume this setup is completed and that you are in the running docker container. + +## Building the app + +``` +$ make app +``` + +Note that the first invocation of this command might take a while as it will also compile seastar. Subsequent builds will be much faster. + +## Running the app + +``` +$ ./app +``` + +Don't be alarmed by warnings like this: +``` +WARN 2022-05-12 12:49:21,493 [shard 0] seastar - Creation of perf_event based stall detector failed, falling back to posix timer: std::system_error (error system:1, perf_event_open() failed: Operation not permitted) +WARN 2022-05-12 12:49:21,493 [shard 0] seastar - Unable to set SCHED_FIFO scheduling policy for timer thread; latency impact possible. Try adding CAP_SYS_NICE +INFO 2022-05-12 12:49:21,493 [shard 0] seastar - Created fair group io-queue-0, capacity rate 2147483:2147483, limit 12582912, rate 16777216 (factor 1), threshold 2000 +INFO 2022-05-12 12:49:21,493 [shard 0] seastar - Created io group dev(0), length limit 4194304:4194304, rate 2147483647:2147483647 +INFO 2022-05-12 12:49:21,493 [shard 0] seastar - Created io queue dev(0) capacities: 512:2000/2000 1024:3000/3000 2048:5000/5000 4096:9000/9000 8192:17000/17000 16384:33000/33000 32768:65000/65000 65536:129000/129000 131072:257000/257000 +WARN 2022-05-12 12:49:21,598 [shard 1] seastar - Creation of perf_event based stall detector failed, falling back to posix timer: std::system_error (error system:1, perf_event_open() failed: Operation not permitted) +``` +If you see the `HELLO WORLD` printed at the bottom, the app is working: +``` +INFO 2022-05-12 12:50:42,330 [shard 0] app.cc - HELLO WORLD +``` + +To see the available seastar options: +``` +$ ./app --help-seastar +``` diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 0000000..e69de29 diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..6d87522 --- /dev/null +++ b/flake.lock @@ -0,0 +1,43 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1701282334, + "narHash": "sha256-MxCVrXY6v4QmfTwIysjjaX0XUhqBbxTWWB4HXtDYsdk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "057f9aecfb71c4437d2b27d3323df7f93c010b7e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "23.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "utils": "utils" + } + }, + "utils": { + "locked": { + "lastModified": 1623875721, + "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..4e3f5cf --- /dev/null +++ b/flake.nix @@ -0,0 +1,61 @@ +{ + description = "HanoiDB"; + + inputs = { + # nixpkgs.url = "github:NixOS/nixpkgs/unstable"; + nixpkgs.url = "github:NixOS/nixpkgs/23.11"; + utils.url = "github:numtide/flake-utils"; + utils.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = { self, nixpkgs, ... }@inputs: inputs.utils.lib.eachSystem [ + "x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" + ] (system: + let pkgs = import nixpkgs { + inherit system; + overlays = []; + + config.allowUnfree = true; + }; + in { + devShell = pkgs.mkShell rec { + + name = "hanoidb"; + + packages = with pkgs; [ + ccache + clang + cmake + cmakeCurses + gdb + lldb + neovim + ninja + pkg-config + ripgrep + valgrind + + # Build time and Run time dependencies + boost + c-ares + gnutls + hwloc + libsystemtap + liburing + lksctp-tools + lz4 + numactl + protobuf + ragel + yaml-cpp + zlib + ]; + + shellHook = let + icon = "f121"; + in '' + export PS1="$(echo -e '\u${icon}') {\[$(tput sgr0)\]\[\033[38;5;228m\]\w\[$(tput sgr0)\]\[\033[38;5;15m\]} (${name}) \\$ \[$(tput sgr0)\]" + ''; + }; + }); +} diff --git a/seastar b/seastar new file mode 160000 index 0000000..a965080 --- /dev/null +++ b/seastar @@ -0,0 +1 @@ +Subproject commit a965080ec0bb895e5c6196d3b082fa8d8f49b512 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..8217e8b --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,3 @@ +add_executable(hanoidb) +target_sources(hanoidb PRIVATE hanoidb.cc) +target_link_libraries(hanoidb PRIVATE Seastar::seastar) diff --git a/src/hanoidb.cc b/src/hanoidb.cc new file mode 100644 index 0000000..c0efc4b --- /dev/null +++ b/src/hanoidb.cc @@ -0,0 +1,23 @@ +#include +#include +#include + +//using namespace seastar; + +seastar::logger lg("hanoidb"); + +static seastar:future<> hello_from_all_cores() { + co_await seastar:smp::invoke_on_all([]() -> seastar::future<> { + lg.info("Hello from every core"); + }); + co_return; +} + +int main(int argc, char** argv) { + seastar::app_template app; + + return app.run(argc, argv, [&] () -> seastar::future { + co_await hello_from_all_cores(); + co_return 0; + }); +}