From 62e92f768a33a75f34a7b96ce6fcebe4f3492e6c Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Mon, 8 Apr 2024 19:41:25 +0300 Subject: [PATCH 01/19] Added the first cut of the db_demo. REST api to insert, update, delete, query key-values. Data is currently held in a map. --- .gitignore | 3 +- .kdev4/seastar.kdev4 | 171 +++ CMakeLists.txt.user | 2545 +++++++++++++++++++++++++++++++++++++ db_simple.pro | 520 ++++++++ db_simple.pro.user | 266 ++++ demos/CMakeLists.txt | 3 + demos/CMakeLists.txt.user | 418 ++++++ demos/db_demo.cc | 251 ++++ demos/http_client_demo.cc | 20 +- demos/tcp_demo.cc | 2 +- rest.cmd | 6 + seastar.kdev4 | 4 + 12 files changed, 4199 insertions(+), 10 deletions(-) create mode 100644 .kdev4/seastar.kdev4 create mode 100644 CMakeLists.txt.user create mode 100644 db_simple.pro create mode 100644 db_simple.pro.user create mode 100644 demos/CMakeLists.txt.user create mode 100755 demos/db_demo.cc create mode 100755 rest.cmd create mode 100644 seastar.kdev4 diff --git a/.gitignore b/.gitignore index 411a9385da2..fa02a0bb934 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ tags .vscode/ compile_commands.json .clangd -.cache \ No newline at end of file +.cache +/build2/ diff --git a/.kdev4/seastar.kdev4 b/.kdev4/seastar.kdev4 new file mode 100644 index 00000000000..b8298aa8a5d --- /dev/null +++ b/.kdev4/seastar.kdev4 @@ -0,0 +1,171 @@ +[Buildset] +BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r) + +[CMake] +Build Directory Count=1 +Current Build Directory Index-Host System=0 + +[CMake][CMake Build Directory 0] +Build Directory Path=/home/DEV/seastar/build2 +Build Type=Debug +CMake Binary=/usr/bin/cmake +CMake Executable=/usr/bin/cmake +Environment Profile= +Extra Arguments= +Install Directory=/usr/local +Runtime=Host System + +[Launch] +Launch Configurations=Launch Configuration 0,Launch Configuration 1,Launch Configuration 2,Launch Configuration 3,Launch Configuration 4,Launch Configuration 5,Launch Configuration 6 + +[Launch][Launch Configuration 0] +Configured Launch Modes=execute +Configured Launchers=nativeAppLauncher +Name=demo_http_client +Type=Native Application + +[Launch][Launch Configuration 0][Data] +Arguments= +Debugger Shell= +Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00 \x00d\x00e\x00m\x00o\x00_\x00h\x00t\x00t\x00p\x00_\x00c\x00l\x00i\x00e\x00n\x00t) +Dependency Action=Build +Display Demangle Names=true +Display Static Members=false +EnvironmentGroup= +Executable=file:///home/DEV/seastar +External Terminal=konsole --noclose --workdir %workdir -e %exe +GDB Path= +Kill Before Executing Again=4194304 +Project Target=seastar,demos,demo_http_client +Remote GDB Config Script= +Remote GDB Run Script= +Remote GDB Shell Script= +Start With=ApplicationOutput +Use External Terminal=false +Working Directory= +isExecutable=false + +[Launch][Launch Configuration 1] +Configured Launch Modes=execute +Configured Launchers=nativeAppLauncher +Name=demo_hello-world +Type=Native Application + +[Launch][Launch Configuration 1][Data] +Arguments= +Debugger Shell= +Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00 \x00d\x00e\x00m\x00o\x00_\x00h\x00e\x00l\x00l\x00o\x00-\x00w\x00o\x00r\x00l\x00d) +Dependency Action=Build +Display Demangle Names=true +Display Static Members=true +EnvironmentGroup= +Executable=file:///home/DEV/seastar +External Terminal=konsole --noclose --workdir %workdir -e %exe +GDB Path= +Kill Before Executing Again=4194304 +Project Target=seastar,demos,demo_hello-world +Remote GDB Config Script= +Remote GDB Run Script= +Remote GDB Shell Script= +Start With=ApplicationOutput +Use External Terminal=false +Working Directory=file:///home/DEV/seastar/build2/temp +isExecutable=false + +[Launch][Launch Configuration 2] +Configured Launch Modes=execute +Configured Launchers=nativeAppLauncher +Name=demo_tcp +Type=Native Application + +[Launch][Launch Configuration 2][Data] +Arguments= +Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00\x10\x00d\x00e\x00m\x00o\x00_\x00t\x00c\x00p) +Dependency Action=Build +EnvironmentGroup= +Executable=file:///home/DEV/seastar +External Terminal=konsole --noclose --workdir %workdir -e %exe +Kill Before Executing Again=4194304 +Project Target=seastar,demos,demo_tcp +Use External Terminal=false +Working Directory= +isExecutable=false + +[Launch][Launch Configuration 3] +Configured Launch Modes=execute +Configured Launchers=nativeAppLauncher +Name=demo_echo +Type=Native Application + +[Launch][Launch Configuration 3][Data] +Arguments= +Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00\x12\x00d\x00e\x00m\x00o\x00_\x00e\x00c\x00h\x00o) +Dependency Action=Build +EnvironmentGroup= +Executable=file:///home/DEV/seastar +External Terminal=konsole --noclose --workdir %workdir -e %exe +Kill Before Executing Again=4194304 +Project Target=seastar,demos,demo_echo +Use External Terminal=false +Working Directory= +isExecutable=false + +[Launch][Launch Configuration 4] +Configured Launch Modes=execute +Configured Launchers=nativeAppLauncher +Name=demo_tls_echo_server +Type=Native Application + +[Launch][Launch Configuration 4][Data] +Arguments= +Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00(\x00d\x00e\x00m\x00o\x00_\x00t\x00l\x00s\x00_\x00e\x00c\x00h\x00o\x00_\x00s\x00e\x00r\x00v\x00e\x00r) +Dependency Action=Build +EnvironmentGroup= +Executable=file:///home/DEV/seastar +External Terminal=konsole --noclose --workdir %workdir -e %exe +Kill Before Executing Again=4194304 +Project Target=seastar,demos,demo_tls_echo_server +Use External Terminal=false +Working Directory= +isExecutable=false + +[Launch][Launch Configuration 5] +Configured Launch Modes=execute +Configured Launchers=nativeAppLauncher +Name=app_httpd +Type=Native Application + +[Launch][Launch Configuration 5][Data] +Arguments= +Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x04\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\x08\x00a\x00p\x00p\x00s\x00\x00\x00\n\x00h\x00t\x00t\x00p\x00d\x00\x00\x00\x12\x00a\x00p\x00p\x00_\x00h\x00t\x00t\x00p\x00d) +Dependency Action=Build +EnvironmentGroup= +Executable=file:///home/DEV/seastar +External Terminal=konsole --noclose --workdir %workdir -e %exe +Kill Before Executing Again=4194304 +Project Target=seastar,apps,httpd,app_httpd +Use External Terminal=false +Working Directory= +isExecutable=false + +[Launch][Launch Configuration 6] +Configured Launch Modes=execute +Configured Launchers=nativeAppLauncher +Name=demo_db +Type=Native Application + +[Launch][Launch Configuration 6][Data] +Arguments= +Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00\x0e\x00d\x00e\x00m\x00o\x00_\x00d\x00b) +Dependency Action=Build +EnvironmentGroup= +Executable=file:///home/DEV/seastar +External Terminal=konsole --noclose --workdir %workdir -e %exe +Kill Before Executing Again=4194304 +Project Target=seastar,demos,demo_db +Use External Terminal=false +Working Directory= +isExecutable=false + +[Project] +VersionControlSupport=kdevgit diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user new file mode 100644 index 00000000000..095cf6367a3 --- /dev/null +++ b/CMakeLists.txt.user @@ -0,0 +1,2545 @@ + + + + + + EnvironmentId + {ca393d1f-e9ed-4bec-aa26-20e86827200b} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + 0 + false + true + false + 2 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + false + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + + 0 + true + + true + true + Builtin.DefaultTidyAndClazy + 4 + true + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Imported Kit + Imported Kit + {53be7c7e-4147-4502-8b20-72627760d018} + 0 + 0 + 11 + + Debug + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + /home/DEV/seastar/build/Imported_Kit_temporary-Debug + + + + + all + + false + + true + Build + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + Build + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + CMakeProjectManager.CMakeBuildConfiguration + + + Release + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=Release +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + /home/DEV/seastar/build/Imported_Kit_temporary-Release + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + CMakeProjectManager.CMakeBuildConfiguration + + + Debug + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + /home/DEV/seastar + /home/DEV/seastar/build2 + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug2 + CMakeProjectManager.CMakeBuildConfiguration + + + Debug + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + /home/DEV/seastar + /home/DEV/seastar/build/debug + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug3 + CMakeProjectManager.CMakeBuildConfiguration + + + RelWithDebInfo + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + /home/DEV/seastar + /home/DEV/seastar/build/release + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release with Debug Information + CMakeProjectManager.CMakeBuildConfiguration + + 5 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_httpd + CMakeProjectManager.CMakeRunConfiguration.app_httpd + app_httpd + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/httpd + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_io_tester + CMakeProjectManager.CMakeRunConfiguration.app_io_tester + app_io_tester + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/io_tester + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_coroutines + CMakeProjectManager.CMakeRunConfiguration.demo_coroutines + demo_coroutines + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_sstring + CMakeProjectManager.CMakeRunConfiguration.test_unit_sstring + test_unit_sstring + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_stall_detector + CMakeProjectManager.CMakeRunConfiguration.test_unit_stall_detector + test_unit_stall_detector + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_stream_reader + CMakeProjectManager.CMakeRunConfiguration.test_unit_stream_reader + test_unit_stream_reader + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_thread + CMakeProjectManager.CMakeRunConfiguration.test_unit_thread + test_unit_thread + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_thread_context_switch + CMakeProjectManager.CMakeRunConfiguration.test_unit_thread_context_switch + test_unit_thread_context_switch + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_timer + CMakeProjectManager.CMakeRunConfiguration.test_unit_timer + test_unit_timer + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_tls + CMakeProjectManager.CMakeRunConfiguration.test_unit_tls + test_unit_tls + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_tuple_utils + CMakeProjectManager.CMakeRunConfiguration.test_unit_tuple_utils + test_unit_tuple_utils + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_uname + CMakeProjectManager.CMakeRunConfiguration.test_unit_uname + test_unit_uname + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_unix_domain + CMakeProjectManager.CMakeRunConfiguration.test_unit_unix_domain + test_unit_unix_domain + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_db + CMakeProjectManager.CMakeRunConfiguration.demo_db + demo_db + true + -c4 + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_unwind + CMakeProjectManager.CMakeRunConfiguration.test_unit_unwind + test_unit_unwind + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_weak_ptr + CMakeProjectManager.CMakeRunConfiguration.test_unit_weak_ptr + test_unit_weak_ptr + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_websocket + CMakeProjectManager.CMakeRunConfiguration.test_unit_websocket + test_unit_websocket + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_echo + CMakeProjectManager.CMakeRunConfiguration.demo_echo + demo_echo + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_file + CMakeProjectManager.CMakeRunConfiguration.demo_file + demo_file + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_hello-world + CMakeProjectManager.CMakeRunConfiguration.demo_hello-world + demo_hello-world + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_http_client + CMakeProjectManager.CMakeRunConfiguration.demo_http_client + demo_http_client + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_ip + CMakeProjectManager.CMakeRunConfiguration.demo_ip + demo_ip + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_l3 + CMakeProjectManager.CMakeRunConfiguration.demo_l3 + demo_l3 + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_line_count + CMakeProjectManager.CMakeRunConfiguration.demo_line_count + demo_line_count + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_rpc + CMakeProjectManager.CMakeRunConfiguration.demo_rpc + demo_rpc + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_ioinfo + CMakeProjectManager.CMakeRunConfiguration.app_ioinfo + app_ioinfo + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/io_tester + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_scheduling_group + CMakeProjectManager.CMakeRunConfiguration.demo_scheduling_group + demo_scheduling_group + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_sharded_parameter + CMakeProjectManager.CMakeRunConfiguration.demo_sharded_parameter + demo_sharded_parameter + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tcp + CMakeProjectManager.CMakeRunConfiguration.demo_tcp + demo_tcp + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tcp_sctp_client + CMakeProjectManager.CMakeRunConfiguration.demo_tcp_sctp_client + demo_tcp_sctp_client + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tcp_sctp_server + CMakeProjectManager.CMakeRunConfiguration.demo_tcp_sctp_server + demo_tcp_sctp_server + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tls_echo_server + CMakeProjectManager.CMakeRunConfiguration.demo_tls_echo_server + demo_tls_echo_server + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tls_simple_client + CMakeProjectManager.CMakeRunConfiguration.demo_tls_simple_client + demo_tls_simple_client + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tutorial_examples + CMakeProjectManager.CMakeRunConfiguration.demo_tutorial_examples + demo_tutorial_examples + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_udp_client + CMakeProjectManager.CMakeRunConfiguration.demo_udp_client + demo_udp_client + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_udp_server + CMakeProjectManager.CMakeRunConfiguration.demo_udp_server + demo_udp_server + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_iotune + CMakeProjectManager.CMakeRunConfiguration.app_iotune + app_iotune + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/iotune + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_udp_zero_copy + CMakeProjectManager.CMakeRunConfiguration.demo_udp_zero_copy + demo_udp_zero_copy + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_websocket + CMakeProjectManager.CMakeRunConfiguration.demo_websocket + demo_websocket + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_allocator + CMakeProjectManager.CMakeRunConfiguration.test_perf_allocator + test_perf_allocator + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_coroutine + CMakeProjectManager.CMakeRunConfiguration.test_perf_coroutine + test_perf_coroutine + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_fair_queue + CMakeProjectManager.CMakeRunConfiguration.test_perf_fair_queue + test_perf_fair_queue + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_fstream + CMakeProjectManager.CMakeRunConfiguration.test_perf_fstream + test_perf_fstream + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_future_util + CMakeProjectManager.CMakeRunConfiguration.test_perf_future_util + test_perf_future_util + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_rpc + CMakeProjectManager.CMakeRunConfiguration.test_perf_rpc + test_perf_rpc + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_shared_token_bucket + CMakeProjectManager.CMakeRunConfiguration.test_perf_shared_token_bucket + test_perf_shared_token_bucket + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_smp_submit_to + CMakeProjectManager.CMakeRunConfiguration.test_perf_smp_submit_to + test_perf_smp_submit_to + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_memcached + CMakeProjectManager.CMakeRunConfiguration.app_memcached + app_memcached + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/memcached + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_abort_source + CMakeProjectManager.CMakeRunConfiguration.test_unit_abort_source + test_unit_abort_source + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_abortable_fifo + CMakeProjectManager.CMakeRunConfiguration.test_unit_abortable_fifo + test_unit_abortable_fifo + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_alien + CMakeProjectManager.CMakeRunConfiguration.test_unit_alien + test_unit_alien + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_alloc + CMakeProjectManager.CMakeRunConfiguration.test_unit_alloc + test_unit_alloc + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_allocator + CMakeProjectManager.CMakeRunConfiguration.test_unit_allocator + test_unit_allocator + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_app-template + CMakeProjectManager.CMakeRunConfiguration.test_unit_app-template + test_unit_app-template + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_checked_ptr + CMakeProjectManager.CMakeRunConfiguration.test_unit_checked_ptr + test_unit_checked_ptr + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_chunk_parsers + CMakeProjectManager.CMakeRunConfiguration.test_unit_chunk_parsers + test_unit_chunk_parsers + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_chunked_fifo + CMakeProjectManager.CMakeRunConfiguration.test_unit_chunked_fifo + test_unit_chunked_fifo + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_circular_buffer + CMakeProjectManager.CMakeRunConfiguration.test_unit_circular_buffer + test_unit_circular_buffer + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_memcached_test_ascii + CMakeProjectManager.CMakeRunConfiguration.app_memcached_test_ascii + app_memcached_test_ascii + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/memcached/tests + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_circular_buffer_fixed_capacity + CMakeProjectManager.CMakeRunConfiguration.test_unit_circular_buffer_fixed_capacity + test_unit_circular_buffer_fixed_capacity + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_closeable + CMakeProjectManager.CMakeRunConfiguration.test_unit_closeable + test_unit_closeable + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_condition_variable + CMakeProjectManager.CMakeRunConfiguration.test_unit_condition_variable + test_unit_condition_variable + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_connect + CMakeProjectManager.CMakeRunConfiguration.test_unit_connect + test_unit_connect + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_content_source + CMakeProjectManager.CMakeRunConfiguration.test_unit_content_source + test_unit_content_source + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_coroutines + CMakeProjectManager.CMakeRunConfiguration.test_unit_coroutines + test_unit_coroutines + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_defer + CMakeProjectManager.CMakeRunConfiguration.test_unit_defer + test_unit_defer + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_deleter + CMakeProjectManager.CMakeRunConfiguration.test_unit_deleter + test_unit_deleter + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_directory + CMakeProjectManager.CMakeRunConfiguration.test_unit_directory + test_unit_directory + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_distributed + CMakeProjectManager.CMakeRunConfiguration.test_unit_distributed + test_unit_distributed + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_metrics_tester + CMakeProjectManager.CMakeRunConfiguration.app_metrics_tester + app_metrics_tester + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/metrics_tester + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_dns + CMakeProjectManager.CMakeRunConfiguration.test_unit_dns + test_unit_dns + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_exception_logging + CMakeProjectManager.CMakeRunConfiguration.test_unit_exception_logging + test_unit_exception_logging + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_execution_stage + CMakeProjectManager.CMakeRunConfiguration.test_unit_execution_stage + test_unit_execution_stage + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_expiring_fifo + CMakeProjectManager.CMakeRunConfiguration.test_unit_expiring_fifo + test_unit_expiring_fifo + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_fair_queue + CMakeProjectManager.CMakeRunConfiguration.test_unit_fair_queue + test_unit_fair_queue + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_file_io + CMakeProjectManager.CMakeRunConfiguration.test_unit_file_io + test_unit_file_io + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_file_utils + CMakeProjectManager.CMakeRunConfiguration.test_unit_file_utils + test_unit_file_utils + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_foreign_ptr + CMakeProjectManager.CMakeRunConfiguration.test_unit_foreign_ptr + test_unit_foreign_ptr + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_fsnotifier + CMakeProjectManager.CMakeRunConfiguration.test_unit_fsnotifier + test_unit_fsnotifier + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_fstream + CMakeProjectManager.CMakeRunConfiguration.test_unit_fstream + test_unit_fstream + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_rpc_tester + CMakeProjectManager.CMakeRunConfiguration.app_rpc_tester + app_rpc_tester + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/rpc_tester + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_futures + CMakeProjectManager.CMakeRunConfiguration.test_unit_futures + test_unit_futures + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_httpd + CMakeProjectManager.CMakeRunConfiguration.test_unit_httpd + test_unit_httpd + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_io_queue + CMakeProjectManager.CMakeRunConfiguration.test_unit_io_queue + test_unit_io_queue + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_ipv6 + CMakeProjectManager.CMakeRunConfiguration.test_unit_ipv6 + test_unit_ipv6 + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_json_formatter + CMakeProjectManager.CMakeRunConfiguration.test_unit_json_formatter + test_unit_json_formatter + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_locking + CMakeProjectManager.CMakeRunConfiguration.test_unit_locking + test_unit_locking + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_log_buf + CMakeProjectManager.CMakeRunConfiguration.test_unit_log_buf + test_unit_log_buf + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_lowres_clock + CMakeProjectManager.CMakeRunConfiguration.test_unit_lowres_clock + test_unit_lowres_clock + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_metrics + CMakeProjectManager.CMakeRunConfiguration.test_unit_metrics + test_unit_metrics + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_net_config + CMakeProjectManager.CMakeRunConfiguration.test_unit_net_config + test_unit_net_config + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_seawreck + CMakeProjectManager.CMakeRunConfiguration.app_seawreck + app_seawreck + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/seawreck + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_network_interface + CMakeProjectManager.CMakeRunConfiguration.test_unit_network_interface + test_unit_network_interface + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_noncopyable_function + CMakeProjectManager.CMakeRunConfiguration.test_unit_noncopyable_function + test_unit_noncopyable_function + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_output_stream + CMakeProjectManager.CMakeRunConfiguration.test_unit_output_stream + test_unit_output_stream + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_packet + CMakeProjectManager.CMakeRunConfiguration.test_unit_packet + test_unit_packet + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_pipe + CMakeProjectManager.CMakeRunConfiguration.test_unit_pipe + test_unit_pipe + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_program_options + CMakeProjectManager.CMakeRunConfiguration.test_unit_program_options + test_unit_program_options + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_queue + CMakeProjectManager.CMakeRunConfiguration.test_unit_queue + test_unit_queue + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_request_parser + CMakeProjectManager.CMakeRunConfiguration.test_unit_request_parser + test_unit_request_parser + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_rpc + CMakeProjectManager.CMakeRunConfiguration.test_unit_rpc + test_unit_rpc + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_scheduling_group + CMakeProjectManager.CMakeRunConfiguration.test_unit_scheduling_group + test_unit_scheduling_group + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_block_discard + CMakeProjectManager.CMakeRunConfiguration.demo_block_discard + demo_block_discard + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_semaphore + CMakeProjectManager.CMakeRunConfiguration.test_unit_semaphore + test_unit_semaphore + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_sharded + CMakeProjectManager.CMakeRunConfiguration.test_unit_sharded + test_unit_sharded + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_shared_ptr + CMakeProjectManager.CMakeRunConfiguration.test_unit_shared_ptr + test_unit_shared_ptr + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_shared_token_bucket + CMakeProjectManager.CMakeRunConfiguration.test_unit_shared_token_bucket + test_unit_shared_token_bucket + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_signal + CMakeProjectManager.CMakeRunConfiguration.test_unit_signal + test_unit_signal + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_simple_stream + CMakeProjectManager.CMakeRunConfiguration.test_unit_simple_stream + test_unit_simple_stream + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_smp + CMakeProjectManager.CMakeRunConfiguration.test_unit_smp + test_unit_smp + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_socket + CMakeProjectManager.CMakeRunConfiguration.test_unit_socket + test_unit_socket + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_source_location + CMakeProjectManager.CMakeRunConfiguration.test_unit_source_location + test_unit_source_location + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_spawn + CMakeProjectManager.CMakeRunConfiguration.test_unit_spawn + test_unit_spawn + false + true + true + true + /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit + + 113 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/db_simple.pro b/db_simple.pro new file mode 100644 index 00000000000..dba09dada30 --- /dev/null +++ b/db_simple.pro @@ -0,0 +1,520 @@ +# Created by and for Qt Creator This file was created for editing the project sources only. +# You may attempt to use it for building too, by modifying this file here. + +#TARGET = db_simple + +QT = core gui widgets + +HEADERS = \ + $$PWD/apps/lib/stop_signal.hh \ + $$PWD/apps/memcached/memcached.hh \ + $$PWD/build/debug/apps/httpd/demo.json.hh \ + $$PWD/build/debug/apps/memcached/ascii.hh \ + $$PWD/build/debug/gen/include/seastar/http/chunk_parsers.hh \ + $$PWD/build/debug/gen/include/seastar/http/request_parser.hh \ + $$PWD/build/debug/gen/include/seastar/http/response_parser.hh \ + $$PWD/build/debug/gen/src/proto/metrics2.pb.h \ + $$PWD/build/release/apps/httpd/demo.json.hh \ + $$PWD/build/release/apps/memcached/ascii.hh \ + $$PWD/build/release/gen/include/seastar/http/chunk_parsers.hh \ + $$PWD/build/release/gen/include/seastar/http/request_parser.hh \ + $$PWD/build/release/gen/include/seastar/http/response_parser.hh \ + $$PWD/build/release/gen/src/proto/metrics2.pb.h \ + $$PWD/build2/apps/httpd/demo.json.hh \ + $$PWD/build2/apps/memcached/ascii.hh \ + $$PWD/build2/gen/include/seastar/http/chunk_parsers.hh \ + $$PWD/build2/gen/include/seastar/http/request_parser.hh \ + $$PWD/build2/gen/include/seastar/http/response_parser.hh \ + $$PWD/build2/gen/src/proto/metrics2.pb.h \ + $$PWD/demos/tls_echo_server.hh \ + $$PWD/include/seastar/core/internal/api-level.hh \ + $$PWD/include/seastar/core/internal/buffer_allocator.hh \ + $$PWD/include/seastar/core/internal/estimated_histogram.hh \ + $$PWD/include/seastar/core/internal/io_desc.hh \ + $$PWD/include/seastar/core/internal/io_intent.hh \ + $$PWD/include/seastar/core/internal/io_request.hh \ + $$PWD/include/seastar/core/internal/io_sink.hh \ + $$PWD/include/seastar/core/internal/poll.hh \ + $$PWD/include/seastar/core/internal/pollable_fd.hh \ + $$PWD/include/seastar/core/internal/read_state.hh \ + $$PWD/include/seastar/core/internal/run_in_background.hh \ + $$PWD/include/seastar/core/internal/stall_detector.hh \ + $$PWD/include/seastar/core/internal/uname.hh \ + $$PWD/include/seastar/core/abort_on_ebadf.hh \ + $$PWD/include/seastar/core/abort_on_expiry.hh \ + $$PWD/include/seastar/core/abort_source.hh \ + $$PWD/include/seastar/core/abortable_fifo.hh \ + $$PWD/include/seastar/core/alien.hh \ + $$PWD/include/seastar/core/align.hh \ + $$PWD/include/seastar/core/aligned_buffer.hh \ + $$PWD/include/seastar/core/app-template.hh \ + $$PWD/include/seastar/core/array_map.hh \ + $$PWD/include/seastar/core/bitops.hh \ + $$PWD/include/seastar/core/bitset-iter.hh \ + $$PWD/include/seastar/core/byteorder.hh \ + $$PWD/include/seastar/core/cacheline.hh \ + $$PWD/include/seastar/core/checked_ptr.hh \ + $$PWD/include/seastar/core/chunked_fifo.hh \ + $$PWD/include/seastar/core/circular_buffer.hh \ + $$PWD/include/seastar/core/circular_buffer_fixed_capacity.hh \ + $$PWD/include/seastar/core/condition-variable.hh \ + $$PWD/include/seastar/core/coroutine.hh \ + $$PWD/include/seastar/core/deleter.hh \ + $$PWD/include/seastar/core/distributed.hh \ + $$PWD/include/seastar/core/do_with.hh \ + $$PWD/include/seastar/core/dpdk_rte.hh \ + $$PWD/include/seastar/core/enum.hh \ + $$PWD/include/seastar/core/exception_hacks.hh \ + $$PWD/include/seastar/core/execution_stage.hh \ + $$PWD/include/seastar/core/expiring_fifo.hh \ + $$PWD/include/seastar/core/fair_queue.hh \ + $$PWD/include/seastar/core/file-types.hh \ + $$PWD/include/seastar/core/file.hh \ + $$PWD/include/seastar/core/fsnotify.hh \ + $$PWD/include/seastar/core/fsqual.hh \ + $$PWD/include/seastar/core/fstream.hh \ + $$PWD/include/seastar/core/function_traits.hh \ + $$PWD/include/seastar/core/future-util.hh \ + $$PWD/include/seastar/core/future.hh \ + $$PWD/include/seastar/core/gate.hh \ + $$PWD/include/seastar/core/idle_cpu_handler.hh \ + $$PWD/include/seastar/core/io_intent.hh \ + $$PWD/include/seastar/core/io_priority_class.hh \ + $$PWD/include/seastar/core/io_queue.hh \ + $$PWD/include/seastar/core/iostream-impl.hh \ + $$PWD/include/seastar/core/iostream.hh \ + $$PWD/include/seastar/core/layered_file.hh \ + $$PWD/include/seastar/core/linux-aio.hh \ + $$PWD/include/seastar/core/loop.hh \ + $$PWD/include/seastar/core/lowres_clock.hh \ + $$PWD/include/seastar/core/make_task.hh \ + $$PWD/include/seastar/core/manual_clock.hh \ + $$PWD/include/seastar/core/map_reduce.hh \ + $$PWD/include/seastar/core/memory.hh \ + $$PWD/include/seastar/core/metrics.hh \ + $$PWD/include/seastar/core/metrics_api.hh \ + $$PWD/include/seastar/core/metrics_registration.hh \ + $$PWD/include/seastar/core/metrics_types.hh \ + $$PWD/include/seastar/core/on_internal_error.hh \ + $$PWD/include/seastar/core/pipe.hh \ + $$PWD/include/seastar/core/polymorphic_temporary_buffer.hh \ + $$PWD/include/seastar/core/posix.hh \ + $$PWD/include/seastar/core/preempt.hh \ + $$PWD/include/seastar/core/prefetch.hh \ + $$PWD/include/seastar/core/print.hh \ + $$PWD/include/seastar/core/prometheus.hh \ + $$PWD/include/seastar/core/queue.hh \ + $$PWD/include/seastar/core/ragel.hh \ + $$PWD/include/seastar/core/reactor.hh \ + $$PWD/include/seastar/core/reactor_config.hh \ + $$PWD/include/seastar/core/relabel_config.hh \ + $$PWD/include/seastar/core/report_exception.hh \ + $$PWD/include/seastar/core/resource.hh \ + $$PWD/include/seastar/core/rwlock.hh \ + $$PWD/include/seastar/core/scattered_message.hh \ + $$PWD/include/seastar/core/scheduling.hh \ + $$PWD/include/seastar/core/scheduling_specific.hh \ + $$PWD/include/seastar/core/scollectd.hh \ + $$PWD/include/seastar/core/scollectd_api.hh \ + $$PWD/include/seastar/core/seastar.hh \ + $$PWD/include/seastar/core/semaphore.hh \ + $$PWD/include/seastar/core/shard_id.hh \ + $$PWD/include/seastar/core/sharded.hh \ + $$PWD/include/seastar/core/shared_future.hh \ + $$PWD/include/seastar/core/shared_mutex.hh \ + $$PWD/include/seastar/core/shared_ptr.hh \ + $$PWD/include/seastar/core/shared_ptr_debug_helper.hh \ + $$PWD/include/seastar/core/shared_ptr_incomplete.hh \ + $$PWD/include/seastar/core/simple-stream.hh \ + $$PWD/include/seastar/core/slab.hh \ + $$PWD/include/seastar/core/sleep.hh \ + $$PWD/include/seastar/core/smp.hh \ + $$PWD/include/seastar/core/smp_options.hh \ + $$PWD/include/seastar/core/sstring.hh \ + $$PWD/include/seastar/core/stall_sampler.hh \ + $$PWD/include/seastar/core/stream.hh \ + $$PWD/include/seastar/core/systemwide_memory_barrier.hh \ + $$PWD/include/seastar/core/task.hh \ + $$PWD/include/seastar/core/temporary_buffer.hh \ + $$PWD/include/seastar/core/thread.hh \ + $$PWD/include/seastar/core/thread_cputime_clock.hh \ + $$PWD/include/seastar/core/thread_impl.hh \ + $$PWD/include/seastar/core/timed_out_error.hh \ + $$PWD/include/seastar/core/timer-set.hh \ + $$PWD/include/seastar/core/timer.hh \ + $$PWD/include/seastar/core/transfer.hh \ + $$PWD/include/seastar/core/unaligned.hh \ + $$PWD/include/seastar/core/units.hh \ + $$PWD/include/seastar/core/vector-data-sink.hh \ + $$PWD/include/seastar/core/weak_ptr.hh \ + $$PWD/include/seastar/core/when_all.hh \ + $$PWD/include/seastar/core/when_any.hh \ + $$PWD/include/seastar/core/with_scheduling_group.hh \ + $$PWD/include/seastar/core/with_timeout.hh \ + $$PWD/include/seastar/coroutine/all.hh \ + $$PWD/include/seastar/coroutine/as_future.hh \ + $$PWD/include/seastar/coroutine/exception.hh \ + $$PWD/include/seastar/coroutine/generator.hh \ + $$PWD/include/seastar/coroutine/maybe_yield.hh \ + $$PWD/include/seastar/coroutine/parallel_for_each.hh \ + $$PWD/include/seastar/coroutine/switch_to.hh \ + $$PWD/include/seastar/http/internal/content_source.hh \ + $$PWD/include/seastar/http/api_docs.hh \ + $$PWD/include/seastar/http/client.hh \ + $$PWD/include/seastar/http/common.hh \ + $$PWD/include/seastar/http/exception.hh \ + $$PWD/include/seastar/http/file_handler.hh \ + $$PWD/include/seastar/http/function_handlers.hh \ + $$PWD/include/seastar/http/handlers.hh \ + $$PWD/include/seastar/http/httpd.hh \ + $$PWD/include/seastar/http/json_path.hh \ + $$PWD/include/seastar/http/matcher.hh \ + $$PWD/include/seastar/http/matchrules.hh \ + $$PWD/include/seastar/http/mime_types.hh \ + $$PWD/include/seastar/http/reply.hh \ + $$PWD/include/seastar/http/request.hh \ + $$PWD/include/seastar/http/routes.hh \ + $$PWD/include/seastar/http/short_streams.hh \ + $$PWD/include/seastar/http/transformers.hh \ + $$PWD/include/seastar/http/url.hh \ + $$PWD/include/seastar/json/formatter.hh \ + $$PWD/include/seastar/json/json_elements.hh \ + $$PWD/include/seastar/net/api.hh \ + $$PWD/include/seastar/net/arp.hh \ + $$PWD/include/seastar/net/byteorder.hh \ + $$PWD/include/seastar/net/config.hh \ + $$PWD/include/seastar/net/const.hh \ + $$PWD/include/seastar/net/dhcp.hh \ + $$PWD/include/seastar/net/dns.hh \ + $$PWD/include/seastar/net/dpdk.hh \ + $$PWD/include/seastar/net/ethernet.hh \ + $$PWD/include/seastar/net/inet_address.hh \ + $$PWD/include/seastar/net/ip.hh \ + $$PWD/include/seastar/net/ip_checksum.hh \ + $$PWD/include/seastar/net/ipv4_address.hh \ + $$PWD/include/seastar/net/ipv6_address.hh \ + $$PWD/include/seastar/net/native-stack.hh \ + $$PWD/include/seastar/net/net.hh \ + $$PWD/include/seastar/net/packet-data-source.hh \ + $$PWD/include/seastar/net/packet-util.hh \ + $$PWD/include/seastar/net/packet.hh \ + $$PWD/include/seastar/net/posix-stack.hh \ + $$PWD/include/seastar/net/proxy.hh \ + $$PWD/include/seastar/net/socket_defs.hh \ + $$PWD/include/seastar/net/stack.hh \ + $$PWD/include/seastar/net/tcp-stack.hh \ + $$PWD/include/seastar/net/tcp.hh \ + $$PWD/include/seastar/net/tls.hh \ + $$PWD/include/seastar/net/toeplitz.hh \ + $$PWD/include/seastar/net/udp.hh \ + $$PWD/include/seastar/net/unix_address.hh \ + $$PWD/include/seastar/net/virtio-interface.hh \ + $$PWD/include/seastar/net/virtio.hh \ + $$PWD/include/seastar/rpc/lz4_compressor.hh \ + $$PWD/include/seastar/rpc/lz4_fragmented_compressor.hh \ + $$PWD/include/seastar/rpc/multi_algo_compressor_factory.hh \ + $$PWD/include/seastar/rpc/rpc.hh \ + $$PWD/include/seastar/rpc/rpc_impl.hh \ + $$PWD/include/seastar/rpc/rpc_types.hh \ + $$PWD/include/seastar/testing/entry_point.hh \ + $$PWD/include/seastar/testing/exchanger.hh \ + $$PWD/include/seastar/testing/linux_perf_event.hh \ + $$PWD/include/seastar/testing/on_internal_error.hh \ + $$PWD/include/seastar/testing/perf_tests.hh \ + $$PWD/include/seastar/testing/random.hh \ + $$PWD/include/seastar/testing/seastar_test.hh \ + $$PWD/include/seastar/testing/test_case.hh \ + $$PWD/include/seastar/testing/test_runner.hh \ + $$PWD/include/seastar/testing/thread_test_case.hh \ + $$PWD/include/seastar/util/internal/iovec_utils.hh \ + $$PWD/include/seastar/util/internal/magic.hh \ + $$PWD/include/seastar/util/alloc_failure_injector.hh \ + $$PWD/include/seastar/util/backtrace.hh \ + $$PWD/include/seastar/util/bool_class.hh \ + $$PWD/include/seastar/util/closeable.hh \ + $$PWD/include/seastar/util/concepts.hh \ + $$PWD/include/seastar/util/conversions.hh \ + $$PWD/include/seastar/util/critical_alloc_section.hh \ + $$PWD/include/seastar/util/defer.hh \ + $$PWD/include/seastar/util/eclipse.hh \ + $$PWD/include/seastar/util/exceptions.hh \ + $$PWD/include/seastar/util/file.hh \ + $$PWD/include/seastar/util/function_input_iterator.hh \ + $$PWD/include/seastar/util/indirect.hh \ + $$PWD/include/seastar/util/is_smart_ptr.hh \ + $$PWD/include/seastar/util/later.hh \ + $$PWD/include/seastar/util/lazy.hh \ + $$PWD/include/seastar/util/log-cli.hh \ + $$PWD/include/seastar/util/log-impl.hh \ + $$PWD/include/seastar/util/log.hh \ + $$PWD/include/seastar/util/memory_diagnostics.hh \ + $$PWD/include/seastar/util/modules.hh \ + $$PWD/include/seastar/util/noncopyable_function.hh \ + $$PWD/include/seastar/util/optimized_optional.hh \ + $$PWD/include/seastar/util/print_safe.hh \ + $$PWD/include/seastar/util/process.hh \ + $$PWD/include/seastar/util/program-options.hh \ + $$PWD/include/seastar/util/read_first_line.hh \ + $$PWD/include/seastar/util/reference_wrapper.hh \ + $$PWD/include/seastar/util/sampler.hh \ + $$PWD/include/seastar/util/shared_token_bucket.hh \ + $$PWD/include/seastar/util/short_streams.hh \ + $$PWD/include/seastar/util/source_location-compat.hh \ + $$PWD/include/seastar/util/spinlock.hh \ + $$PWD/include/seastar/util/std-compat.hh \ + $$PWD/include/seastar/util/string_utils.hh \ + $$PWD/include/seastar/util/tmp_file.hh \ + $$PWD/include/seastar/util/transform_iterator.hh \ + $$PWD/include/seastar/util/tuple_utils.hh \ + $$PWD/include/seastar/util/used_size.hh \ + $$PWD/include/seastar/util/variant_utils.hh \ + $$PWD/include/seastar/websocket/server.hh \ + $$PWD/src/core/cgroup.hh \ + $$PWD/src/core/file-impl.hh \ + $$PWD/src/core/prefault.hh \ + $$PWD/src/core/program_options.hh \ + $$PWD/src/core/reactor_backend.hh \ + $$PWD/src/core/scollectd-impl.hh \ + $$PWD/src/core/syscall_result.hh \ + $$PWD/src/core/syscall_work_queue.hh \ + $$PWD/src/core/thread_pool.hh \ + $$PWD/src/core/vla.hh \ + $$PWD/src/net/native-stack-impl.hh \ + $$PWD/tests/unit/loopback_socket.hh \ + $$PWD/tests/unit/mock_file.hh \ + $$PWD/tests/unit/tl-generator.hh \ + $$PWD/tests/unit/tmpdir.hh + +SOURCES = \ + $$PWD/apps/httpd/main.cc \ + $$PWD/apps/io_tester/io_tester.cc \ + $$PWD/apps/io_tester/ioinfo.cc \ + $$PWD/apps/iotune/iotune.cc \ + $$PWD/apps/memcached/tests/test_ascii_parser.cc \ + $$PWD/apps/memcached/memcache.cc \ + $$PWD/apps/metrics_tester/metrics_tester.cc \ + $$PWD/apps/rpc_tester/rpc_tester.cc \ + $$PWD/apps/seawreck/seawreck.cc \ + $$PWD/build/debug/apps/httpd/demo.json.cc \ + $$PWD/build/debug/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp \ + $$PWD/build/debug/CMakeFiles/CheckFunctionExists/CheckFunctionExists.cxx \ + $$PWD/build/debug/gen/src/proto/metrics2.pb.cc \ + $$PWD/build/release/apps/httpd/demo.json.cc \ + $$PWD/build/release/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp \ + $$PWD/build/release/CMakeFiles/CheckFunctionExists/CheckFunctionExists.cxx \ + $$PWD/build/release/gen/src/proto/metrics2.pb.cc \ + $$PWD/build2/apps/httpd/demo.json.cc \ + $$PWD/build2/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp \ + $$PWD/build2/CMakeFiles/CheckFunctionExists/CheckFunctionExists.cxx \ + $$PWD/build2/gen/src/proto/metrics2.pb.cc \ + $$PWD/cmake/code_tests/LinuxMembarrier_test.cc \ + $$PWD/cmake/code_tests/rt_test.cc \ + $$PWD/cmake/code_tests/Sanitizers_fiber_test.cc \ + $$PWD/cmake/code_tests/Source_location_default_argument.cc \ + $$PWD/cmake/code_tests/Source_location_test.cc \ + $$PWD/cmake/code_tests/stdout_test.cc \ + $$PWD/demos/block_discard_demo.cc \ + $$PWD/demos/coroutines_demo.cc \ + $$PWD/demos/db_demo.cc \ + $$PWD/demos/echo_demo.cc \ + $$PWD/demos/file_demo.cc \ + $$PWD/demos/hello-cxx-module.cc \ + $$PWD/demos/hello-world.cc \ + $$PWD/demos/http_client_demo.cc \ + $$PWD/demos/ip_demo.cc \ + $$PWD/demos/l3_demo.cc \ + $$PWD/demos/line_count_demo.cc \ + $$PWD/demos/rpc_demo.cc \ + $$PWD/demos/scheduling_group_demo.cc \ + $$PWD/demos/sharded_parameter_demo.cc \ + $$PWD/demos/tcp_demo.cc \ + $$PWD/demos/tcp_sctp_client_demo.cc \ + $$PWD/demos/tcp_sctp_server_demo.cc \ + $$PWD/demos/tls_echo_server_demo.cc \ + $$PWD/demos/tls_simple_client_demo.cc \ + $$PWD/demos/tutorial_examples.cc \ + $$PWD/demos/udp_client_demo.cc \ + $$PWD/demos/udp_server_demo.cc \ + $$PWD/demos/udp_zero_copy_demo.cc \ + $$PWD/demos/websocket_demo.cc \ + $$PWD/src/core/alien.cc \ + $$PWD/src/core/app-template.cc \ + $$PWD/src/core/condition-variable.cc \ + $$PWD/src/core/dpdk_rte.cc \ + $$PWD/src/core/exception_hacks.cc \ + $$PWD/src/core/execution_stage.cc \ + $$PWD/src/core/fair_queue.cc \ + $$PWD/src/core/file.cc \ + $$PWD/src/core/fsnotify.cc \ + $$PWD/src/core/fsqual.cc \ + $$PWD/src/core/fstream.cc \ + $$PWD/src/core/future-util.cc \ + $$PWD/src/core/future.cc \ + $$PWD/src/core/io_queue.cc \ + $$PWD/src/core/linux-aio.cc \ + $$PWD/src/core/memory.cc \ + $$PWD/src/core/metrics.cc \ + $$PWD/src/core/on_internal_error.cc \ + $$PWD/src/core/posix.cc \ + $$PWD/src/core/program_options.cc \ + $$PWD/src/core/prometheus.cc \ + $$PWD/src/core/reactor.cc \ + $$PWD/src/core/reactor_backend.cc \ + $$PWD/src/core/resource.cc \ + $$PWD/src/core/scollectd.cc \ + $$PWD/src/core/semaphore.cc \ + $$PWD/src/core/sharded.cc \ + $$PWD/src/core/smp.cc \ + $$PWD/src/core/sstring.cc \ + $$PWD/src/core/systemwide_memory_barrier.cc \ + $$PWD/src/core/thread.cc \ + $$PWD/src/core/thread_pool.cc \ + $$PWD/src/core/uname.cc \ + $$PWD/src/http/api_docs.cc \ + $$PWD/src/http/client.cc \ + $$PWD/src/http/common.cc \ + $$PWD/src/http/file_handler.cc \ + $$PWD/src/http/httpd.cc \ + $$PWD/src/http/json_path.cc \ + $$PWD/src/http/matcher.cc \ + $$PWD/src/http/mime_types.cc \ + $$PWD/src/http/reply.cc \ + $$PWD/src/http/request.cc \ + $$PWD/src/http/routes.cc \ + $$PWD/src/http/transformers.cc \ + $$PWD/src/http/url.cc \ + $$PWD/src/json/formatter.cc \ + $$PWD/src/json/json_elements.cc \ + $$PWD/src/net/arp.cc \ + $$PWD/src/net/config.cc \ + $$PWD/src/net/dhcp.cc \ + $$PWD/src/net/dns.cc \ + $$PWD/src/net/dpdk.cc \ + $$PWD/src/net/ethernet.cc \ + $$PWD/src/net/inet_address.cc \ + $$PWD/src/net/ip.cc \ + $$PWD/src/net/ip_checksum.cc \ + $$PWD/src/net/native-stack.cc \ + $$PWD/src/net/net.cc \ + $$PWD/src/net/packet.cc \ + $$PWD/src/net/posix-stack.cc \ + $$PWD/src/net/proxy.cc \ + $$PWD/src/net/socket_address.cc \ + $$PWD/src/net/stack.cc \ + $$PWD/src/net/tcp.cc \ + $$PWD/src/net/tls.cc \ + $$PWD/src/net/udp.cc \ + $$PWD/src/net/unix_address.cc \ + $$PWD/src/net/virtio.cc \ + $$PWD/src/rpc/lz4_compressor.cc \ + $$PWD/src/rpc/lz4_fragmented_compressor.cc \ + $$PWD/src/rpc/rpc.cc \ + $$PWD/src/testing/entry_point.cc \ + $$PWD/src/testing/random.cc \ + $$PWD/src/testing/seastar_test.cc \ + $$PWD/src/testing/test_runner.cc \ + $$PWD/src/util/alloc_failure_injector.cc \ + $$PWD/src/util/backtrace.cc \ + $$PWD/src/util/conversions.cc \ + $$PWD/src/util/exceptions.cc \ + $$PWD/src/util/file.cc \ + $$PWD/src/util/log.cc \ + $$PWD/src/util/process.cc \ + $$PWD/src/util/program-options.cc \ + $$PWD/src/util/read_first_line.cc \ + $$PWD/src/util/short_streams.cc \ + $$PWD/src/util/tmp_file.cc \ + $$PWD/src/websocket/server.cc \ + $$PWD/src/seastar.cc \ + $$PWD/tests/perf/allocator_perf.cc \ + $$PWD/tests/perf/coroutine_perf.cc \ + $$PWD/tests/perf/fair_queue_perf.cc \ + $$PWD/tests/perf/fstream_perf.cc \ + $$PWD/tests/perf/future_util_perf.cc \ + $$PWD/tests/perf/linux_perf_event.cc \ + $$PWD/tests/perf/perf_tests.cc \ + $$PWD/tests/perf/rpc_perf.cc \ + $$PWD/tests/perf/shared_token_bucket.cc \ + $$PWD/tests/perf/smp_submit_to_perf.cc \ + $$PWD/tests/unit/abort_source_test.cc \ + $$PWD/tests/unit/abortable_fifo_test.cc \ + $$PWD/tests/unit/alien_test.cc \ + $$PWD/tests/unit/alloc_test.cc \ + $$PWD/tests/unit/allocator_test.cc \ + $$PWD/tests/unit/app-template_test.cc \ + $$PWD/tests/unit/checked_ptr_test.cc \ + $$PWD/tests/unit/chunk_parsers_test.cc \ + $$PWD/tests/unit/chunked_fifo_test.cc \ + $$PWD/tests/unit/circular_buffer_fixed_capacity_test.cc \ + $$PWD/tests/unit/circular_buffer_test.cc \ + $$PWD/tests/unit/closeable_test.cc \ + $$PWD/tests/unit/condition_variable_test.cc \ + $$PWD/tests/unit/connect_test.cc \ + $$PWD/tests/unit/content_source_test.cc \ + $$PWD/tests/unit/coroutines_test.cc \ + $$PWD/tests/unit/defer_test.cc \ + $$PWD/tests/unit/deleter_test.cc \ + $$PWD/tests/unit/directory_test.cc \ + $$PWD/tests/unit/distributed_test.cc \ + $$PWD/tests/unit/dns_test.cc \ + $$PWD/tests/unit/exception_logging_test.cc \ + $$PWD/tests/unit/execution_stage_test.cc \ + $$PWD/tests/unit/expiring_fifo_test.cc \ + $$PWD/tests/unit/fair_queue_test.cc \ + $$PWD/tests/unit/file_io_test.cc \ + $$PWD/tests/unit/file_utils_test.cc \ + $$PWD/tests/unit/foreign_ptr_test.cc \ + $$PWD/tests/unit/fsnotifier_test.cc \ + $$PWD/tests/unit/fstream_test.cc \ + $$PWD/tests/unit/futures_test.cc \ + $$PWD/tests/unit/httpd_test.cc \ + $$PWD/tests/unit/io_queue_test.cc \ + $$PWD/tests/unit/ipv6_test.cc \ + $$PWD/tests/unit/json_formatter_test.cc \ + $$PWD/tests/unit/locking_test.cc \ + $$PWD/tests/unit/log_buf_test.cc \ + $$PWD/tests/unit/lowres_clock_test.cc \ + $$PWD/tests/unit/metrics_test.cc \ + $$PWD/tests/unit/net_config_test.cc \ + $$PWD/tests/unit/network_interface_test.cc \ + $$PWD/tests/unit/noncopyable_function_test.cc \ + $$PWD/tests/unit/output_stream_test.cc \ + $$PWD/tests/unit/packet_test.cc \ + $$PWD/tests/unit/pipe_test.cc \ + $$PWD/tests/unit/program_options_test.cc \ + $$PWD/tests/unit/queue_test.cc \ + $$PWD/tests/unit/request_parser_test.cc \ + $$PWD/tests/unit/rpc_test.cc \ + $$PWD/tests/unit/scheduling_group_test.cc \ + $$PWD/tests/unit/semaphore_test.cc \ + $$PWD/tests/unit/sharded_test.cc \ + $$PWD/tests/unit/shared_ptr_test.cc \ + $$PWD/tests/unit/shared_token_bucket_test.cc \ + $$PWD/tests/unit/signal_test.cc \ + $$PWD/tests/unit/simple_stream_test.cc \ + $$PWD/tests/unit/slab_test.cc \ + $$PWD/tests/unit/smp_test.cc \ + $$PWD/tests/unit/socket_test.cc \ + $$PWD/tests/unit/source_location_test.cc \ + $$PWD/tests/unit/spawn_test.cc \ + $$PWD/tests/unit/sstring_test.cc \ + $$PWD/tests/unit/stall_detector_test.cc \ + $$PWD/tests/unit/stream_reader_test.cc \ + $$PWD/tests/unit/thread_context_switch_test.cc \ + $$PWD/tests/unit/thread_test.cc \ + $$PWD/tests/unit/timer_test.cc \ + $$PWD/tests/unit/tls_test.cc \ + $$PWD/tests/unit/tuple_utils_test.cc \ + $$PWD/tests/unit/uname_test.cc \ + $$PWD/tests/unit/unix_domain_test.cc \ + $$PWD/tests/unit/unwind_test.cc \ + $$PWD/tests/unit/weak_ptr_test.cc \ + $$PWD/tests/unit/websocket_test.cc + +INCLUDEPATH = \ + $$PWD/build/debug/gen/src/proto \ + $$PWD/build/release/gen/src/proto \ + $$PWD/build2/gen/src/proto + +#DEFINES = + diff --git a/db_simple.pro.user b/db_simple.pro.user new file mode 100644 index 00000000000..e523f3a5984 --- /dev/null +++ b/db_simple.pro.user @@ -0,0 +1,266 @@ + + + + + + EnvironmentId + {ca393d1f-e9ed-4bec-aa26-20e86827200b} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + 0 + false + true + false + 2 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + false + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + + 0 + true + + true + true + Builtin.DefaultTidyAndClazy + 4 + true + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop Qt 6.7.0 + Desktop Qt 6.7.0 + qt.qt6.670.linux_gcc_64_kit + 0 + 0 + 0 + + 0 + /home/DEV/seastar/build/Desktop_Qt_6_7_0-Debug + /home/DEV/seastar/build/Desktop_Qt_6_7_0-Debug + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + /home/DEV/seastar/build/Desktop_Qt_6_7_0-Release + /home/DEV/seastar/build/Desktop_Qt_6_7_0-Release + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + + + 0 + /home/DEV/seastar/build/Desktop_Qt_6_7_0-Profile + /home/DEV/seastar/build/Desktop_Qt_6_7_0-Profile + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt index 0f26401b1b8..6485a5a6219 100644 --- a/demos/CMakeLists.txt +++ b/demos/CMakeLists.txt @@ -62,6 +62,9 @@ endif () seastar_add_demo (hello-world SOURCES hello-world.cc) +seastar_add_demo (db + SOURCES db_demo.cc) + seastar_add_demo (websocket SOURCES websocket_demo.cc) diff --git a/demos/CMakeLists.txt.user b/demos/CMakeLists.txt.user new file mode 100644 index 00000000000..98bdc336304 --- /dev/null +++ b/demos/CMakeLists.txt.user @@ -0,0 +1,418 @@ + + + + + + EnvironmentId + {ca393d1f-e9ed-4bec-aa26-20e86827200b} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + 0 + false + true + false + 2 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + false + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + + 0 + true + + true + true + Builtin.DefaultTidyAndClazy + 4 + true + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop Qt 6.7.0 + Desktop Qt 6.7.0 + qt.qt6.670.linux_gcc_64_kit + 0 + 0 + 0 + + Debug + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} + 0 + /home/DEV/seastar/demos/build/Desktop_Qt_6_7_0-Debug + + + + + all + + false + + true + Build + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + Build + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + CMakeProjectManager.CMakeBuildConfiguration + + + Release + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=Release +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} + /home/DEV/seastar/demos/build/Desktop_Qt_6_7_0-Release + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + CMakeProjectManager.CMakeBuildConfiguration + + + RelWithDebInfo + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} + /home/DEV/seastar/demos/build/Desktop_Qt_6_7_0-RelWithDebInfo + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release with Debug Information + CMakeProjectManager.CMakeBuildConfiguration + + + RelWithDebInfo + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} + 0 + /home/DEV/seastar/demos/build/Desktop_Qt_6_7_0-Profile + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + CMakeProjectManager.CMakeBuildConfiguration + + + MinSizeRel + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=MinSizeRel +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} + /home/DEV/seastar/demos/build/Desktop_Qt_6_7_0-MinSizeRel + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Minimum Size Release + CMakeProjectManager.CMakeBuildConfiguration + + 5 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/demos/db_demo.cc b/demos/db_demo.cc new file mode 100755 index 00000000000..39807f444f5 --- /dev/null +++ b/demos/db_demo.cc @@ -0,0 +1,251 @@ +/* + * This file is open source software, licensed to you under the terms + * of the Apache License, Version 2.0 (the "License"). See the NOTICE file + * distributed with this work for additional information regarding copyright + * ownership. 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. + */ + +/* + * DB server demo + * Author: AlexanderMihail@gmail.com + * Date: 2024.04.08 + * + * A simple persistent key/value store + * Utilizing the seastar library for asynchronous execution + * and input/output operations, maximizing the usage of the + * disk CPU and memory. + * Dataset: + * - Keys are utf-8 strings up to 255 bytes in length + * - Values are utf-8 strings of unlimited length. + * - Data is sharded among the CPU cores, based on they keys + * Data is manipulated and accessed using http-based REST API: + * - Insert / update of a single key/value pair + * - Query of a single key, returning its value + * - Query the sorted list of all keys + * - Delete a single key (and its associated value) + * Cache: + * - Newly written data should be cached in memory + * - Recently used data should be cached in memory + * - The size of the cache is limited to some configurable limit + * - Least recently used data should be evicted from the cache to + * make room for new data that was recently read or written + */ + +#include +#include +#include +#include +#include +#include +//#include "demo.json.hh" +#include +#include +#include +#include +#include +#include + +namespace bpo = boost::program_options; + +using namespace seastar; +using namespace httpd; + +logger applog("app"); + +struct Stats { + constexpr static int version{0}; + std::atomic_int sr; + std::atomic_int ops; + std::atomic_int inserts, deletes, updates, queries; +}; + +struct Cache : Stats { + std::map key_vals; + std::string get(std::string key, bool remove=false) { + if (auto place = key_vals.find(key); place != key_vals.end()) { + auto rv = place->second; + if (remove) + key_vals.erase(place); + return rv; + } + return ""; + } + void set(std::string key, std::string val) { + key_vals.insert_or_assign(key, val); + } +} cache {{0,0, 0,0,0,0}}; + +//class handl : public httpd::handler_base { +//public: +// virtual future > handle(const sstring& path, +// std::unique_ptr req, std::unique_ptr rep) { +// rep->_content = "hello"; +// rep->done("html"); +// return make_ready_future>(std::move(rep)); +// } +//}; + +void set_routes(routes& r) { + function_handler* h1 = new function_handler([](const_req req) { + auto key = req.query_parameters.contains("key") ? req.query_parameters.at("key") : ""; + auto value = req.query_parameters.contains("value") ? req.query_parameters.at("value") : ""; + auto op = req.query_parameters.contains("op") ? req.query_parameters.at("op") : ""; + if (op=="insert") + { + cache.set(key, value); + cache.inserts++; + } + else if (op=="delete") + { + if (key!="") + cache.get(key, true); + else + cache.key_vals.clear(); + cache.deletes++; + } + else if (op=="update") + { + cache.set(key, value); + cache.updates++; + } + else // any op other than insert, delete, or update is a read + { + if (key!="") + value = cache.get(key); + else + for (value = ""; auto place : cache.key_vals) + value += place.first + "=" + place.second + "; "; + cache.queries++; + } + std::string s = format("DB request {}", cache.ops++); + s += " op=" + op + " " + key + "=" + value; + applog.info("{:}", s); + return s; + }); + function_handler* h2 = new function_handler([](const_req req) { + std::string s = format( + "Stats: {} " + "ops:{}, " + "inserts:{}, " + "deletes:{}, " + "updates:{}, " + "queries:{}, " + "cachesz:{}", + cache.sr.load(), + cache.ops.load(), + cache.inserts.load(), + cache.deletes.load(), + cache.updates.load(), + cache.queries.load(), + cache.key_vals.size() + ); + cache.sr++; + applog.info("{:}", s); + return sstring(s); + }); + r.add(operation_type::GET, url("/"), h1); + r.add(operation_type::GET, url("/stats"), h2); + r.add(operation_type::GET, url("/jf"), h2); + r.add(operation_type::GET, url("/file").remainder("path"), new directory_handler("/")); +} + +int main(int ac, char** av) { + applog.info("Db demo {:}", cache.version); + httpd::http_server_control prometheus_server; + prometheus::config pctx; + app_template app; + + app.add_options()("port", bpo::value()->default_value(10000), "HTTP Server port"); + app.add_options()("prometheus_port", bpo::value()->default_value(9180), "Prometheus port. Set to zero in order to disable."); + app.add_options()("prometheus_address", bpo::value()->default_value("0.0.0.0"), "Prometheus address"); + app.add_options()("prometheus_prefix", bpo::value()->default_value("seastar_httpd"), "Prometheus metrics prefix"); + + return app.run(ac, av, [&] { + return seastar::async([&] { + struct stop_signal { + bool _caught = false; + seastar::condition_variable _cond; + void signaled() { + if (_caught) + return; + _caught = true; + _cond.broadcast(); + } + stop_signal() { + seastar::engine().handle_signal(SIGINT, [this] { signaled(); }); + seastar::engine().handle_signal(SIGTERM, [this] { signaled(); }); + } + ~stop_signal() { + // There's no way to unregister a handler yet, so register a no-op handler instead. + seastar::engine().handle_signal(SIGINT, [] {}); + seastar::engine().handle_signal(SIGTERM, [] {}); + } + seastar::future<> wait() { return _cond.wait([this] { return _caught; }); } + bool stopping() const { return _caught; } + } stop_signal; + auto&& config = app.configuration(); + httpd::http_server_control prometheus_server; + bool prometheus_started = false; + + auto stop_prometheus = defer([&] () noexcept { + if (prometheus_started) { + std::cout << "Stoppping Prometheus server" << std::endl; // This can throw, but won't. + prometheus_server.stop().get(); + } + }); + + uint16_t pport = config["prometheus_port"].as(); + if (pport) { + prometheus::config pctx; + net::inet_address prom_addr(config["prometheus_address"].as()); + + pctx.metric_help = "seastar::httpd server statistics"; + pctx.prefix = config["prometheus_prefix"].as(); + + std::cout << "starting prometheus API server" << std::endl; + prometheus_server.start("prometheus").get(); + + prometheus::start(prometheus_server, pctx).get(); + + prometheus_started = true; + + prometheus_server.listen(socket_address{prom_addr, pport}).handle_exception([prom_addr, pport] (auto ep) { + std::cerr << seastar::format("Could not start Prometheus API server on {}:{}: {}\n", prom_addr, pport, ep); + return make_exception_future<>(ep); + }).get(); + + } + + uint16_t port = config["port"].as(); + auto server = new http_server_control(); + auto rb = make_shared("apps/httpd/"); + server->start().get(); + + auto stop_server = defer([&] () noexcept { + std::cout << "Stoppping HTTP server" << std::endl; // This can throw, but won't. + server->stop().get(); + }); + + server->set_routes(set_routes).get(); + server->set_routes([rb](routes& r){rb->set_api_doc(r);}).get(); + server->set_routes([rb](routes& r) {rb->register_function(r, "demo", "hello world application");}).get(); + server->listen(port).get(); + + std::cout << "Seastar HTTP server listening on port " << port << " ...\n"; + + stop_signal.wait().get(); + return 0; + }); + }); +} diff --git a/demos/http_client_demo.cc b/demos/http_client_demo.cc index 3a201b4f8a0..cc25abf2799 100644 --- a/demos/http_client_demo.cc +++ b/demos/http_client_demo.cc @@ -32,8 +32,11 @@ #include #include +#pragma GCC diagnostic ignored "-Wunused-variable" + using namespace seastar; namespace bpo = boost::program_options; +logger applog("app"); struct printer { future> operator() (temporary_buffer buf) { @@ -58,11 +61,12 @@ int main(int ac, char** av) { return app.run(ac, av, [&] { auto&& config = app.configuration(); - auto host = config["host"].as(); - auto path = config["path"].as(); - auto method = config["method"].as(); + auto host = config.count("host") == 0 ? std::string("192.168.1.131") : config["host"].as(); + auto path = config.count("path") == 0 ? std::string("/path") : config["path"].as(); + auto method = config.count("method") == 0 ? std::string("GET") : config["method"].as(); auto body = config.count("file") == 0 ? std::string("") : config["file"].as(); - auto https = config["https"].as(); + auto https = config.count("https") == 0 ? false : config["https"].as(); + auto port = config.count("port") == 0 ? 10000 : config["port"].as(); return seastar::async([=] { net::hostent e = net::dns::get_host_by_name(host, net::inet_address::family::INET).get(); @@ -70,11 +74,11 @@ int main(int ac, char** av) { if (https) { auto certs = ::make_shared(); certs->set_system_trust().get(); - fmt::print("{} {}:443{}\n", method, e.addr_list.front(), path); - cln = std::make_unique(socket_address(e.addr_list.front(), 443), std::move(certs), host); + fmt::print("{} {}:{}{}\n", method, e.addr_list.front(), port, path); + cln = std::make_unique(socket_address(e.addr_list.front(), port), std::move(certs), host); } else { - fmt::print("{} {}:80{}\n", method, e.addr_list.front(), path); - cln = std::make_unique(socket_address(e.addr_list.front(), 80)); + fmt::print("{} {}:{}{}\n", method, e.addr_list.front(), port, path); + cln = std::make_unique(socket_address(e.addr_list.front(), port)); } auto req = http::request::make(method, host, path); if (body != "") { diff --git a/demos/tcp_demo.cc b/demos/tcp_demo.cc index 34ba69d7f51..196459c7a84 100644 --- a/demos/tcp_demo.cc +++ b/demos/tcp_demo.cc @@ -66,7 +66,7 @@ int main(int ac, char** av) { auto vnet = create_virtio_net_device(opts.virtio_opts, opts.lro); interface netif(std::move(vnet)); ipv4 inet(&netif); - inet.set_host_address(ipv4_address("192.168.122.2")); + inet.set_host_address(ipv4_address("192.168.1.131")); tcp_test tt(inet); (void)engine().when_started().then([&tt] { tt.run(); }); engine().run(); diff --git a/rest.cmd b/rest.cmd new file mode 100755 index 00000000000..69d84a43080 --- /dev/null +++ b/rest.cmd @@ -0,0 +1,6 @@ +set host=http://192.168.1.131:10000 +:loop1 +curl %host%/stats +curl %host%^?op=insert^&key=aaa^&value=AAA +curl %host%^?key=aaa +goto:loop1 diff --git a/seastar.kdev4 b/seastar.kdev4 new file mode 100644 index 00000000000..cd9800e0815 --- /dev/null +++ b/seastar.kdev4 @@ -0,0 +1,4 @@ +[Project] +CreatedFrom=CMakeLists.txt +Manager=KDevCMakeManager +Name=seastar From 3fc909dc90b701afc38d7391adf8b207f4484260 Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Tue, 9 Apr 2024 17:24:16 +0300 Subject: [PATCH 02/19] Added Lock to protect Cache::key_vals against shard contention. --- demos/db_demo.cc | 53 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/demos/db_demo.cc b/demos/db_demo.cc index 39807f444f5..939302ce60c 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -70,19 +70,46 @@ struct Stats { std::atomic_int inserts, deletes, updates, queries; }; +struct Lock { + std::atomic_bool l {false}; + Lock() + { + bool expected = false; + while (!atomic_compare_exchange_strong(&l, &expected, true)) + collisions++; + applog.info("Locked"); + } + ~Lock(){ applog.info("Unlocked"); l = false; } + static std::atomic_int collisions; +}; +std::atomic_int Lock::collisions = 0; + struct Cache : Stats { std::map key_vals; std::string get(std::string key, bool remove=false) { - if (auto place = key_vals.find(key); place != key_vals.end()) { - auto rv = place->second; + Lock l; + std::string value = ""; + if (key=="") + { + if (remove) + key_vals.clear(); + else + for (auto place : key_vals) + value += place.first + "=" + place.second + "; "; + applog.info("{:} {:}", remove ? "Removed" : "Get", ""); + } + else if (auto place = key_vals.find(key); place != key_vals.end()) { + value = place->second; if (remove) key_vals.erase(place); - return rv; + applog.info("{:} {:}", remove ? "Removed" : "Get", key=="" ? "" : key); } - return ""; + return value; } void set(std::string key, std::string val) { + Lock l; key_vals.insert_or_assign(key, val); + applog.info("{:} {:} {:}", "Set", key, val); } } cache {{0,0, 0,0,0,0}}; @@ -108,10 +135,7 @@ void set_routes(routes& r) { } else if (op=="delete") { - if (key!="") - cache.get(key, true); - else - cache.key_vals.clear(); + cache.get(key, true); cache.deletes++; } else if (op=="update") @@ -121,11 +145,7 @@ void set_routes(routes& r) { } else // any op other than insert, delete, or update is a read { - if (key!="") - value = cache.get(key); - else - for (value = ""; auto place : cache.key_vals) - value += place.first + "=" + place.second + "; "; + value = cache.get(key); cache.queries++; } std::string s = format("DB request {}", cache.ops++); @@ -141,14 +161,17 @@ void set_routes(routes& r) { "deletes:{}, " "updates:{}, " "queries:{}, " - "cachesz:{}", + "cachesz:{}, " + "Collisions:{}, " + , cache.sr.load(), cache.ops.load(), cache.inserts.load(), cache.deletes.load(), cache.updates.load(), cache.queries.load(), - cache.key_vals.size() + cache.key_vals.size(), + Lock::collisions ); cache.sr++; applog.info("{:}", s); From d02fba831e02446b115591496e6bdba7422e95ee Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Tue, 9 Apr 2024 23:48:38 +0300 Subject: [PATCH 03/19] Added a Disk back-end to Cache. It currently simply creates/opens two text files for Index and Data. Keys go to Index, whereas Values go to the Data file. --- demos/db_demo.cc | 81 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 21 deletions(-) diff --git a/demos/db_demo.cc b/demos/db_demo.cc index 939302ce60c..67ed2c843b4 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -65,9 +65,24 @@ logger applog("app"); struct Stats { constexpr static int version{0}; - std::atomic_int sr; std::atomic_int ops; std::atomic_int inserts, deletes, updates, queries; + operator sstring() const + { + return format( + "ops:{}, " + "inserts:{}, " + "deletes:{}, " + "updates:{}, " + "queries:{}, " + , + ops.load(), + inserts.load(), + deletes.load(), + updates.load(), + queries.load() + ); + } }; struct Lock { @@ -84,7 +99,41 @@ struct Lock { }; std::atomic_int Lock::collisions = 0; -struct Cache : Stats { +struct Disk { + constexpr static auto index_fname = "db_index.txt"; + constexpr static auto data_fname = "db_data.txt"; + int fid_index; + int fid_data; + Disk() + { + fid_index = open(index_fname, O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); + applog.info("Opened {:} returned {:}, {:}", index_fname, fid_index, errno); + fid_data = open(data_fname, O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); + applog.info("Opened {:} returned {:}", data_fname, fid_data, errno); + } + void set(std::string key, std::string val) { + Lock l; + int problems = 0; + lseek(fid_index, 0, SEEK_END); + auto len = write(fid_index, key.c_str(), key.length()); + if (len != (ssize_t)key.length()) + problems |= 1; + write(fid_index, "\n", 1); + lseek(fid_data, 0, SEEK_END); + len = write(fid_data, val.c_str(), val.length()); + if (len != (ssize_t)val.length()) + problems |= 2; + write(fid_data, "\n", 1); + applog.info("{:} {:} {:} {:}", "Write", key, val, + problems == 1 ? "fail index" : + problems == 2 ? "fail data" : + problems == 3 ? "fail index and data" : + "ok" + ); + } +}; + +struct Cache : Stats, Disk { std::map key_vals; std::string get(std::string key, bool remove=false) { Lock l; @@ -94,7 +143,7 @@ struct Cache : Stats { if (remove) key_vals.clear(); else - for (auto place : key_vals) + for (auto &place : key_vals) value += place.first + "=" + place.second + "; "; applog.info("{:} {:}", remove ? "Removed" : "Get", ""); } @@ -109,9 +158,10 @@ struct Cache : Stats { void set(std::string key, std::string val) { Lock l; key_vals.insert_or_assign(key, val); + Disk::set(key, val); applog.info("{:} {:} {:}", "Set", key, val); } -} cache {{0,0, 0,0,0,0}}; +} cache {{0,0,0,0,0}}; //class handl : public httpd::handler_base { //public: @@ -154,28 +204,17 @@ void set_routes(routes& r) { return s; }); function_handler* h2 = new function_handler([](const_req req) { - std::string s = format( - "Stats: {} " - "ops:{}, " - "inserts:{}, " - "deletes:{}, " - "updates:{}, " - "queries:{}, " + auto ss = format( + "Stats:{}, " "cachesz:{}, " - "Collisions:{}, " + "Collisions:{}" , - cache.sr.load(), - cache.ops.load(), - cache.inserts.load(), - cache.deletes.load(), - cache.updates.load(), - cache.queries.load(), + (sstring)cache, cache.key_vals.size(), Lock::collisions ); - cache.sr++; - applog.info("{:}", s); - return sstring(s); + applog.info("{:}", ss); + return ss; }); r.add(operation_type::GET, url("/"), h1); r.add(operation_type::GET, url("/stats"), h2); From 83f811f0e9a22f8200ce107899a59f0a5c68d64b Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Thu, 11 Apr 2024 00:47:12 +0300 Subject: [PATCH 04/19] Better Lock. Cache renamed to Table. Added /?op=list, /?op=invalidate, /?op=purge, /?op=compact. Repaired the overall logic of the server and disk persistence. More REST commands to: /quit, /config?trace_level=1111, /config?max_cache=1. Enhanced the demos/rest.cmd with a more complex workflow to demonstrate fragmentation and defragmentation of keys and values files. --- demos/db_demo.cc | 535 +++++++++++++++++++++++++++++++++++++++-------- rest.cmd | 48 ++++- 2 files changed, 496 insertions(+), 87 deletions(-) diff --git a/demos/db_demo.cc b/demos/db_demo.cc index 67ed2c843b4..062cd646c01 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -19,7 +19,8 @@ /* * DB server demo * Author: AlexanderMihail@gmail.com - * Date: 2024.04.08 + * Incept Date: 2024.04.08 + * Modified on: 2024.04.11 * * A simple persistent key/value store * Utilizing the seastar library for asynchronous execution @@ -41,6 +42,25 @@ * - Least recently used data should be evicted from the cache to * make room for new data that was recently read or written */ +/* + * Implementation details: + * - Data is stored on disk in two files with names _keys.txt and _values.txt. + * - Data is text so that it may be inspected and polled in Notepad++. + * - The keys.txt (index) file is a fixed record length of some 289 bytes. The fixed record length is to allow instant updates of key values. + * - The values.txt (data) file is a concatenation of values with no separation. The index file has each key referencing its value by file offset and size of value. + * - The memory cache consists of keys and values deques, plus the xref map of (key_name,deque_element) pair. The xref is used for O(logN) retrieval. + * - The memory cache has to be at least 1 element in size. Eviction happens at the right-end of the key/value deques. + * - Last used elemets are dislocated and appended to the left of the deques. So the left-to-right order is youngest-to-oldest. + * - For performance reasons, resizing the value of a key is recorded in-place in the values data file if the new size is less or equal to the previous value. + * - The growing value is recorded at the end of the data file so to avoid merging and rebuilding the index file. A gap is now present in the value file where the value used to be prior to its growth. + * - The size of the value file can be compared to the Stats::gaps profile to decide if a compaction should be initiated. + * - All read/write operations on the data set are protected by a spinlock. Pass/Collision ratio is monitored. + * Limitations: + * - To keep the index human-readable, a CSV format was chosen: (key-name,off_values,size_value, padding). + * - This format implies that keys must not contain comma characters. + * - The empty string in queries has special meaning. Keys cannot be empty. + * - Empty values should be allowed, but the REST API curerntly treats "" as an intention to delete the key. + */ #include #include @@ -61,12 +81,43 @@ namespace bpo = boost::program_options; using namespace seastar; using namespace httpd; +const char* available_trace_levels[] = {"LOCKS", "FILEIO", "CACHE", "SERVER"}; +enum ETrace { LOCKS, FILEIO, CACHE, SERVER, MAX}; +int trace_level = (1 << ETrace::FILEIO); + logger applog("app"); -struct Stats { +struct Lock +{ + std::atomic_bool& value; + bool reentered; + Lock(std::atomic_bool& value, bool reentered=false) : value(value), reentered(reentered) + { + if (reentered) + return; + bool expected = false; + while (!atomic_compare_exchange_strong(&value, &expected, true)) + collisions++; + passes++; + if (trace_level & (1 << ETrace::LOCKS)) applog.info("Locked"); + } + ~Lock() + { + if (reentered) + return; + if (trace_level & (1 << ETrace::LOCKS)) applog.info("Unlocked"); + value = false; + } + static std::atomic_int passes; + static std::atomic_int collisions; +}; +std::atomic_int Lock::passes = 0; +std::atomic_int Lock::collisions = 0; + +struct Stats +{ constexpr static int version{0}; - std::atomic_int ops; - std::atomic_int inserts, deletes, updates, queries; + std::atomic_int ops{0}, inserts{0}, deletes{0}, updates{0}, queries{0}, purges{0}, invalidates{0}, evictions{0}, compacts{0}; operator sstring() const { return format( @@ -75,93 +126,336 @@ struct Stats { "deletes:{}, " "updates:{}, " "queries:{}, " + "purges:{}, " + "invalidates:{}, " + "evictions:{}, " + "compacts:{}" , ops.load(), inserts.load(), deletes.load(), updates.load(), - queries.load() + queries.load(), + purges.load(), + invalidates.load(), + evictions.load(), + compacts.load() ); } }; -struct Lock { - std::atomic_bool l {false}; - Lock() +struct Table : Stats { + static size_t max_cache; + std::string name; + constexpr static auto keys_fname = "keys.txt"; + constexpr static auto values_fname = "values.txt"; + constexpr static auto compact_fname = "compact.txt"; + constexpr static size_t key_line_size = 256+1+20+10+1+1; // Key,int64,int32\n0 + std::atomic_bool lock = false; + + int fid_keys{0}; + int fid_values{0}; + size_t entries{0}; + size_t gaps{0}; + + struct Value { - bool expected = false; - while (!atomic_compare_exchange_strong(&l, &expected, true)) - collisions++; - applog.info("Locked"); - } - ~Lock(){ applog.info("Unlocked"); l = false; } - static std::atomic_int collisions; -}; -std::atomic_int Lock::collisions = 0; + std::string text; + long long fpos; + size_t sz; + }; + struct Key + { + std::string text; + long long fpos; + std::deque::iterator it_value; + }; + std::deque values; + std::deque keys; + std::map::iterator> xref; -struct Disk { - constexpr static auto index_fname = "db_index.txt"; - constexpr static auto data_fname = "db_data.txt"; - int fid_index; - int fid_data; - Disk() + Table(std::string name) : name(name) + { + fid_keys = open((name+keys_fname).c_str(), O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); + applog.info("Opened {:} returned {:}, {:}", name+keys_fname, fid_keys, errno); + fid_values = open((name+values_fname).c_str(), O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); + applog.info("Opened {:} returned {:}", name+keys_fname, fid_values, errno); + } + auto list() + { + Lock l(lock); + std::set keys; + char buf[key_line_size]; + lseek(fid_keys, 0, SEEK_SET); + while (true) + { + auto len = read(fid_keys, buf, sizeof(buf)-1); + if (len<=0) + break; + char * sp = strchr(buf,','); + *sp++=0; + keys.insert(buf); + } + std::string s; + for (auto key : keys) + s += key + "\n"; + if (trace_level & (1 << ETrace::SERVER)) + applog.info("list: {:}", s); + return s; + } + void purge(bool files) { - fid_index = open(index_fname, O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); - applog.info("Opened {:} returned {:}, {:}", index_fname, fid_index, errno); - fid_data = open(data_fname, O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); - applog.info("Opened {:} returned {:}", data_fname, fid_data, errno); + Lock l(lock); + values.clear(); + keys.clear(); + xref.clear(); + if (files) + { + entries = 0; + gaps = 0; + ftruncate(fid_values, 0); + ftruncate(fid_keys, 0); + purges++; + } + invalidates++; + if (trace_level & ((1 << ETrace::CACHE) | (1 << ETrace::FILEIO))) + applog.info("purge: cache{:}", files ? " and files" : ""); } - void set(std::string key, std::string val) { - Lock l; + void compact() + { + Lock l(lock); + purge(false); int problems = 0; - lseek(fid_index, 0, SEEK_END); - auto len = write(fid_index, key.c_str(), key.length()); - if (len != (ssize_t)key.length()) + auto fid_temp = open((name+compact_fname).c_str(), O_CREAT | O_TRUNC | O_RDWR /*| O_TMPFILE*/, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); + if (fid_temp>0) + { + off_t fpos_keys = 0; + off_t fpos_values = 0; + off_t fpos_temp = 0; + char buf[key_line_size]; + lseek(fid_keys, 0, SEEK_SET); + while (true) + { + auto len = read(fid_keys, buf, sizeof(buf)-1); + if (len<=0) + break; + char * sp = strchr(buf,','); + *sp++=0; + size_t sz; + sscanf(sp, "%jd,%zu", &fpos_values, &sz); + std::string val(sz+1, 0); + lseek(fid_values, fpos_values, SEEK_SET); + read(fid_values, (char*)val.c_str(), sz); + write(fid_temp, val.c_str(), sz); + sprintf(buf+strlen(buf), ",%jd,%zu,", fpos_temp, sz); + len = strlen(buf); + auto pad = sizeof(buf)-1-len-1; + sprintf(buf+len, "%*c\n", int(pad), ' '); + lseek(fid_keys, fpos_keys, SEEK_SET); + write(fid_keys, buf, sizeof(buf)-1); + fpos_keys += sizeof(buf)-1; + fpos_temp += sz; + } + ftruncate(fid_keys, fpos_keys); + lseek(fid_temp, 0, SEEK_SET); + lseek(fid_values, 0, SEEK_SET); + while (true) + { + auto len = read(fid_temp, buf, sizeof(buf)-1); + if (len<=0) + break; + write(fid_values, buf, sizeof(buf)-1); + fpos_values += sizeof(buf)-1; + } + ftruncate(fid_values, fpos_temp); + close(fid_temp); + unlink((name+compact_fname).c_str()); + compacts++; + gaps=0; + } + else problems |= 1; - write(fid_index, "\n", 1); - lseek(fid_data, 0, SEEK_END); - len = write(fid_data, val.c_str(), val.length()); - if (len != (ssize_t)val.length()) - problems |= 2; - write(fid_data, "\n", 1); - applog.info("{:} {:} {:} {:}", "Write", key, val, - problems == 1 ? "fail index" : - problems == 2 ? "fail data" : - problems == 3 ? "fail index and data" : - "ok" - ); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("compacted: {:}, problems: {:}, errno: {:}", name+compact_fname, problems, errno); } -}; - -struct Cache : Stats, Disk { - std::map key_vals; - std::string get(std::string key, bool remove=false) { - Lock l; - std::string value = ""; + void evict() + { + if (keys.size() == max_cache) + { + auto key = keys.back().text; + xref.erase(xref.find(key)); + keys.pop_back(); + values.pop_back(); // Eviction + if (trace_level & (1 << ETrace::CACHE)) + applog.info("evict key {:}", key); + evictions++; + } + } + std::string get(std::string key, bool reentered=false, bool remove=false) + { + Lock l(lock, reentered); + std::string val = ""; if (key=="") { if (remove) - key_vals.clear(); + purge(false); else - for (auto &place : key_vals) - value += place.first + "=" + place.second + "; "; - applog.info("{:} {:}", remove ? "Removed" : "Get", ""); + { + for (auto &x : xref) + val += x.first + "=" + x.second->it_value->text + "; "; + if (trace_level & (1 << ETrace::CACHE)) + applog.info("get: cache"); + } } - else if (auto place = key_vals.find(key); place != key_vals.end()) { - value = place->second; + else if (auto x = xref.find(key); x != xref.end()) + { + val = x->second->it_value->text; if (remove) - key_vals.erase(place); - applog.info("{:} {:}", remove ? "Removed" : "Get", key=="" ? "" : key); + { + values.erase(x->second->it_value); + keys.erase(x->second); + xref.erase(x); + entries--; + } + if (trace_level & (1 << ETrace::CACHE)) + applog.info("{:} {:} {:}", remove ? "get: removed" : "get: ", key=="" ? "" : key, val); + } + else + { + int problems = 0; + char buf[key_line_size]; + off_t fpos_keys = lseek(fid_keys, 0, SEEK_SET); + off_t fpos_values = -1; + size_t sz; + while (true) + { + auto len = read(fid_keys, buf, sizeof(buf)-1); + if (len != sizeof(buf)-1) + break; + char * sp = strchr(buf,','); + *sp++=0; + if (!strcmp(buf,key.c_str())) + { + sscanf(sp, "%jd,%zu", &fpos_values, &sz); + break; // key found in index file + } + fpos_keys = lseek(fid_keys, 0, SEEK_CUR); + } + if (fpos_values!=-1) // Load key from index file + { + evict(); + lseek(fid_values, fpos_values, SEEK_SET); + val.resize(sz); + if (read(fid_values, (char*)val.c_str(), sz) != (ssize_t)sz) + problems |= 1; // Cannot read from values file + values.push_front({val, fpos_values, sz}); + keys.push_front({buf, fpos_keys, values.begin()}); + x = xref.insert_or_assign(key, keys.begin()).first; + if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) + applog.info("get: (cachefill) {:} {:} {:}", key, val, problems); + } + else + if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) + applog.info("get: key {:} not found", key); } - return value; + return val; } - void set(std::string key, std::string val) { - Lock l; - key_vals.insert_or_assign(key, val); - Disk::set(key, val); - applog.info("{:} {:} {:}", "Set", key, val); + void set(std::string key, std::string val) + { + Lock l(lock, false); + auto old_val = ""; //get(key, true); + int problems = 0; + std::string branch = "Skip"; + if (val != old_val) + { + bool overwrite = false; + char buf[key_line_size]; + auto x = xref.find(key); + if (x == xref.end()) + { + evict(); + off_t fpos_keys = lseek(fid_keys, 0, SEEK_SET); + off_t fpos_values = -1; + size_t sz; + while (true) + { + auto len = read(fid_keys, buf, sizeof(buf)-1); + if (len<=0) + break; + char * sp = strchr(buf,','); + *sp++=0; + if (!strcmp(buf,key.c_str())) + { + sscanf(sp, "%jd,%zu", &fpos_values, &sz); + break; // key found in index file + } + fpos_keys = lseek(fid_keys, 0, SEEK_CUR); + } + if (fpos_values == -1) // Load old key from index file + { + fpos_values = lseek(fid_values, 0, SEEK_END); + values.push_front({val, fpos_values, 0}); + keys.push_front({key, fpos_keys, values.begin()}); + x = xref.insert_or_assign(key, keys.begin()).first; + branch = "Add"; + entries++; + } + else + { + values.push_front({val, fpos_values, sz}); + keys.push_front({buf, fpos_keys, values.begin()}); + x = xref.insert_or_assign(key, keys.begin()).first; + branch = "Fill"; + } + } + else + { + branch = "Overwrite"; + overwrite = true; + } + Value& oldv = *x->second->it_value; + if (overwrite && val == oldv.text) + branch = "ignore"; + else + { + auto sz = oldv.sz; + bool reuse_value_space = val.length() <= sz; + off_t fpos_values = 0; + if (reuse_value_space) + { + gaps += sz-val.length(); + fpos_values = oldv.fpos; + } + else + gaps += sz; + sz = val.length(); + fpos_values = lseek(fid_values, fpos_values, reuse_value_space ? SEEK_SET : SEEK_END); + if (write(fid_values, val.c_str(), val.length()) != (ssize_t)val.length()) + problems |= 1; // Cannot write to values file + values.erase(x->second->it_value); + values.push_front({val, fpos_values, sz}); + sprintf(buf, "%s,%jd,%zu,", key.c_str(), fpos_values, sz); + auto len = strlen(buf); + auto fpos_keys = x->second->fpos; + lseek(fid_keys, x->second->fpos, SEEK_SET); + if (write(fid_keys, buf, len) != (ssize_t)len) + problems |= 2; // Cannot write to keys file + len = sizeof(buf)-1-len-1; + sprintf(buf, "%*c\n", int(len), ' '); + len++; + if (write(fid_keys, buf, len) != (ssize_t)len) + problems |= 2; // Cannot write to keys file + keys.erase(x->second); + keys.push_front({key, fpos_keys, values.begin()}); + x->second = keys.begin(); + } + } + if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) + applog.info("set: {:} {:} {:} problems: {:}", branch, key, val, problems); } -} cache {{0,0,0,0,0}}; +} table {"table_"}; +size_t Table::max_cache = 2; + //class handl : public httpd::handler_base { //public: @@ -178,52 +472,127 @@ void set_routes(routes& r) { auto key = req.query_parameters.contains("key") ? req.query_parameters.at("key") : ""; auto value = req.query_parameters.contains("value") ? req.query_parameters.at("value") : ""; auto op = req.query_parameters.contains("op") ? req.query_parameters.at("op") : ""; - if (op=="insert") + if (op=="list") + value = table.list(); + else if (op=="invalidate") + table.purge(false); + else if (op=="compact") + table.compact(); + else if (op=="insert") { - cache.set(key, value); - cache.inserts++; + table.set(key, value); + table.inserts++; + } + else if (op=="purge") + { + table.purge(true); + table.deletes++; } else if (op=="delete") { - cache.get(key, true); - cache.deletes++; + table.get(key, true); + table.deletes++; } else if (op=="update") { - cache.set(key, value); - cache.updates++; + table.set(key, value); + table.updates++; } - else // any op other than insert, delete, or update is a read + else // any other op is a read { - value = cache.get(key); - cache.queries++; + value = table.get(key); + table.queries++; } - std::string s = format("DB request {}", cache.ops++); + std::string s = format("DB request {}", table.ops++); s += " op=" + op + " " + key + "=" + value; - applog.info("{:}", s); + if (trace_level & (1 << ETrace::SERVER)) + applog.info("{:}", s); return s; }); function_handler* h2 = new function_handler([](const_req req) { auto ss = format( "Stats:{}, " + "Entries:{}, " "cachesz:{}, " - "Collisions:{}" + "Gaps:{}, " + "LockPasses:{}, " + "LockCollisions:{} " , - (sstring)cache, - cache.key_vals.size(), + (sstring)table, + table.entries, + table.xref.size(), + table.gaps, + Lock::passes, Lock::collisions ); - applog.info("{:}", ss); + if (trace_level & (1 << ETrace::SERVER)) + applog.info("{:}", ss); return ss; }); + function_handler* h3 = new function_handler([](const_req req) { + std::string s; + if (req.query_parameters.contains("trace_level")) + { + auto level = req.query_parameters.at("trace_level"); + int old_trace_level = trace_level; + int new_trace_level = 0; + std::string old_tl = ""; + std::string new_tl = ""; + for (size_t i=0; i0) + { + old_tl += ","; + new_tl += ","; + } + if (old_trace_level & (1<=0) + { + table.purge(false); + Table::max_cache = new_max_cache; + } + s = format("Changing max_cache from {:} to {:}", old_max_cache, new_max_cache); + } + if ((int)trace_level & (1 << ETrace::SERVER)) + applog.info("{:}", s); + return s; + }); + function_handler* h4 = new function_handler([](const_req req) { + std::string s = "Server shutting down"; + exit(0); + if (trace_level & (1 << ETrace::SERVER)) + applog.info("{:}", s); + return s; + }); r.add(operation_type::GET, url("/"), h1); r.add(operation_type::GET, url("/stats"), h2); + r.add(operation_type::GET, url("/config"), h3); + r.add(operation_type::GET, url("/quit"), h4); r.add(operation_type::GET, url("/jf"), h2); r.add(operation_type::GET, url("/file").remainder("path"), new directory_handler("/")); } int main(int ac, char** av) { - applog.info("Db demo {:}", cache.version); + applog.info("Db demo {:}", table.version); httpd::http_server_control prometheus_server; prometheus::config pctx; app_template app; diff --git a/rest.cmd b/rest.cmd index 69d84a43080..9809f23a336 100755 --- a/rest.cmd +++ b/rest.cmd @@ -1,6 +1,46 @@ +@rem Compliance and stress tester for SeaStar/demos/db_demo.ccc +@rem Author: AlexanderMihail@gmail.com +@rem Incept date: 2024.04.08 +@rem Modified on: 2024.04.11 +@rem Version 1. + +@echo off set host=http://192.168.1.131:10000 +curl %host%/config?trace_level=1111 +curl %host%^?op=purge +set pass1=0 :loop1 -curl %host%/stats -curl %host%^?op=insert^&key=aaa^&value=AAA -curl %host%^?key=aaa -goto:loop1 +@set /a "reminder=%pass1% %% 10" +@echo: +@echo ====== PASS(%pass1%,%reminder%) ========================== +set pass2=0 +:loop2 +curl -s %host%^?op=insert^&key=aaa^&value=text_aaa%%0a >NUL 2>&1 +curl -s %host%^?key=aaa>NUL 2>&1 +curl -s %host%^?op=insert^&key=bbb^&value=text_bbb%%0a>NUL 2>&1 +curl -s %host%^?op=insert^&key=ccc^&value=text_ccc%%0a>NUL 2>&1 +curl -s %host%^?key=aaa>NUL 2>&1 +curl -s %host%^?key=bbb>NUL 2>&1 +curl -s %host%^?op=update^&key=aaa^&value=text_aaaa%%0a>NUL 2>&1 +curl -s %host%^?op=update^&key=bbb^&value=text_bbbb%%0a>NUL 2>&1 +curl -s %host%^?op=update^&key=ccc^&value=text_cccc%%0a>NUL 2>&1 +curl -s %host%^?op=update^&key=aaa^&value=text_aa%%0a>NUL 2>&1 +curl -s %host%^?op=update^&key=bbb^&value=text_bb%%0a>NUL 2>&1 +@set /a "pass2=%pass2%+1" +if %pass1% GTR 0 IF %pass2% LSS 10 goto :loop2 +if %reminder% EQU 0 ( + curl %host%^?op=compact>NUL 2>&1 +) +curl -s %host%^?key=aaa>NUL 2>&1 +curl -s %host%^?key=bbb>NUL 2>&1 +curl -s %host%^?key=ccc>NUL 2>&1 +curl -s %host%^?key=ddd>NUL 2>&1 +curl -s %host%^?op=delete^&key=bbb>NUL 2>&1 +curl -s %host%^?op=list^&key=ALL>NUL 2>&1 +curl -s %host%/stats +curl %host%/config?trace_level=0000>NUL 2>&1 +if %pass1% EQU 100 ( + curl %host%/quit +) +@set /a "pass1=%pass1%+1" +goto :loop1 From 4b5f815c55c5bbbbf17c17c5ed723851cc2b059c Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Thu, 11 Apr 2024 02:51:42 +0300 Subject: [PATCH 05/19] Added handler_base class-based route handlers in preparation for long responses. Test batch rest.cmd exits after 100 iterations. --- demos/db_demo.cc | 25 +++++++++++++++---------- rest.cmd | 2 ++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/demos/db_demo.cc b/demos/db_demo.cc index 062cd646c01..d2f98075ec0 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -457,15 +457,19 @@ struct Table : Stats { size_t Table::max_cache = 2; -//class handl : public httpd::handler_base { -//public: -// virtual future > handle(const sstring& path, -// std::unique_ptr req, std::unique_ptr rep) { -// rep->_content = "hello"; -// rep->done("html"); -// return make_ready_future>(std::move(rep)); -// } -//}; +class HelpHandle : public httpd::handler_base { +public: + bool plain_text; + HelpHandle(bool plain_text) : plain_text(plain_text) {} + virtual future > handle(const sstring& path, + std::unique_ptr req, std::unique_ptr rep) { + rep->_content = plain_text ? + "hello\nfrom db_demo!" : + "hello
from db_demo!"; + rep->done(plain_text ? "plain" : "html"); + return make_ready_future>(std::move(rep)); + } +}; void set_routes(routes& r) { function_handler* h1 = new function_handler([](const_req req) { @@ -587,7 +591,8 @@ void set_routes(routes& r) { r.add(operation_type::GET, url("/stats"), h2); r.add(operation_type::GET, url("/config"), h3); r.add(operation_type::GET, url("/quit"), h4); - r.add(operation_type::GET, url("/jf"), h2); + r.add(operation_type::GET, url("/help"), new HelpHandle(false)); + r.add(operation_type::GET, url("/help_plain"), new HelpHandle(true)); r.add(operation_type::GET, url("/file").remainder("path"), new directory_handler("/")); } diff --git a/rest.cmd b/rest.cmd index 9809f23a336..dc7422b942d 100755 --- a/rest.cmd +++ b/rest.cmd @@ -41,6 +41,8 @@ curl -s %host%/stats curl %host%/config?trace_level=0000>NUL 2>&1 if %pass1% EQU 100 ( curl %host%/quit + goto :EXIT ) @set /a "pass1=%pass1%+1" goto :loop1 +:EXIT \ No newline at end of file From 4df6de30988b197b107c4857186da4c7276a4994 Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Sat, 13 Apr 2024 19:06:30 +0300 Subject: [PATCH 06/19] A much more serious db server. REST api reworked to handle the master table as well as any other user-table. The root of the web server is a generated HTML page with navigation for all the system features. There is now a map of tables. Selecting the current table is with the /tablename/?use rest command. Tables can also be dropped. Table::compact was reworked to shift-up deleted keys in the index. An index_revolver coroutine was introduced to return one index per invocation. This logic also has index cleanup capabilities. The Table::list() command uses this coroutine to produce the list of all keys. Table::get/set are now boolean. The set prevents overinserting and updating of unknown keys. The get returns false if the key is unknown. This allows now for inserting or updating "null" values. Better statistics. Better formatted output. All REST logic is in one DefaultHandle where the table list lock is maneaged. Everything the DB server does is listed in the / page which is built by DefaultHandle::build_help. Added the new Table::self_test method and the corresponding /?selftest=0 REST command. This system of self-testing obsoletes the rest.bat file while also aiming at raw performance. This version has problems with deleting keys that are in cache. TODO. This version closes issues: #1, #2, #3, #4, #5, #6, #8. It advances on issues #13 and #11. --- demos/db_demo.cc | 975 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 719 insertions(+), 256 deletions(-) diff --git a/demos/db_demo.cc b/demos/db_demo.cc index d2f98075ec0..bf90cfbd475 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -20,7 +20,7 @@ * DB server demo * Author: AlexanderMihail@gmail.com * Incept Date: 2024.04.08 - * Modified on: 2024.04.11 + * Modified on: 2024.04.12 * * A simple persistent key/value store * Utilizing the seastar library for asynchronous execution @@ -55,11 +55,11 @@ * - The growing value is recorded at the end of the data file so to avoid merging and rebuilding the index file. A gap is now present in the value file where the value used to be prior to its growth. * - The size of the value file can be compared to the Stats::gaps profile to decide if a compaction should be initiated. * - All read/write operations on the data set are protected by a spinlock. Pass/Collision ratio is monitored. + * - For performance reasons, deleted keys are marked and kept in the index file for lazy compaction. Searching for keys are constantly reducing deleted keys. * Limitations: * - To keep the index human-readable, a CSV format was chosen: (key-name,off_values,size_value, padding). * - This format implies that keys must not contain comma characters. - * - The empty string in queries has special meaning. Keys cannot be empty. - * - Empty values should be allowed, but the REST API curerntly treats "" as an intention to delete the key. + * - The empty string in queries has special meaning. Keys cannot be empty, values can. */ #include @@ -68,7 +68,6 @@ #include #include #include -//#include "demo.json.hh" #include #include #include @@ -76,17 +75,81 @@ #include #include +#pragma GCC diagnostic ignored "-Wunused-variable" + namespace bpo = boost::program_options; using namespace seastar; using namespace httpd; +const char*VERSION="Demo Database Server 0.3"; const char* available_trace_levels[] = {"LOCKS", "FILEIO", "CACHE", "SERVER"}; enum ETrace { LOCKS, FILEIO, CACHE, SERVER, MAX}; -int trace_level = (1 << ETrace::FILEIO); - +int trace_level = (1 << ETrace::FILEIO) | (1 << ETrace::CACHE) | (1 << ETrace::SERVER); logger applog("app"); +// Tried to use seastar::coroutine::experimental::generator. +// Resorted to adopting the following ugly construct for the index revolver coroutine. +// Generator should be part of std, or be a compiler generated construct. +// C++ coroutines are trully a mess. + +template +struct Generator +{ + struct promise_type; + using handle_type = std::coroutine_handle; + struct promise_type // required + { + Generator get_return_object() // This is fundamental + { + return Generator(handle_type::from_promise(*this)); + } + std::suspend_always initial_suspend() { return {}; } + std::suspend_always final_suspend() noexcept { return {}; } + void unhandled_exception() { exception_ = std::current_exception(); } // saving + // exception + template From> // C++20 concept + std::suspend_always yield_value(From&& from) + { + value_ = std::forward(from); // caching the result in promise + return {}; + } + void return_void() {} + private: + friend struct Generator; + T value_; + std::exception_ptr exception_; + }; + Generator(handle_type h) : h_(h) {} + ~Generator() { h_.destroy(); } + explicit operator bool() + { + fill(); + return !h_.done(); + } + T operator()() + { + fill(); + full_ = false; // we are going to move out previously cached + // result to make promise empty again + return std::move(h_.promise().value_); + } +private: + handle_type h_; + bool full_ = false; + void fill() + { + if (!full_) + { + h_(); + if (h_.promise().exception_) + std::rethrow_exception(h_.promise().exception_); + // propagate coroutine exception in called context + full_ = true; + } + } +}; + struct Lock { std::atomic_bool& value; @@ -116,47 +179,52 @@ std::atomic_int Lock::collisions = 0; struct Stats { - constexpr static int version{0}; - std::atomic_int ops{0}, inserts{0}, deletes{0}, updates{0}, queries{0}, purges{0}, invalidates{0}, evictions{0}, compacts{0}; + static std::atomic_int requests, creates, drops; + std::atomic_int inserts{0}, deletes{0}, updates{0}, gets{0}, purges{0}, invalidates{0}, evictions{0}, compacts{0}; operator sstring() const { return format( - "ops:{}, " - "inserts:{}, " - "deletes:{}, " - "updates:{}, " - "queries:{}, " - "purges:{}, " - "invalidates:{}, " - "evictions:{}, " - "compacts:{}" + "requests:{}\n" + "creates:{}\n" + "drops:{}\n" + "inserts:{}\n" + "deletes:{}\n" + "updates:{}\n" + "gets:{}\n" + "purges:{}\n" + "invalidates:{}\n" + "evictions:{}\n" + "compacts:{}\n" , - ops.load(), - inserts.load(), - deletes.load(), - updates.load(), - queries.load(), - purges.load(), - invalidates.load(), - evictions.load(), - compacts.load() + requests, + creates, + drops, + inserts, + deletes, + updates, + gets, + purges, + invalidates, + evictions, + compacts ); } }; +std::atomic_int Stats::requests = 0; +std::atomic_int Stats::creates = 0; +std::atomic_int Stats::drops = 0; struct Table : Stats { - static size_t max_cache; std::string name; - constexpr static auto keys_fname = "keys.txt"; - constexpr static auto values_fname = "values.txt"; - constexpr static auto compact_fname = "compact.txt"; - constexpr static size_t key_line_size = 256+1+20+10+1+1; // Key,int64,int32\n0 - std::atomic_bool lock = false; + size_t max_cache {2}; - int fid_keys{0}; - int fid_values{0}; - size_t entries{0}; - size_t gaps{0}; + constexpr static auto db_prefix = "db_"; + constexpr static auto keys_fname = "_keys.txt"; + constexpr static auto values_fname = "_values.txt"; + constexpr static auto compact_fname = "_compact.txt"; + constexpr static auto master_table_name = "Master"; + + static std::map tables; struct Value { @@ -170,79 +238,94 @@ struct Table : Stats { long long fpos; std::deque::iterator it_value; }; - std::deque values; - std::deque keys; - std::map::iterator> xref; + struct Index { int index; char key[256]; off_t vfpos; size_t vsz; }; - Table(std::string name) : name(name) + Table(Table const &) = delete; + void operator=(Table const &) = delete; + explicit Table(std::string name) : name(name) { - fid_keys = open((name+keys_fname).c_str(), O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); - applog.info("Opened {:} returned {:}, {:}", name+keys_fname, fid_keys, errno); - fid_values = open((name+values_fname).c_str(), O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); + fid_keys = open((db_prefix+name+keys_fname).c_str(), O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); + applog.info("Opened {:} returned {:}, {:}", db_prefix+name+keys_fname, fid_keys, errno); + fid_values = open((db_prefix+name+values_fname).c_str(), O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); applog.info("Opened {:} returned {:}", name+keys_fname, fid_values, errno); + creates++; } - auto list() + std::string close(bool remove_files) { - Lock l(lock); - std::set keys; - char buf[key_line_size]; - lseek(fid_keys, 0, SEEK_SET); - while (true) - { - auto len = read(fid_keys, buf, sizeof(buf)-1); - if (len<=0) - break; - char * sp = strchr(buf,','); - *sp++=0; - keys.insert(buf); - } - std::string s; - for (auto key : keys) - s += key + "\n"; - if (trace_level & (1 << ETrace::SERVER)) - applog.info("list: {:}", s); - return s; + if (fid_keys>0) + ::close(fid_keys); + if (fid_values>0) + ::close(fid_values); + if (!remove_files) + return "Closed files " + (db_prefix+name+keys_fname) + " and " + (db_prefix+name+values_fname) + "\n"; + drops++; + unlink((db_prefix+name+keys_fname).c_str()); + unlink((db_prefix+name+values_fname).c_str()); + unlink((db_prefix+name+compact_fname).c_str()); + return "Removed files " + (db_prefix+name+keys_fname) + " and " + (db_prefix+name+values_fname) + "\n"; } - void purge(bool files) + std::string purge(bool files) { Lock l(lock); values.clear(); keys.clear(); xref.clear(); + std::string s=""; if (files) { + s = "Purged cache and files"; entries = 0; - gaps = 0; + spaces = 0; ftruncate(fid_values, 0); ftruncate(fid_keys, 0); purges++; } + else + s = "Purged cache"; invalidates++; if (trace_level & ((1 << ETrace::CACHE) | (1 << ETrace::FILEIO))) applog.info("purge: cache{:}", files ? " and files" : ""); + return s; } - void compact() + std::string compact() { Lock l(lock); - purge(false); + std::string s = purge(false); int problems = 0; - auto fid_temp = open((name+compact_fname).c_str(), O_CREAT | O_TRUNC | O_RDWR /*| O_TMPFILE*/, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); + auto fid_temp = open((db_prefix+name+compact_fname).c_str(), O_CREAT | O_TRUNC | O_RDWR /*| O_TMPFILE*/, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); if (fid_temp>0) { off_t fpos_keys = 0; off_t fpos_values = 0; off_t fpos_temp = 0; - char buf[key_line_size]; + char buf[key_len]; lseek(fid_keys, 0, SEEK_SET); while (true) { auto len = read(fid_keys, buf, sizeof(buf)-1); - if (len<=0) + if (len==0) + break; // end of index file + if (len<0) + { + problems |= (1<<0); break; + } char * sp = strchr(buf,','); *sp++=0; size_t sz; sscanf(sp, "%jd,%zu", &fpos_values, &sz); + if (fpos_values==index_deleted_marker) + { + auto len = read(fid_keys, buf, sizeof(buf)-1); + if (len==0) + { + ftruncate(fid_keys, fpos_keys); + break; // end of index file + } + lseek(fid_keys, fpos_keys, SEEK_SET); + write(fid_keys, buf, sizeof(buf)-1); // Shift the next index entry up by one. + continue; // index key is marked as deleted + } std::string val(sz+1, 0); lseek(fid_values, fpos_values, SEEK_SET); read(fid_values, (char*)val.c_str(), sz); @@ -262,23 +345,29 @@ struct Table : Stats { while (true) { auto len = read(fid_temp, buf, sizeof(buf)-1); - if (len<=0) + if (len==0) + break; // end of temporary values file + if (len<0) + { + problems |= (1<<1); break; + } write(fid_values, buf, sizeof(buf)-1); fpos_values += sizeof(buf)-1; } ftruncate(fid_values, fpos_temp); - close(fid_temp); - unlink((name+compact_fname).c_str()); + ::close(fid_temp); + unlink((db_prefix+name+compact_fname).c_str()); compacts++; - gaps=0; + spaces=0; } else - problems |= 1; + problems |= (1<<3); if (trace_level & (1 << ETrace::FILEIO)) - applog.info("compacted: {:}, problems: {:}, errno: {:}", name+compact_fname, problems, errno); + applog.info("compacted: {:}, problems: {:}, errno: {:}", db_prefix+name+compact_fname, problems, errno); + return s; } - void evict() + std::string evict() { if (keys.size() == max_cache) { @@ -289,12 +378,90 @@ struct Table : Stats { if (trace_level & (1 << ETrace::CACHE)) applog.info("evict key {:}", key); evictions++; + return "Eviction of key " + key; } + return "Evition not required"; } - std::string get(std::string key, bool reentered=false, bool remove=false) + + // Tried to use seastar::coroutine::experimental::generator + Generator index_revolver(bool locked, int &remove) + { + off_t fpos = 0; + int count = 0; + while (true) + { + char buf[key_len]; + { + Lock l(lock, locked); + lseek(fid_keys, fpos, SEEK_SET); + auto len = read(fid_keys, buf, sizeof(buf)-1); + if (len==0) + { + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("Reached the end of {}, count {}", db_prefix+name+keys_fname, count); + co_yield Index{.index = -count, .vfpos = index_end_marker, .vsz = 0}; + fpos = 0; + count = 0; + continue; + } + if (len<0) + { + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("Error reading {}, count {}, errno {}", db_prefix+name+keys_fname, count, errno); + break; + } + } + count++; + char * sp = strchr(buf,','); + *sp++=0; + Index ind{.index=int(fpos/(sizeof(buf)-1))}; + strncpy(ind.key, buf, sizeof(ind.key)); + sscanf(sp, "%jd,%zu", &ind.vfpos, &ind.vsz); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("{} [{}, {}, {}, {}] of index {}", ind.vfpos==index_deleted_marker ? "Skipping deleted" : "Yielding", ind.index, ind.vfpos, ind.key, ind.vsz, name+keys_fname); + if (ind.vfpos!=index_deleted_marker) + co_yield ind; + fpos += sizeof(buf)-1; + } + } + int delete_index = false; + Generator co_index_locked = index_revolver(false, delete_index); + Generator co_index_unlocked = index_revolver(true, delete_index); + + // The challenge is to get the list of keys while inserts and deletes are pounding. + // Poorer performance than scanning the file top-down, but allows concurrent access while the list is built. + std::string list(bool locked) + { + std::set keys; + int count = 0; + int max_count = std::numeric_limits::max(); + while (true) + { + auto [index, key, vfpos, vsz] = locked ? co_index_locked() : co_index_unlocked(); + if (vfpos!=index_end_marker) // reached the end, must roll over + keys.insert(key); + else + if ((max_count = -index) == 0) + break; + if (++count > max_count) + break; + } + entries = keys.size(); + std::string s; + for (auto& key : keys) + s += key + "\n"; + if (trace_level & (1 << ETrace::SERVER)) + applog.info("list: {:}", s); + return s; + } + auto get(std::string key, std::string &value, bool reentered=false, bool remove=false) { Lock l(lock, reentered); - std::string val = ""; + auto x = xref.begin(); + int problems = 0; + char buf[key_len]; + off_t fpos_values = index_end_marker; + size_t sz; if (key=="") { if (remove) @@ -302,242 +469,442 @@ struct Table : Stats { else { for (auto &x : xref) - val += x.first + "=" + x.second->it_value->text + "; "; + value += x.first + "=" + x.second->it_value->text + "\n"; if (trace_level & (1 << ETrace::CACHE)) - applog.info("get: cache"); + applog.info("get: (cache) {}", value); } } - else if (auto x = xref.find(key); x != xref.end()) + else if ((x = xref.find(key)) != xref.end()) { - val = x->second->it_value->text; + value = x->second->it_value->text; if (remove) { + // mark index entry as deleted. + // The revolver coroutine should come to clean-it up. + off_t fpos_keys = x->second->fpos; + lseek(fid_keys, fpos_keys, SEEK_SET); + auto len = read(fid_keys, buf, sizeof(buf)-1); + if (len==sizeof(buf)-1) + { + char * sp = strchr(buf,','); + *sp++=0; + len = sp-buf-1; + size_t sz; + sscanf(sp, "%jd,%zu", &fpos_values, &sz); + lseek(fid_keys, fpos_keys, SEEK_SET); + fpos_values = index_deleted_marker; + sprintf(buf, "%s,%jd,%zu,", key.c_str(), fpos_values, sz); + len = strlen(buf); + if (write(fid_keys, buf, len) != (ssize_t)len) + problems |= (1<<0); // Cannot write to keys file + len = sizeof(buf)-1-len-1; + sprintf(buf, "%*c\n", int(len), ' '); + len++; + if (write(fid_keys, buf, len) != (ssize_t)len) + problems |= (1<<1); // Cannot write to keys file + } values.erase(x->second->it_value); keys.erase(x->second); xref.erase(x); entries--; } + else + gets++; if (trace_level & (1 << ETrace::CACHE)) - applog.info("{:} {:} {:}", remove ? "get: removed" : "get: ", key=="" ? "" : key, val); + applog.info("{:} {:} {:} problems {}", remove ? "remove" : "get: ", key=="" ? "" : key, value, problems); } else { - int problems = 0; - char buf[key_line_size]; off_t fpos_keys = lseek(fid_keys, 0, SEEK_SET); - off_t fpos_values = -1; - size_t sz; while (true) { auto len = read(fid_keys, buf, sizeof(buf)-1); + if (len==0) + break; // end of index file if (len != sizeof(buf)-1) + { + problems |= (1<<2); // didn't read enough break; + } char * sp = strchr(buf,','); *sp++=0; if (!strcmp(buf,key.c_str())) { sscanf(sp, "%jd,%zu", &fpos_values, &sz); - break; // key found in index file + if (fpos_values != index_deleted_marker) + break; // key found in index file } fpos_keys = lseek(fid_keys, 0, SEEK_CUR); } - if (fpos_values!=-1) // Load key from index file + if (fpos_values!=index_end_marker) // Load key from index file { - evict(); + if (remove) + if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) + applog.info("get: (remove) {:} {:} {:}", key, value, problems); lseek(fid_values, fpos_values, SEEK_SET); - val.resize(sz); - if (read(fid_values, (char*)val.c_str(), sz) != (ssize_t)sz) - problems |= 1; // Cannot read from values file - values.push_front({val, fpos_values, sz}); - keys.push_front({buf, fpos_keys, values.begin()}); - x = xref.insert_or_assign(key, keys.begin()).first; - if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("get: (cachefill) {:} {:} {:}", key, val, problems); + value.resize(sz); + if (read(fid_values, (char*)value.c_str(), sz) != (ssize_t)sz) + problems |= (1<<3); // Cannot read from values file + else + { + evict(); + values.push_front({value, fpos_values, sz}); + keys.push_front({buf, fpos_keys, values.begin()}); + x = xref.insert_or_assign(key, keys.begin()).first; + if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) + applog.info("get: (cachefill) {:} {:} {:}", key, value, problems); + } } else + { + x = xref.end(); if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) applog.info("get: key {:} not found", key); + } } - return val; + struct RV{bool found; decltype(x) it; }; + return RV{x != xref.end(), x}; } - void set(std::string key, std::string val) + bool set(std::string key, std::string val, bool update) { + bool rv = true; Lock l(lock, false); - auto old_val = ""; //get(key, true); + std::string old_val; + auto [found, x] = get(key, old_val, true); int problems = 0; std::string branch = "Skip"; - if (val != old_val) + if (!update || val != old_val) // not found, or found different for update { bool overwrite = false; - char buf[key_line_size]; - auto x = xref.find(key); - if (x == xref.end()) + char buf[key_len]; + if (!found) // key not in cache and not in file { - evict(); - off_t fpos_keys = lseek(fid_keys, 0, SEEK_SET); - off_t fpos_values = -1; - size_t sz; - while (true) - { - auto len = read(fid_keys, buf, sizeof(buf)-1); - if (len<=0) - break; - char * sp = strchr(buf,','); - *sp++=0; - if (!strcmp(buf,key.c_str())) - { - sscanf(sp, "%jd,%zu", &fpos_values, &sz); - break; // key found in index file - } - fpos_keys = lseek(fid_keys, 0, SEEK_CUR); - } - if (fpos_values == -1) // Load old key from index file + if (update) + rv = false; + else // insert { + evict(); + off_t fpos_keys = lseek(fid_keys, 0, SEEK_END); + off_t fpos_values = index_end_marker; + //size_t sz; fpos_values = lseek(fid_values, 0, SEEK_END); values.push_front({val, fpos_values, 0}); keys.push_front({key, fpos_keys, values.begin()}); x = xref.insert_or_assign(key, keys.begin()).first; branch = "Add"; entries++; - } - else - { - values.push_front({val, fpos_values, sz}); - keys.push_front({buf, fpos_keys, values.begin()}); - x = xref.insert_or_assign(key, keys.begin()).first; - branch = "Fill"; + inserts++; } } else { branch = "Overwrite"; overwrite = true; + if (update) + updates++; + else + rv = false; } - Value& oldv = *x->second->it_value; - if (overwrite && val == oldv.text) - branch = "ignore"; - else + if (rv && x != xref.end()) { - auto sz = oldv.sz; - bool reuse_value_space = val.length() <= sz; - off_t fpos_values = 0; - if (reuse_value_space) + Value& oldv = *x->second->it_value; + if (overwrite && val == oldv.text) + branch = "ignore"; + else { - gaps += sz-val.length(); - fpos_values = oldv.fpos; + auto sz = oldv.sz; + bool reuse_value_space = val.length() <= sz; + off_t fpos_values = 0; + if (reuse_value_space) + { + spaces += sz-val.length(); + fpos_values = oldv.fpos; + } + else + spaces += sz; + sz = val.length(); + fpos_values = lseek(fid_values, fpos_values, reuse_value_space ? SEEK_SET : SEEK_END); + if (write(fid_values, val.c_str(), val.length()) != (ssize_t)val.length()) + problems |= (1<<0); // Cannot write to values file + values.erase(x->second->it_value); + values.push_front({val, fpos_values, sz}); + sprintf(buf, "%s,%jd,%zu,", key.c_str(), fpos_values, sz); + auto len = strlen(buf); + auto fpos_keys = x->second->fpos; + lseek(fid_keys, x->second->fpos, SEEK_SET); + if (write(fid_keys, buf, len) != (ssize_t)len) + problems |= (1<<1); // Cannot write to keys file + len = sizeof(buf)-1-len-1; + sprintf(buf, "%*c\n", int(len), ' '); + len++; + if (write(fid_keys, buf, len) != (ssize_t)len) + problems |= (1<<2); // Cannot write to keys file + keys.erase(x->second); + keys.push_front({key, fpos_keys, values.begin()}); + x->second = keys.begin(); } - else - gaps += sz; - sz = val.length(); - fpos_values = lseek(fid_values, fpos_values, reuse_value_space ? SEEK_SET : SEEK_END); - if (write(fid_values, val.c_str(), val.length()) != (ssize_t)val.length()) - problems |= 1; // Cannot write to values file - values.erase(x->second->it_value); - values.push_front({val, fpos_values, sz}); - sprintf(buf, "%s,%jd,%zu,", key.c_str(), fpos_values, sz); - auto len = strlen(buf); - auto fpos_keys = x->second->fpos; - lseek(fid_keys, x->second->fpos, SEEK_SET); - if (write(fid_keys, buf, len) != (ssize_t)len) - problems |= 2; // Cannot write to keys file - len = sizeof(buf)-1-len-1; - sprintf(buf, "%*c\n", int(len), ' '); - len++; - if (write(fid_keys, buf, len) != (ssize_t)len) - problems |= 2; // Cannot write to keys file - keys.erase(x->second); - keys.push_front({key, fpos_keys, values.begin()}); - x->second = keys.begin(); } } if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("set: {:} {:} {:} problems: {:}", branch, key, val, problems); + applog.info("set: {:} {:} {:} problems: {:}, result: {:}", branch, key, val, problems, rv); + return rv; } -} table {"table_"}; -size_t Table::max_cache = 2; - - -class HelpHandle : public httpd::handler_base { -public: - bool plain_text; - HelpHandle(bool plain_text) : plain_text(plain_text) {} - virtual future > handle(const sstring& path, - std::unique_ptr req, std::unique_ptr rep) { - rep->_content = plain_text ? - "hello\nfrom db_demo!" : - "hello
from db_demo!"; - rep->done(plain_text ? "plain" : "html"); - return make_ready_future>(std::move(rep)); + operator sstring() const + { + return sstring(VERSION) + "\n" + + "table:" + name + "\n" + + Stats::operator::sstring() + + format( + "index entries:{}\n" + "cache_entries:{}\n" + "value spaces:{}\n", + entries, + xref.size(), + spaces + ); } -}; - -void set_routes(routes& r) { - function_handler* h1 = new function_handler([](const_req req) { - auto key = req.query_parameters.contains("key") ? req.query_parameters.at("key") : ""; - auto value = req.query_parameters.contains("value") ? req.query_parameters.at("value") : ""; - auto op = req.query_parameters.contains("op") ? req.query_parameters.at("op") : ""; - if (op=="list") - value = table.list(); - else if (op=="invalidate") - table.purge(false); - else if (op=="compact") - table.compact(); - else if (op=="insert") + static auto selftest(int level) + { + bool ok = true; + std::string s; + s += format("Starting self test {}\n", level); + auto table_name = std::string(Table::master_table_name); + s += "Dropping & using {}\n" + table_name; + auto it_table = tables.find(table_name); + if (it_table == tables.end()) + { + it_table = tables.emplace(table_name, new Table(table_name)).first; + auto &table = *it_table->second; + s += "Using table " + table_name + ".\n"; + s += table.purge(true); + s += table.close(true); + Table::tables.erase(it_table); + s += "Dropping table " + table_name + ".\n"; + it_table = tables.emplace(table_name, new Table(table_name)).first; + s += "(Re)create table " + table_name + ".\n"; + } + auto &table = *it_table->second; + std::string keys[] = {"aaa", "bbb", "ccc", "null"}; + std::string values0[] = {"test_aaa\n", "test_bbb\n", "test_ccc\n", ""}; + for (int i=0; auto key : keys) + if (auto value = values0[i++]; !table.set(key, value, false)) // insert + { + s += format("Failed to insert {}={}\n", key, value); + ok = false; + } + for (int i=0; auto key : keys) { - table.set(key, value); - table.inserts++; + std::string value; + if (!table.get(key, value).found) // read + { + s += format("Failed to retrieve {}\n", key); + ok = false; + } + if (value!=values0[i]) + { + s += format("Unexpected value for key {}={} <> {}\n", key, value, values0[i]); + ok = false; + } + i++; } - else if (op=="purge") + for (int i=0; auto key : keys) + if (auto value = values0[i++]; table.set(key, value, false)) // overinsert + { + s += format("Failed to prevent overinsertion on pre-existing key {}={}\n", key, value); + ok = false; + } + std::string values1[] = {"test_AAAA\n", "test_BBB\n", "test_CC\n", "text_NotNull\n"}; + for (int i=0; auto key : keys) + if (auto value = values1[i++]; !table.set(key, value, true)) // update + { + s += format("Failed to update existing key {}={}\n", key, value); + ok = false; + } + if (auto key = "ddd", value="text_ddd"; table.set(key, value, true)) // update inexistent key { - table.purge(true); - table.deletes++; + s += format("Failed to prevent updating of inexistent key {}={}\n", key, value); + ok = false; } - else if (op=="delete") + for (int i=0; auto key : keys) { - table.get(key, true); - table.deletes++; + if (std::string value; !table.get(key, value).found || value!=values1[i]) + { + s += format("Unexpected value for key {}={}, expected {}\n", key, value, values1[i]); + ok = false; + } + i++; } - else if (op=="update") + if (table.spaces==0) + s += format("Table {} expected to have {} internal fragmentation\n", table.name, "non-zero"); + + s += table.compact(); // Compacting must reorder the values file. + + for (int i=0; auto key : keys) { - table.set(key, value); - table.updates++; + if (std::string value; !table.get(key, value, false, true).found) // delete + { + s += format("Delete failed for key {}={}, expected {}\n", key, value, values1[i]); + ok = false; + } + i++; + break; // do just one delete } - else // any other op is a read + + s += table.compact(); // Compacting remove all index entries marked as "deleted" and reorders the value file. + + if (auto count = sizeof(keys)/sizeof(keys[0]) - 1; table.entries != count) { - value = table.get(key); - table.queries++; + s += format("Unexpected number of keys in table {}: {}, expected {}\n", table.name, table.entries, count); + ok = false; } - std::string s = format("DB request {}", table.ops++); - s += " op=" + op + " " + key + "=" + value; - if (trace_level & (1 << ETrace::SERVER)) - applog.info("{:}", s); + + s += table.list(true); // revolve though index keys once + + s += format("Self test {} {}\n", level, ok ? "passed" : "failed"); return s; - }); - function_handler* h2 = new function_handler([](const_req req) { - auto ss = format( - "Stats:{}, " - "Entries:{}, " - "cachesz:{}, " - "Gaps:{}, " - "LockPasses:{}, " - "LockCollisions:{} " - , - (sstring)table, - table.entries, - table.xref.size(), - table.gaps, - Lock::passes, - Lock::collisions - ); - if (trace_level & (1 << ETrace::SERVER)) - applog.info("{:}", ss); - return ss; - }); - function_handler* h3 = new function_handler([](const_req req) { - std::string s; - if (req.query_parameters.contains("trace_level")) + } + +private: + constexpr static size_t key_len = 256+1 +20+10+1+1; // key,int64,int32\n0 + constexpr static int index_end_marker = -1; + constexpr static int index_deleted_marker = -2; + + std::atomic_bool lock = false; + int fid_keys{0}; + int fid_values{0}; + size_t entries{0}; + size_t spaces{0}; + std::deque values; + std::deque keys; + std::map::iterator> xref; +}; +std::map Table::tables; +std::atomic_bool tables_lock = false; + +class DefaultHandle : public httpd::handler_base { +public: + bool plain_text; + DefaultHandle(bool plain_text) : plain_text(plain_text) {} + auto build_help(sstring url, sstring host, sstring table_name) + { + sstring s; + s += plain_text ? + format("{:}.{:}\n", VERSION) + + format("Global commands\n") + : + sstring("

") + VERSION + "

\n" + + "\n\n\n\n\n" + + sstring("

Global commands:

\n

"); + struct {const char*label, *str; } args_global[] = + { + {"QUIT", "quit"}, + {"trace level all ON", "?trace_level=1111"}, + {"trace level all OFF", "?trace_level=0000"}, + {"list tables in use", "?used"}, + }; + for (auto arg : args_global) + s += plain_text ? + format("{:}: {:}/{:}\n", arg.label, host, arg.str) : + sstring("") + arg.label + ": " + host + "/" + arg.str + "
\n"; + s += plain_text ? + format("Commands for table: {:}\n", table_name) : + sstring("

\n

Commands for table: " + table_name + " 

\n" + "For any of the following commands to work, a table must be created, or opened if it exists, with the ?use REST command.\n" + "

"); + struct {const char*label, *str; } args_per_table[] = { - auto level = req.query_parameters.at("trace_level"); + {"use/create table", "?use"}, + {"change to table Master", "/"}, + {"change to table People", "People/"}, + {"change to table Places", "Places/"}, + {"stats", "?stats"}, + {"config max_cache", "?max_cache=2"}, + {"config max_cache", "?max_cache=1000"}, + {"purge cache & files", "?purge"}, + {"drop table", "?drop"}, + {"compact data files", "?compact"}, + {"invalidate cache", "?invalidate"}, + {"list cached keys/vals", "?key="}, + {"list all keys", "?list"}, + {"row next", "?rownext"}, + {"row next", "?rownext"}, + {"insert aaa=text_aaa", "?op=insert&key=aaa&value=text_aaa%0A"}, + {"insert bbb=text_bbb", "?op=insert&key=bbb&value=text_bbb%0A"}, + {"insert ccc=text_ccc", "?op=insert&key=ccc&value=text_ccc%0A"}, + {"insert null=NULL", "?op=insert&key=null&value="}, + {"query aaa", "?key=aaa"}, + {"query bbb", "?key=bbb"}, + {"query ccc", "?key=ccc"}, + {"query null", "?key=null"}, + {"update aaa=text_aaaa", "?op=update&key=aaa&value=text_aaaa%0A"}, + {"update bbb=text_BBB", "?op=update&key=bbb&value=text_BBB%0A"}, + {"update ccc=text_cc", "?op=update&key=ccc&value=text_cc%0A"}, + {"update null=text_nonnull","?op=update&key=null&value=text_nonnull%0A"}, + {"delete aaa", "?op=delete&key=aaa"}, + {"delete bbb", "?op=delete&key=bbb"}, + {"delete ccc", "?op=delete&key=ccc"}, + {"delete null", "?op=delete&key=null"}, + }; + for (int i=0; auto arg : args_per_table) + { + i++; + if ((i==2 && table_name==Table::master_table_name) || + (i>2 && i<5 && table_name!=Table::master_table_name)) + continue; + auto surl = url; + if (i==2 && table_name!=Table::master_table_name) + { + auto sl = strrchr(url.c_str(),'/'); + auto tmp = url.substr(0, sl-url.c_str()); + sl = strrchr(tmp.c_str(),'/'); + surl = tmp.substr(0, sl-tmp.c_str()); + } + s += plain_text ? + format("{:}: {:}/{:}\n", arg.label, surl, arg.str) : + sstring("") + arg.label + ": " + arg.str + "
\n"; + } + struct {const char*label, *str; } args_tests[] = + { + {"simple insert/update/delete", "?selftest=0"}, + {"poop insert/update/delete", "?selftest=1"}, + }; + s += plain_text ? + format("Self tests:\n") : + sstring("

\n

Self tests:"" 

\n"); + for (auto arg : args_tests) + s += plain_text ? + format("{:}: {:}/{:}\n", arg.label, host, arg.str) : + sstring("") + arg.label + ": " + arg.str + "
\n"; + s += plain_text ? + "" : + "

\n"; + return s; + } + virtual future > handle(const sstring& path, + std::unique_ptr req, std::unique_ptr rep) + { + auto host = req->get_protocol_name() + "://" + req->get_header("Host"); + auto url = req->get_url(); + auto table_name = url.substr(host.length()+1); + auto fsl = (int)table_name.find('/', 0); + if (fsl>0) + table_name = table_name.substr(0,fsl); + else + table_name = Table::master_table_name; + sstring s = ""; + bool plain = plain_text; + auto it_table = Table::tables.end(); + if (req->query_parameters.size()==0) // HELP + s += build_help(url, host, table_name); + else if (req->query_parameters.contains("trace_level")) + { + auto level = req->query_parameters.at("trace_level"); int old_trace_level = trace_level; int new_trace_level = 0; std::string old_tl = ""; @@ -562,24 +929,124 @@ void set_routes(routes& r) { } s = format("Changing trace_level from {} to {}", old_tl, new_tl); trace_level = new_trace_level; + plain = true; } - if (req.query_parameters.contains("max_cache")) + else if (req->query_parameters.contains("use")) { - auto val = req.query_parameters.at("max_cache"); - int old_max_cache = Table::max_cache; - int new_max_cache; - sscanf("%d", val.c_str(), &new_max_cache); - if (new_max_cache>=0) + Lock l(tables_lock); + it_table = Table::tables.find(table_name); + if (it_table == Table::tables.end()) { - table.purge(false); - Table::max_cache = new_max_cache; + auto & table = *(Table::tables.emplace(table_name, new Table(table_name)).first->second); + s += "Created table " + table_name + ".\n"; } - s = format("Changing max_cache from {:} to {:}", old_max_cache, new_max_cache); } - if ((int)trace_level & (1 << ETrace::SERVER)) - applog.info("{:}", s); - return s; - }); + else if (req->query_parameters.contains("used")) + { + Lock l(tables_lock); + for (auto t : Table::tables) s += t.first + "\n"; + } + else if (req->query_parameters.contains("selftest")) + { + auto level = req->query_parameters.at("selftest"); + int l; + sscanf(level.c_str(),"%d", &l); + std::string result = Table::selftest(l); + std::string::size_type n = 0; + const std::string rwhat = "\n"; + const std::string rwith = "
\n"; + while ((n = result.find(rwhat, n)) != std::string::npos) + { + result.replace( n, rwhat.size(), rwith); + n += rwith.size(); + } + s += result; + } + else + { + { + Lock l(tables_lock); + it_table = Table::tables.find(table_name); + if (it_table == Table::tables.end()) + s += "Table " + table_name + " is not in use.\n"; + } + std::string new_val; + if (it_table != Table::tables.end()) + { + auto &table = *it_table->second; + if (req->query_parameters.contains("list")) + s = table.list(false); + else if (req->query_parameters.contains("invalidate")) + s = table.purge(false); + else if (req->query_parameters.contains("compact")) + s = table.compact(); + else if (req->query_parameters.contains("purge")) + s = table.purge(true); + else if (req->query_parameters.contains("stats")) + s += sstring(s.length() > 0 ? "\n" : "") + format( + "{}" + "LockPasses:{}\n" + "LockCollisions:{}\n" + , + (sstring)table, + Lock::passes, + Lock::collisions); + else if (req->query_parameters.contains("drop")) + { + s += table.purge(true); + s += table.close(true); + Table::tables.erase(it_table); + } + else if (req->query_parameters.contains("max_cache")) + { + auto val = req->query_parameters.at("max_cache"); + int old_max_cache = table.max_cache; + int new_max_cache; + sscanf(val.c_str(), "%d", &new_max_cache); + if (new_max_cache>=0) + { + table.purge(false); + table.max_cache = new_max_cache; + } + s += sstring(s.length() > 0 ? "\n" : "") + format( + "Changing max_cache from {:} to {:}", old_max_cache, new_max_cache); + } + else if (req->query_parameters.contains("rownext")) + { + auto [index, key, fpos, sz] = table.co_index_locked(); + s = format("test index {:}, key:{:}, valpos:{:}, valsz:{:}", index, key, fpos, sz); + } + else if (req->query_parameters.contains("op")) + { + auto op = req->query_parameters.at("op"); + auto key = req->query_parameters.contains("key") ? req->query_parameters.at("key") : ""; + auto value = req->query_parameters.contains("value") ? req->query_parameters.at("value") : ""; + if (op=="insert") + s = table.set(key, value, false) ? "ok" : "fail"; + else if (op=="update") + s = table.set(key, value, true) ? "ok" : "fail"; + else if (op=="delete") + s = table.get(key, new_val, false, true).found ? sstring(new_val) : format("Key {} not found", key); + else // any other op is a key read + s = table.get(key, new_val).found ? sstring(new_val) : format("Key {} not found", key); + } + else if (req->query_parameters.contains("key")) + { + auto key = req->query_parameters.at("key"); + s = table.get(key, new_val).found ? sstring(new_val) : format("Key {} not found", key); + } + } + if (trace_level & (1 << ETrace::SERVER)) + applog.info("DB request {} on table {}, {}", Stats::requests++, table_name, s); + plain = true; + } + rep->_content = s; + rep->done(plain ? "plain" : "html"); + return make_ready_future>(std::move(rep)); + } +} defaultHandle(false); + +void set_routes(routes& r) { function_handler* h4 = new function_handler([](const_req req) { std::string s = "Server shutting down"; exit(0); @@ -587,17 +1054,13 @@ void set_routes(routes& r) { applog.info("{:}", s); return s; }); - r.add(operation_type::GET, url("/"), h1); - r.add(operation_type::GET, url("/stats"), h2); - r.add(operation_type::GET, url("/config"), h3); + r.add_default_handler(&defaultHandle); r.add(operation_type::GET, url("/quit"), h4); - r.add(operation_type::GET, url("/help"), new HelpHandle(false)); - r.add(operation_type::GET, url("/help_plain"), new HelpHandle(true)); r.add(operation_type::GET, url("/file").remainder("path"), new directory_handler("/")); } int main(int ac, char** av) { - applog.info("Db demo {:}", table.version); + applog.info("Db demo {:}", VERSION); httpd::http_server_control prometheus_server; prometheus::config pctx; app_template app; From a2412802bfb27557f3b47239bed3f87e7c2da4cf Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Sat, 13 Apr 2024 23:27:09 +0300 Subject: [PATCH 07/19] Added REST API to read the keys and values files. Rethinking locking. Closes issue: #14. --- demos/db_demo.cc | 50 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/demos/db_demo.cc b/demos/db_demo.cc index bf90cfbd475..db0aff15264 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -266,7 +266,7 @@ struct Table : Stats { } std::string purge(bool files) { - Lock l(lock); + Lock l(lock_cache); values.clear(); keys.clear(); xref.clear(); @@ -289,7 +289,7 @@ struct Table : Stats { } std::string compact() { - Lock l(lock); + Lock l(lock_cache); std::string s = purge(false); int problems = 0; auto fid_temp = open((db_prefix+name+compact_fname).c_str(), O_CREAT | O_TRUNC | O_RDWR /*| O_TMPFILE*/, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); @@ -392,7 +392,7 @@ struct Table : Stats { { char buf[key_len]; { - Lock l(lock, locked); + Lock l(lock_cache, locked); lseek(fid_keys, fpos, SEEK_SET); auto len = read(fid_keys, buf, sizeof(buf)-1); if (len==0) @@ -454,9 +454,9 @@ struct Table : Stats { applog.info("list: {:}", s); return s; } - auto get(std::string key, std::string &value, bool reentered=false, bool remove=false) + auto get(const std::string &key, std::string &value, bool reentered=false, bool remove=false) { - Lock l(lock, reentered); + Lock l(lock_cache, reentered); auto x = xref.begin(); int problems = 0; char buf[key_len]; @@ -565,10 +565,10 @@ struct Table : Stats { struct RV{bool found; decltype(x) it; }; return RV{x != xref.end(), x}; } - bool set(std::string key, std::string val, bool update) + bool set(const std::string &key, const std::string &val, bool update) { bool rv = true; - Lock l(lock, false); + Lock l(lock_cache, false); std::string old_val; auto [found, x] = get(key, old_val, true); int problems = 0; @@ -657,9 +657,15 @@ struct Table : Stats { format( "index entries:{}\n" "cache_entries:{}\n" + "lock_cache:{}\n" + "lock_fio:{}\n" + "readers:{}\n" "value spaces:{}\n", entries, xref.size(), + lock_cache, + lock_fio, + readers, spaces ); } @@ -763,13 +769,28 @@ struct Table : Stats { s += format("Self test {} {}\n", level, ok ? "passed" : "failed"); return s; } - + bool get_file(std::string &val, bool keys) + { + auto fid = keys ? fid_keys : fid_values; + if (fid<=0) + return false; + Lock l(lock_fio); + auto sz = lseek(fid, 0, SEEK_END); + if (sz<0) + return false; + val.resize(sz); + lseek(fid, 0, SEEK_SET); + return ::read(fid, (char*)val.c_str(), sz) == sz; + } private: constexpr static size_t key_len = 256+1 +20+10+1+1; // key,int64,int32\n0 constexpr static int index_end_marker = -1; constexpr static int index_deleted_marker = -2; - std::atomic_bool lock = false; + std::atomic_bool lock_fio = false; // file lock: mutually exclussive readers and writers + std::atomic_bool lock_cache = false; // cache lock: shared readers, exclusive writers + std::atomic_int readers = 0; // count of concurrent readers + int fid_keys{0}; int fid_values{0}; size_t entries{0}; @@ -850,6 +871,8 @@ class DefaultHandle : public httpd::handler_base { {"delete bbb", "?op=delete&key=bbb"}, {"delete ccc", "?op=delete&key=ccc"}, {"delete null", "?op=delete&key=null"}, + {"view keys file", "?file=keys"}, + {"view values file", "?file=values"}, }; for (int i=0; auto arg : args_per_table) { @@ -1011,6 +1034,15 @@ class DefaultHandle : public httpd::handler_base { s += sstring(s.length() > 0 ? "\n" : "") + format( "Changing max_cache from {:} to {:}", old_max_cache, new_max_cache); } + else if (req->query_parameters.contains("file")) + { + auto val = req->query_parameters.at("file"); + std::string text; + if (table.get_file(text, val=="keys")) + s += text; + else + s += format("Error reading {} file", val); + } else if (req->query_parameters.contains("rownext")) { auto [index, key, fpos, sz] = table.co_index_locked(); From 3315c0125ad8b61a2599a290044cde577b258595 Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Sat, 13 Apr 2024 23:42:22 +0300 Subject: [PATCH 08/19] Removed files that shouldn't be in the sources of SeaStar. --- .kdev4/seastar.kdev4 | 171 ------------- db_simple.pro | 520 -------------------------------------- db_simple.pro.user | 266 ------------------- demos/http_client_demo.cc | 20 +- demos/tcp_demo.cc | 2 +- rest.cmd | 48 ---- seastar.kdev4 | 4 - 7 files changed, 9 insertions(+), 1022 deletions(-) delete mode 100644 .kdev4/seastar.kdev4 delete mode 100644 db_simple.pro delete mode 100644 db_simple.pro.user delete mode 100755 rest.cmd delete mode 100644 seastar.kdev4 diff --git a/.kdev4/seastar.kdev4 b/.kdev4/seastar.kdev4 deleted file mode 100644 index b8298aa8a5d..00000000000 --- a/.kdev4/seastar.kdev4 +++ /dev/null @@ -1,171 +0,0 @@ -[Buildset] -BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r) - -[CMake] -Build Directory Count=1 -Current Build Directory Index-Host System=0 - -[CMake][CMake Build Directory 0] -Build Directory Path=/home/DEV/seastar/build2 -Build Type=Debug -CMake Binary=/usr/bin/cmake -CMake Executable=/usr/bin/cmake -Environment Profile= -Extra Arguments= -Install Directory=/usr/local -Runtime=Host System - -[Launch] -Launch Configurations=Launch Configuration 0,Launch Configuration 1,Launch Configuration 2,Launch Configuration 3,Launch Configuration 4,Launch Configuration 5,Launch Configuration 6 - -[Launch][Launch Configuration 0] -Configured Launch Modes=execute -Configured Launchers=nativeAppLauncher -Name=demo_http_client -Type=Native Application - -[Launch][Launch Configuration 0][Data] -Arguments= -Debugger Shell= -Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00 \x00d\x00e\x00m\x00o\x00_\x00h\x00t\x00t\x00p\x00_\x00c\x00l\x00i\x00e\x00n\x00t) -Dependency Action=Build -Display Demangle Names=true -Display Static Members=false -EnvironmentGroup= -Executable=file:///home/DEV/seastar -External Terminal=konsole --noclose --workdir %workdir -e %exe -GDB Path= -Kill Before Executing Again=4194304 -Project Target=seastar,demos,demo_http_client -Remote GDB Config Script= -Remote GDB Run Script= -Remote GDB Shell Script= -Start With=ApplicationOutput -Use External Terminal=false -Working Directory= -isExecutable=false - -[Launch][Launch Configuration 1] -Configured Launch Modes=execute -Configured Launchers=nativeAppLauncher -Name=demo_hello-world -Type=Native Application - -[Launch][Launch Configuration 1][Data] -Arguments= -Debugger Shell= -Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00 \x00d\x00e\x00m\x00o\x00_\x00h\x00e\x00l\x00l\x00o\x00-\x00w\x00o\x00r\x00l\x00d) -Dependency Action=Build -Display Demangle Names=true -Display Static Members=true -EnvironmentGroup= -Executable=file:///home/DEV/seastar -External Terminal=konsole --noclose --workdir %workdir -e %exe -GDB Path= -Kill Before Executing Again=4194304 -Project Target=seastar,demos,demo_hello-world -Remote GDB Config Script= -Remote GDB Run Script= -Remote GDB Shell Script= -Start With=ApplicationOutput -Use External Terminal=false -Working Directory=file:///home/DEV/seastar/build2/temp -isExecutable=false - -[Launch][Launch Configuration 2] -Configured Launch Modes=execute -Configured Launchers=nativeAppLauncher -Name=demo_tcp -Type=Native Application - -[Launch][Launch Configuration 2][Data] -Arguments= -Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00\x10\x00d\x00e\x00m\x00o\x00_\x00t\x00c\x00p) -Dependency Action=Build -EnvironmentGroup= -Executable=file:///home/DEV/seastar -External Terminal=konsole --noclose --workdir %workdir -e %exe -Kill Before Executing Again=4194304 -Project Target=seastar,demos,demo_tcp -Use External Terminal=false -Working Directory= -isExecutable=false - -[Launch][Launch Configuration 3] -Configured Launch Modes=execute -Configured Launchers=nativeAppLauncher -Name=demo_echo -Type=Native Application - -[Launch][Launch Configuration 3][Data] -Arguments= -Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00\x12\x00d\x00e\x00m\x00o\x00_\x00e\x00c\x00h\x00o) -Dependency Action=Build -EnvironmentGroup= -Executable=file:///home/DEV/seastar -External Terminal=konsole --noclose --workdir %workdir -e %exe -Kill Before Executing Again=4194304 -Project Target=seastar,demos,demo_echo -Use External Terminal=false -Working Directory= -isExecutable=false - -[Launch][Launch Configuration 4] -Configured Launch Modes=execute -Configured Launchers=nativeAppLauncher -Name=demo_tls_echo_server -Type=Native Application - -[Launch][Launch Configuration 4][Data] -Arguments= -Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00(\x00d\x00e\x00m\x00o\x00_\x00t\x00l\x00s\x00_\x00e\x00c\x00h\x00o\x00_\x00s\x00e\x00r\x00v\x00e\x00r) -Dependency Action=Build -EnvironmentGroup= -Executable=file:///home/DEV/seastar -External Terminal=konsole --noclose --workdir %workdir -e %exe -Kill Before Executing Again=4194304 -Project Target=seastar,demos,demo_tls_echo_server -Use External Terminal=false -Working Directory= -isExecutable=false - -[Launch][Launch Configuration 5] -Configured Launch Modes=execute -Configured Launchers=nativeAppLauncher -Name=app_httpd -Type=Native Application - -[Launch][Launch Configuration 5][Data] -Arguments= -Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x04\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\x08\x00a\x00p\x00p\x00s\x00\x00\x00\n\x00h\x00t\x00t\x00p\x00d\x00\x00\x00\x12\x00a\x00p\x00p\x00_\x00h\x00t\x00t\x00p\x00d) -Dependency Action=Build -EnvironmentGroup= -Executable=file:///home/DEV/seastar -External Terminal=konsole --noclose --workdir %workdir -e %exe -Kill Before Executing Again=4194304 -Project Target=seastar,apps,httpd,app_httpd -Use External Terminal=false -Working Directory= -isExecutable=false - -[Launch][Launch Configuration 6] -Configured Launch Modes=execute -Configured Launchers=nativeAppLauncher -Name=demo_db -Type=Native Application - -[Launch][Launch Configuration 6][Data] -Arguments= -Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x03\x00\x00\x00\x0e\x00s\x00e\x00a\x00s\x00t\x00a\x00r\x00\x00\x00\n\x00d\x00e\x00m\x00o\x00s\x00\x00\x00\x0e\x00d\x00e\x00m\x00o\x00_\x00d\x00b) -Dependency Action=Build -EnvironmentGroup= -Executable=file:///home/DEV/seastar -External Terminal=konsole --noclose --workdir %workdir -e %exe -Kill Before Executing Again=4194304 -Project Target=seastar,demos,demo_db -Use External Terminal=false -Working Directory= -isExecutable=false - -[Project] -VersionControlSupport=kdevgit diff --git a/db_simple.pro b/db_simple.pro deleted file mode 100644 index dba09dada30..00000000000 --- a/db_simple.pro +++ /dev/null @@ -1,520 +0,0 @@ -# Created by and for Qt Creator This file was created for editing the project sources only. -# You may attempt to use it for building too, by modifying this file here. - -#TARGET = db_simple - -QT = core gui widgets - -HEADERS = \ - $$PWD/apps/lib/stop_signal.hh \ - $$PWD/apps/memcached/memcached.hh \ - $$PWD/build/debug/apps/httpd/demo.json.hh \ - $$PWD/build/debug/apps/memcached/ascii.hh \ - $$PWD/build/debug/gen/include/seastar/http/chunk_parsers.hh \ - $$PWD/build/debug/gen/include/seastar/http/request_parser.hh \ - $$PWD/build/debug/gen/include/seastar/http/response_parser.hh \ - $$PWD/build/debug/gen/src/proto/metrics2.pb.h \ - $$PWD/build/release/apps/httpd/demo.json.hh \ - $$PWD/build/release/apps/memcached/ascii.hh \ - $$PWD/build/release/gen/include/seastar/http/chunk_parsers.hh \ - $$PWD/build/release/gen/include/seastar/http/request_parser.hh \ - $$PWD/build/release/gen/include/seastar/http/response_parser.hh \ - $$PWD/build/release/gen/src/proto/metrics2.pb.h \ - $$PWD/build2/apps/httpd/demo.json.hh \ - $$PWD/build2/apps/memcached/ascii.hh \ - $$PWD/build2/gen/include/seastar/http/chunk_parsers.hh \ - $$PWD/build2/gen/include/seastar/http/request_parser.hh \ - $$PWD/build2/gen/include/seastar/http/response_parser.hh \ - $$PWD/build2/gen/src/proto/metrics2.pb.h \ - $$PWD/demos/tls_echo_server.hh \ - $$PWD/include/seastar/core/internal/api-level.hh \ - $$PWD/include/seastar/core/internal/buffer_allocator.hh \ - $$PWD/include/seastar/core/internal/estimated_histogram.hh \ - $$PWD/include/seastar/core/internal/io_desc.hh \ - $$PWD/include/seastar/core/internal/io_intent.hh \ - $$PWD/include/seastar/core/internal/io_request.hh \ - $$PWD/include/seastar/core/internal/io_sink.hh \ - $$PWD/include/seastar/core/internal/poll.hh \ - $$PWD/include/seastar/core/internal/pollable_fd.hh \ - $$PWD/include/seastar/core/internal/read_state.hh \ - $$PWD/include/seastar/core/internal/run_in_background.hh \ - $$PWD/include/seastar/core/internal/stall_detector.hh \ - $$PWD/include/seastar/core/internal/uname.hh \ - $$PWD/include/seastar/core/abort_on_ebadf.hh \ - $$PWD/include/seastar/core/abort_on_expiry.hh \ - $$PWD/include/seastar/core/abort_source.hh \ - $$PWD/include/seastar/core/abortable_fifo.hh \ - $$PWD/include/seastar/core/alien.hh \ - $$PWD/include/seastar/core/align.hh \ - $$PWD/include/seastar/core/aligned_buffer.hh \ - $$PWD/include/seastar/core/app-template.hh \ - $$PWD/include/seastar/core/array_map.hh \ - $$PWD/include/seastar/core/bitops.hh \ - $$PWD/include/seastar/core/bitset-iter.hh \ - $$PWD/include/seastar/core/byteorder.hh \ - $$PWD/include/seastar/core/cacheline.hh \ - $$PWD/include/seastar/core/checked_ptr.hh \ - $$PWD/include/seastar/core/chunked_fifo.hh \ - $$PWD/include/seastar/core/circular_buffer.hh \ - $$PWD/include/seastar/core/circular_buffer_fixed_capacity.hh \ - $$PWD/include/seastar/core/condition-variable.hh \ - $$PWD/include/seastar/core/coroutine.hh \ - $$PWD/include/seastar/core/deleter.hh \ - $$PWD/include/seastar/core/distributed.hh \ - $$PWD/include/seastar/core/do_with.hh \ - $$PWD/include/seastar/core/dpdk_rte.hh \ - $$PWD/include/seastar/core/enum.hh \ - $$PWD/include/seastar/core/exception_hacks.hh \ - $$PWD/include/seastar/core/execution_stage.hh \ - $$PWD/include/seastar/core/expiring_fifo.hh \ - $$PWD/include/seastar/core/fair_queue.hh \ - $$PWD/include/seastar/core/file-types.hh \ - $$PWD/include/seastar/core/file.hh \ - $$PWD/include/seastar/core/fsnotify.hh \ - $$PWD/include/seastar/core/fsqual.hh \ - $$PWD/include/seastar/core/fstream.hh \ - $$PWD/include/seastar/core/function_traits.hh \ - $$PWD/include/seastar/core/future-util.hh \ - $$PWD/include/seastar/core/future.hh \ - $$PWD/include/seastar/core/gate.hh \ - $$PWD/include/seastar/core/idle_cpu_handler.hh \ - $$PWD/include/seastar/core/io_intent.hh \ - $$PWD/include/seastar/core/io_priority_class.hh \ - $$PWD/include/seastar/core/io_queue.hh \ - $$PWD/include/seastar/core/iostream-impl.hh \ - $$PWD/include/seastar/core/iostream.hh \ - $$PWD/include/seastar/core/layered_file.hh \ - $$PWD/include/seastar/core/linux-aio.hh \ - $$PWD/include/seastar/core/loop.hh \ - $$PWD/include/seastar/core/lowres_clock.hh \ - $$PWD/include/seastar/core/make_task.hh \ - $$PWD/include/seastar/core/manual_clock.hh \ - $$PWD/include/seastar/core/map_reduce.hh \ - $$PWD/include/seastar/core/memory.hh \ - $$PWD/include/seastar/core/metrics.hh \ - $$PWD/include/seastar/core/metrics_api.hh \ - $$PWD/include/seastar/core/metrics_registration.hh \ - $$PWD/include/seastar/core/metrics_types.hh \ - $$PWD/include/seastar/core/on_internal_error.hh \ - $$PWD/include/seastar/core/pipe.hh \ - $$PWD/include/seastar/core/polymorphic_temporary_buffer.hh \ - $$PWD/include/seastar/core/posix.hh \ - $$PWD/include/seastar/core/preempt.hh \ - $$PWD/include/seastar/core/prefetch.hh \ - $$PWD/include/seastar/core/print.hh \ - $$PWD/include/seastar/core/prometheus.hh \ - $$PWD/include/seastar/core/queue.hh \ - $$PWD/include/seastar/core/ragel.hh \ - $$PWD/include/seastar/core/reactor.hh \ - $$PWD/include/seastar/core/reactor_config.hh \ - $$PWD/include/seastar/core/relabel_config.hh \ - $$PWD/include/seastar/core/report_exception.hh \ - $$PWD/include/seastar/core/resource.hh \ - $$PWD/include/seastar/core/rwlock.hh \ - $$PWD/include/seastar/core/scattered_message.hh \ - $$PWD/include/seastar/core/scheduling.hh \ - $$PWD/include/seastar/core/scheduling_specific.hh \ - $$PWD/include/seastar/core/scollectd.hh \ - $$PWD/include/seastar/core/scollectd_api.hh \ - $$PWD/include/seastar/core/seastar.hh \ - $$PWD/include/seastar/core/semaphore.hh \ - $$PWD/include/seastar/core/shard_id.hh \ - $$PWD/include/seastar/core/sharded.hh \ - $$PWD/include/seastar/core/shared_future.hh \ - $$PWD/include/seastar/core/shared_mutex.hh \ - $$PWD/include/seastar/core/shared_ptr.hh \ - $$PWD/include/seastar/core/shared_ptr_debug_helper.hh \ - $$PWD/include/seastar/core/shared_ptr_incomplete.hh \ - $$PWD/include/seastar/core/simple-stream.hh \ - $$PWD/include/seastar/core/slab.hh \ - $$PWD/include/seastar/core/sleep.hh \ - $$PWD/include/seastar/core/smp.hh \ - $$PWD/include/seastar/core/smp_options.hh \ - $$PWD/include/seastar/core/sstring.hh \ - $$PWD/include/seastar/core/stall_sampler.hh \ - $$PWD/include/seastar/core/stream.hh \ - $$PWD/include/seastar/core/systemwide_memory_barrier.hh \ - $$PWD/include/seastar/core/task.hh \ - $$PWD/include/seastar/core/temporary_buffer.hh \ - $$PWD/include/seastar/core/thread.hh \ - $$PWD/include/seastar/core/thread_cputime_clock.hh \ - $$PWD/include/seastar/core/thread_impl.hh \ - $$PWD/include/seastar/core/timed_out_error.hh \ - $$PWD/include/seastar/core/timer-set.hh \ - $$PWD/include/seastar/core/timer.hh \ - $$PWD/include/seastar/core/transfer.hh \ - $$PWD/include/seastar/core/unaligned.hh \ - $$PWD/include/seastar/core/units.hh \ - $$PWD/include/seastar/core/vector-data-sink.hh \ - $$PWD/include/seastar/core/weak_ptr.hh \ - $$PWD/include/seastar/core/when_all.hh \ - $$PWD/include/seastar/core/when_any.hh \ - $$PWD/include/seastar/core/with_scheduling_group.hh \ - $$PWD/include/seastar/core/with_timeout.hh \ - $$PWD/include/seastar/coroutine/all.hh \ - $$PWD/include/seastar/coroutine/as_future.hh \ - $$PWD/include/seastar/coroutine/exception.hh \ - $$PWD/include/seastar/coroutine/generator.hh \ - $$PWD/include/seastar/coroutine/maybe_yield.hh \ - $$PWD/include/seastar/coroutine/parallel_for_each.hh \ - $$PWD/include/seastar/coroutine/switch_to.hh \ - $$PWD/include/seastar/http/internal/content_source.hh \ - $$PWD/include/seastar/http/api_docs.hh \ - $$PWD/include/seastar/http/client.hh \ - $$PWD/include/seastar/http/common.hh \ - $$PWD/include/seastar/http/exception.hh \ - $$PWD/include/seastar/http/file_handler.hh \ - $$PWD/include/seastar/http/function_handlers.hh \ - $$PWD/include/seastar/http/handlers.hh \ - $$PWD/include/seastar/http/httpd.hh \ - $$PWD/include/seastar/http/json_path.hh \ - $$PWD/include/seastar/http/matcher.hh \ - $$PWD/include/seastar/http/matchrules.hh \ - $$PWD/include/seastar/http/mime_types.hh \ - $$PWD/include/seastar/http/reply.hh \ - $$PWD/include/seastar/http/request.hh \ - $$PWD/include/seastar/http/routes.hh \ - $$PWD/include/seastar/http/short_streams.hh \ - $$PWD/include/seastar/http/transformers.hh \ - $$PWD/include/seastar/http/url.hh \ - $$PWD/include/seastar/json/formatter.hh \ - $$PWD/include/seastar/json/json_elements.hh \ - $$PWD/include/seastar/net/api.hh \ - $$PWD/include/seastar/net/arp.hh \ - $$PWD/include/seastar/net/byteorder.hh \ - $$PWD/include/seastar/net/config.hh \ - $$PWD/include/seastar/net/const.hh \ - $$PWD/include/seastar/net/dhcp.hh \ - $$PWD/include/seastar/net/dns.hh \ - $$PWD/include/seastar/net/dpdk.hh \ - $$PWD/include/seastar/net/ethernet.hh \ - $$PWD/include/seastar/net/inet_address.hh \ - $$PWD/include/seastar/net/ip.hh \ - $$PWD/include/seastar/net/ip_checksum.hh \ - $$PWD/include/seastar/net/ipv4_address.hh \ - $$PWD/include/seastar/net/ipv6_address.hh \ - $$PWD/include/seastar/net/native-stack.hh \ - $$PWD/include/seastar/net/net.hh \ - $$PWD/include/seastar/net/packet-data-source.hh \ - $$PWD/include/seastar/net/packet-util.hh \ - $$PWD/include/seastar/net/packet.hh \ - $$PWD/include/seastar/net/posix-stack.hh \ - $$PWD/include/seastar/net/proxy.hh \ - $$PWD/include/seastar/net/socket_defs.hh \ - $$PWD/include/seastar/net/stack.hh \ - $$PWD/include/seastar/net/tcp-stack.hh \ - $$PWD/include/seastar/net/tcp.hh \ - $$PWD/include/seastar/net/tls.hh \ - $$PWD/include/seastar/net/toeplitz.hh \ - $$PWD/include/seastar/net/udp.hh \ - $$PWD/include/seastar/net/unix_address.hh \ - $$PWD/include/seastar/net/virtio-interface.hh \ - $$PWD/include/seastar/net/virtio.hh \ - $$PWD/include/seastar/rpc/lz4_compressor.hh \ - $$PWD/include/seastar/rpc/lz4_fragmented_compressor.hh \ - $$PWD/include/seastar/rpc/multi_algo_compressor_factory.hh \ - $$PWD/include/seastar/rpc/rpc.hh \ - $$PWD/include/seastar/rpc/rpc_impl.hh \ - $$PWD/include/seastar/rpc/rpc_types.hh \ - $$PWD/include/seastar/testing/entry_point.hh \ - $$PWD/include/seastar/testing/exchanger.hh \ - $$PWD/include/seastar/testing/linux_perf_event.hh \ - $$PWD/include/seastar/testing/on_internal_error.hh \ - $$PWD/include/seastar/testing/perf_tests.hh \ - $$PWD/include/seastar/testing/random.hh \ - $$PWD/include/seastar/testing/seastar_test.hh \ - $$PWD/include/seastar/testing/test_case.hh \ - $$PWD/include/seastar/testing/test_runner.hh \ - $$PWD/include/seastar/testing/thread_test_case.hh \ - $$PWD/include/seastar/util/internal/iovec_utils.hh \ - $$PWD/include/seastar/util/internal/magic.hh \ - $$PWD/include/seastar/util/alloc_failure_injector.hh \ - $$PWD/include/seastar/util/backtrace.hh \ - $$PWD/include/seastar/util/bool_class.hh \ - $$PWD/include/seastar/util/closeable.hh \ - $$PWD/include/seastar/util/concepts.hh \ - $$PWD/include/seastar/util/conversions.hh \ - $$PWD/include/seastar/util/critical_alloc_section.hh \ - $$PWD/include/seastar/util/defer.hh \ - $$PWD/include/seastar/util/eclipse.hh \ - $$PWD/include/seastar/util/exceptions.hh \ - $$PWD/include/seastar/util/file.hh \ - $$PWD/include/seastar/util/function_input_iterator.hh \ - $$PWD/include/seastar/util/indirect.hh \ - $$PWD/include/seastar/util/is_smart_ptr.hh \ - $$PWD/include/seastar/util/later.hh \ - $$PWD/include/seastar/util/lazy.hh \ - $$PWD/include/seastar/util/log-cli.hh \ - $$PWD/include/seastar/util/log-impl.hh \ - $$PWD/include/seastar/util/log.hh \ - $$PWD/include/seastar/util/memory_diagnostics.hh \ - $$PWD/include/seastar/util/modules.hh \ - $$PWD/include/seastar/util/noncopyable_function.hh \ - $$PWD/include/seastar/util/optimized_optional.hh \ - $$PWD/include/seastar/util/print_safe.hh \ - $$PWD/include/seastar/util/process.hh \ - $$PWD/include/seastar/util/program-options.hh \ - $$PWD/include/seastar/util/read_first_line.hh \ - $$PWD/include/seastar/util/reference_wrapper.hh \ - $$PWD/include/seastar/util/sampler.hh \ - $$PWD/include/seastar/util/shared_token_bucket.hh \ - $$PWD/include/seastar/util/short_streams.hh \ - $$PWD/include/seastar/util/source_location-compat.hh \ - $$PWD/include/seastar/util/spinlock.hh \ - $$PWD/include/seastar/util/std-compat.hh \ - $$PWD/include/seastar/util/string_utils.hh \ - $$PWD/include/seastar/util/tmp_file.hh \ - $$PWD/include/seastar/util/transform_iterator.hh \ - $$PWD/include/seastar/util/tuple_utils.hh \ - $$PWD/include/seastar/util/used_size.hh \ - $$PWD/include/seastar/util/variant_utils.hh \ - $$PWD/include/seastar/websocket/server.hh \ - $$PWD/src/core/cgroup.hh \ - $$PWD/src/core/file-impl.hh \ - $$PWD/src/core/prefault.hh \ - $$PWD/src/core/program_options.hh \ - $$PWD/src/core/reactor_backend.hh \ - $$PWD/src/core/scollectd-impl.hh \ - $$PWD/src/core/syscall_result.hh \ - $$PWD/src/core/syscall_work_queue.hh \ - $$PWD/src/core/thread_pool.hh \ - $$PWD/src/core/vla.hh \ - $$PWD/src/net/native-stack-impl.hh \ - $$PWD/tests/unit/loopback_socket.hh \ - $$PWD/tests/unit/mock_file.hh \ - $$PWD/tests/unit/tl-generator.hh \ - $$PWD/tests/unit/tmpdir.hh - -SOURCES = \ - $$PWD/apps/httpd/main.cc \ - $$PWD/apps/io_tester/io_tester.cc \ - $$PWD/apps/io_tester/ioinfo.cc \ - $$PWD/apps/iotune/iotune.cc \ - $$PWD/apps/memcached/tests/test_ascii_parser.cc \ - $$PWD/apps/memcached/memcache.cc \ - $$PWD/apps/metrics_tester/metrics_tester.cc \ - $$PWD/apps/rpc_tester/rpc_tester.cc \ - $$PWD/apps/seawreck/seawreck.cc \ - $$PWD/build/debug/apps/httpd/demo.json.cc \ - $$PWD/build/debug/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp \ - $$PWD/build/debug/CMakeFiles/CheckFunctionExists/CheckFunctionExists.cxx \ - $$PWD/build/debug/gen/src/proto/metrics2.pb.cc \ - $$PWD/build/release/apps/httpd/demo.json.cc \ - $$PWD/build/release/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp \ - $$PWD/build/release/CMakeFiles/CheckFunctionExists/CheckFunctionExists.cxx \ - $$PWD/build/release/gen/src/proto/metrics2.pb.cc \ - $$PWD/build2/apps/httpd/demo.json.cc \ - $$PWD/build2/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp \ - $$PWD/build2/CMakeFiles/CheckFunctionExists/CheckFunctionExists.cxx \ - $$PWD/build2/gen/src/proto/metrics2.pb.cc \ - $$PWD/cmake/code_tests/LinuxMembarrier_test.cc \ - $$PWD/cmake/code_tests/rt_test.cc \ - $$PWD/cmake/code_tests/Sanitizers_fiber_test.cc \ - $$PWD/cmake/code_tests/Source_location_default_argument.cc \ - $$PWD/cmake/code_tests/Source_location_test.cc \ - $$PWD/cmake/code_tests/stdout_test.cc \ - $$PWD/demos/block_discard_demo.cc \ - $$PWD/demos/coroutines_demo.cc \ - $$PWD/demos/db_demo.cc \ - $$PWD/demos/echo_demo.cc \ - $$PWD/demos/file_demo.cc \ - $$PWD/demos/hello-cxx-module.cc \ - $$PWD/demos/hello-world.cc \ - $$PWD/demos/http_client_demo.cc \ - $$PWD/demos/ip_demo.cc \ - $$PWD/demos/l3_demo.cc \ - $$PWD/demos/line_count_demo.cc \ - $$PWD/demos/rpc_demo.cc \ - $$PWD/demos/scheduling_group_demo.cc \ - $$PWD/demos/sharded_parameter_demo.cc \ - $$PWD/demos/tcp_demo.cc \ - $$PWD/demos/tcp_sctp_client_demo.cc \ - $$PWD/demos/tcp_sctp_server_demo.cc \ - $$PWD/demos/tls_echo_server_demo.cc \ - $$PWD/demos/tls_simple_client_demo.cc \ - $$PWD/demos/tutorial_examples.cc \ - $$PWD/demos/udp_client_demo.cc \ - $$PWD/demos/udp_server_demo.cc \ - $$PWD/demos/udp_zero_copy_demo.cc \ - $$PWD/demos/websocket_demo.cc \ - $$PWD/src/core/alien.cc \ - $$PWD/src/core/app-template.cc \ - $$PWD/src/core/condition-variable.cc \ - $$PWD/src/core/dpdk_rte.cc \ - $$PWD/src/core/exception_hacks.cc \ - $$PWD/src/core/execution_stage.cc \ - $$PWD/src/core/fair_queue.cc \ - $$PWD/src/core/file.cc \ - $$PWD/src/core/fsnotify.cc \ - $$PWD/src/core/fsqual.cc \ - $$PWD/src/core/fstream.cc \ - $$PWD/src/core/future-util.cc \ - $$PWD/src/core/future.cc \ - $$PWD/src/core/io_queue.cc \ - $$PWD/src/core/linux-aio.cc \ - $$PWD/src/core/memory.cc \ - $$PWD/src/core/metrics.cc \ - $$PWD/src/core/on_internal_error.cc \ - $$PWD/src/core/posix.cc \ - $$PWD/src/core/program_options.cc \ - $$PWD/src/core/prometheus.cc \ - $$PWD/src/core/reactor.cc \ - $$PWD/src/core/reactor_backend.cc \ - $$PWD/src/core/resource.cc \ - $$PWD/src/core/scollectd.cc \ - $$PWD/src/core/semaphore.cc \ - $$PWD/src/core/sharded.cc \ - $$PWD/src/core/smp.cc \ - $$PWD/src/core/sstring.cc \ - $$PWD/src/core/systemwide_memory_barrier.cc \ - $$PWD/src/core/thread.cc \ - $$PWD/src/core/thread_pool.cc \ - $$PWD/src/core/uname.cc \ - $$PWD/src/http/api_docs.cc \ - $$PWD/src/http/client.cc \ - $$PWD/src/http/common.cc \ - $$PWD/src/http/file_handler.cc \ - $$PWD/src/http/httpd.cc \ - $$PWD/src/http/json_path.cc \ - $$PWD/src/http/matcher.cc \ - $$PWD/src/http/mime_types.cc \ - $$PWD/src/http/reply.cc \ - $$PWD/src/http/request.cc \ - $$PWD/src/http/routes.cc \ - $$PWD/src/http/transformers.cc \ - $$PWD/src/http/url.cc \ - $$PWD/src/json/formatter.cc \ - $$PWD/src/json/json_elements.cc \ - $$PWD/src/net/arp.cc \ - $$PWD/src/net/config.cc \ - $$PWD/src/net/dhcp.cc \ - $$PWD/src/net/dns.cc \ - $$PWD/src/net/dpdk.cc \ - $$PWD/src/net/ethernet.cc \ - $$PWD/src/net/inet_address.cc \ - $$PWD/src/net/ip.cc \ - $$PWD/src/net/ip_checksum.cc \ - $$PWD/src/net/native-stack.cc \ - $$PWD/src/net/net.cc \ - $$PWD/src/net/packet.cc \ - $$PWD/src/net/posix-stack.cc \ - $$PWD/src/net/proxy.cc \ - $$PWD/src/net/socket_address.cc \ - $$PWD/src/net/stack.cc \ - $$PWD/src/net/tcp.cc \ - $$PWD/src/net/tls.cc \ - $$PWD/src/net/udp.cc \ - $$PWD/src/net/unix_address.cc \ - $$PWD/src/net/virtio.cc \ - $$PWD/src/rpc/lz4_compressor.cc \ - $$PWD/src/rpc/lz4_fragmented_compressor.cc \ - $$PWD/src/rpc/rpc.cc \ - $$PWD/src/testing/entry_point.cc \ - $$PWD/src/testing/random.cc \ - $$PWD/src/testing/seastar_test.cc \ - $$PWD/src/testing/test_runner.cc \ - $$PWD/src/util/alloc_failure_injector.cc \ - $$PWD/src/util/backtrace.cc \ - $$PWD/src/util/conversions.cc \ - $$PWD/src/util/exceptions.cc \ - $$PWD/src/util/file.cc \ - $$PWD/src/util/log.cc \ - $$PWD/src/util/process.cc \ - $$PWD/src/util/program-options.cc \ - $$PWD/src/util/read_first_line.cc \ - $$PWD/src/util/short_streams.cc \ - $$PWD/src/util/tmp_file.cc \ - $$PWD/src/websocket/server.cc \ - $$PWD/src/seastar.cc \ - $$PWD/tests/perf/allocator_perf.cc \ - $$PWD/tests/perf/coroutine_perf.cc \ - $$PWD/tests/perf/fair_queue_perf.cc \ - $$PWD/tests/perf/fstream_perf.cc \ - $$PWD/tests/perf/future_util_perf.cc \ - $$PWD/tests/perf/linux_perf_event.cc \ - $$PWD/tests/perf/perf_tests.cc \ - $$PWD/tests/perf/rpc_perf.cc \ - $$PWD/tests/perf/shared_token_bucket.cc \ - $$PWD/tests/perf/smp_submit_to_perf.cc \ - $$PWD/tests/unit/abort_source_test.cc \ - $$PWD/tests/unit/abortable_fifo_test.cc \ - $$PWD/tests/unit/alien_test.cc \ - $$PWD/tests/unit/alloc_test.cc \ - $$PWD/tests/unit/allocator_test.cc \ - $$PWD/tests/unit/app-template_test.cc \ - $$PWD/tests/unit/checked_ptr_test.cc \ - $$PWD/tests/unit/chunk_parsers_test.cc \ - $$PWD/tests/unit/chunked_fifo_test.cc \ - $$PWD/tests/unit/circular_buffer_fixed_capacity_test.cc \ - $$PWD/tests/unit/circular_buffer_test.cc \ - $$PWD/tests/unit/closeable_test.cc \ - $$PWD/tests/unit/condition_variable_test.cc \ - $$PWD/tests/unit/connect_test.cc \ - $$PWD/tests/unit/content_source_test.cc \ - $$PWD/tests/unit/coroutines_test.cc \ - $$PWD/tests/unit/defer_test.cc \ - $$PWD/tests/unit/deleter_test.cc \ - $$PWD/tests/unit/directory_test.cc \ - $$PWD/tests/unit/distributed_test.cc \ - $$PWD/tests/unit/dns_test.cc \ - $$PWD/tests/unit/exception_logging_test.cc \ - $$PWD/tests/unit/execution_stage_test.cc \ - $$PWD/tests/unit/expiring_fifo_test.cc \ - $$PWD/tests/unit/fair_queue_test.cc \ - $$PWD/tests/unit/file_io_test.cc \ - $$PWD/tests/unit/file_utils_test.cc \ - $$PWD/tests/unit/foreign_ptr_test.cc \ - $$PWD/tests/unit/fsnotifier_test.cc \ - $$PWD/tests/unit/fstream_test.cc \ - $$PWD/tests/unit/futures_test.cc \ - $$PWD/tests/unit/httpd_test.cc \ - $$PWD/tests/unit/io_queue_test.cc \ - $$PWD/tests/unit/ipv6_test.cc \ - $$PWD/tests/unit/json_formatter_test.cc \ - $$PWD/tests/unit/locking_test.cc \ - $$PWD/tests/unit/log_buf_test.cc \ - $$PWD/tests/unit/lowres_clock_test.cc \ - $$PWD/tests/unit/metrics_test.cc \ - $$PWD/tests/unit/net_config_test.cc \ - $$PWD/tests/unit/network_interface_test.cc \ - $$PWD/tests/unit/noncopyable_function_test.cc \ - $$PWD/tests/unit/output_stream_test.cc \ - $$PWD/tests/unit/packet_test.cc \ - $$PWD/tests/unit/pipe_test.cc \ - $$PWD/tests/unit/program_options_test.cc \ - $$PWD/tests/unit/queue_test.cc \ - $$PWD/tests/unit/request_parser_test.cc \ - $$PWD/tests/unit/rpc_test.cc \ - $$PWD/tests/unit/scheduling_group_test.cc \ - $$PWD/tests/unit/semaphore_test.cc \ - $$PWD/tests/unit/sharded_test.cc \ - $$PWD/tests/unit/shared_ptr_test.cc \ - $$PWD/tests/unit/shared_token_bucket_test.cc \ - $$PWD/tests/unit/signal_test.cc \ - $$PWD/tests/unit/simple_stream_test.cc \ - $$PWD/tests/unit/slab_test.cc \ - $$PWD/tests/unit/smp_test.cc \ - $$PWD/tests/unit/socket_test.cc \ - $$PWD/tests/unit/source_location_test.cc \ - $$PWD/tests/unit/spawn_test.cc \ - $$PWD/tests/unit/sstring_test.cc \ - $$PWD/tests/unit/stall_detector_test.cc \ - $$PWD/tests/unit/stream_reader_test.cc \ - $$PWD/tests/unit/thread_context_switch_test.cc \ - $$PWD/tests/unit/thread_test.cc \ - $$PWD/tests/unit/timer_test.cc \ - $$PWD/tests/unit/tls_test.cc \ - $$PWD/tests/unit/tuple_utils_test.cc \ - $$PWD/tests/unit/uname_test.cc \ - $$PWD/tests/unit/unix_domain_test.cc \ - $$PWD/tests/unit/unwind_test.cc \ - $$PWD/tests/unit/weak_ptr_test.cc \ - $$PWD/tests/unit/websocket_test.cc - -INCLUDEPATH = \ - $$PWD/build/debug/gen/src/proto \ - $$PWD/build/release/gen/src/proto \ - $$PWD/build2/gen/src/proto - -#DEFINES = - diff --git a/db_simple.pro.user b/db_simple.pro.user deleted file mode 100644 index e523f3a5984..00000000000 --- a/db_simple.pro.user +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - EnvironmentId - {ca393d1f-e9ed-4bec-aa26-20e86827200b} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - 0 - false - true - false - 2 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 4 - true - - - - true - - - - - ProjectExplorer.Project.Target.0 - - Desktop - Desktop Qt 6.7.0 - Desktop Qt 6.7.0 - qt.qt6.670.linux_gcc_64_kit - 0 - 0 - 0 - - 0 - /home/DEV/seastar/build/Desktop_Qt_6_7_0-Debug - /home/DEV/seastar/build/Desktop_Qt_6_7_0-Debug - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - - - /home/DEV/seastar/build/Desktop_Qt_6_7_0-Release - /home/DEV/seastar/build/Desktop_Qt_6_7_0-Release - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - /home/DEV/seastar/build/Desktop_Qt_6_7_0-Profile - /home/DEV/seastar/build/Desktop_Qt_6_7_0-Profile - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Profile - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - 0 - - 3 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - - ProjectExplorer.CustomExecutableRunConfiguration - - false - true - true - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - diff --git a/demos/http_client_demo.cc b/demos/http_client_demo.cc index cc25abf2799..3a201b4f8a0 100644 --- a/demos/http_client_demo.cc +++ b/demos/http_client_demo.cc @@ -32,11 +32,8 @@ #include #include -#pragma GCC diagnostic ignored "-Wunused-variable" - using namespace seastar; namespace bpo = boost::program_options; -logger applog("app"); struct printer { future> operator() (temporary_buffer buf) { @@ -61,12 +58,11 @@ int main(int ac, char** av) { return app.run(ac, av, [&] { auto&& config = app.configuration(); - auto host = config.count("host") == 0 ? std::string("192.168.1.131") : config["host"].as(); - auto path = config.count("path") == 0 ? std::string("/path") : config["path"].as(); - auto method = config.count("method") == 0 ? std::string("GET") : config["method"].as(); + auto host = config["host"].as(); + auto path = config["path"].as(); + auto method = config["method"].as(); auto body = config.count("file") == 0 ? std::string("") : config["file"].as(); - auto https = config.count("https") == 0 ? false : config["https"].as(); - auto port = config.count("port") == 0 ? 10000 : config["port"].as(); + auto https = config["https"].as(); return seastar::async([=] { net::hostent e = net::dns::get_host_by_name(host, net::inet_address::family::INET).get(); @@ -74,11 +70,11 @@ int main(int ac, char** av) { if (https) { auto certs = ::make_shared(); certs->set_system_trust().get(); - fmt::print("{} {}:{}{}\n", method, e.addr_list.front(), port, path); - cln = std::make_unique(socket_address(e.addr_list.front(), port), std::move(certs), host); + fmt::print("{} {}:443{}\n", method, e.addr_list.front(), path); + cln = std::make_unique(socket_address(e.addr_list.front(), 443), std::move(certs), host); } else { - fmt::print("{} {}:{}{}\n", method, e.addr_list.front(), port, path); - cln = std::make_unique(socket_address(e.addr_list.front(), port)); + fmt::print("{} {}:80{}\n", method, e.addr_list.front(), path); + cln = std::make_unique(socket_address(e.addr_list.front(), 80)); } auto req = http::request::make(method, host, path); if (body != "") { diff --git a/demos/tcp_demo.cc b/demos/tcp_demo.cc index 196459c7a84..34ba69d7f51 100644 --- a/demos/tcp_demo.cc +++ b/demos/tcp_demo.cc @@ -66,7 +66,7 @@ int main(int ac, char** av) { auto vnet = create_virtio_net_device(opts.virtio_opts, opts.lro); interface netif(std::move(vnet)); ipv4 inet(&netif); - inet.set_host_address(ipv4_address("192.168.1.131")); + inet.set_host_address(ipv4_address("192.168.122.2")); tcp_test tt(inet); (void)engine().when_started().then([&tt] { tt.run(); }); engine().run(); diff --git a/rest.cmd b/rest.cmd deleted file mode 100755 index dc7422b942d..00000000000 --- a/rest.cmd +++ /dev/null @@ -1,48 +0,0 @@ -@rem Compliance and stress tester for SeaStar/demos/db_demo.ccc -@rem Author: AlexanderMihail@gmail.com -@rem Incept date: 2024.04.08 -@rem Modified on: 2024.04.11 -@rem Version 1. - -@echo off -set host=http://192.168.1.131:10000 -curl %host%/config?trace_level=1111 -curl %host%^?op=purge -set pass1=0 -:loop1 -@set /a "reminder=%pass1% %% 10" -@echo: -@echo ====== PASS(%pass1%,%reminder%) ========================== -set pass2=0 -:loop2 -curl -s %host%^?op=insert^&key=aaa^&value=text_aaa%%0a >NUL 2>&1 -curl -s %host%^?key=aaa>NUL 2>&1 -curl -s %host%^?op=insert^&key=bbb^&value=text_bbb%%0a>NUL 2>&1 -curl -s %host%^?op=insert^&key=ccc^&value=text_ccc%%0a>NUL 2>&1 -curl -s %host%^?key=aaa>NUL 2>&1 -curl -s %host%^?key=bbb>NUL 2>&1 -curl -s %host%^?op=update^&key=aaa^&value=text_aaaa%%0a>NUL 2>&1 -curl -s %host%^?op=update^&key=bbb^&value=text_bbbb%%0a>NUL 2>&1 -curl -s %host%^?op=update^&key=ccc^&value=text_cccc%%0a>NUL 2>&1 -curl -s %host%^?op=update^&key=aaa^&value=text_aa%%0a>NUL 2>&1 -curl -s %host%^?op=update^&key=bbb^&value=text_bb%%0a>NUL 2>&1 -@set /a "pass2=%pass2%+1" -if %pass1% GTR 0 IF %pass2% LSS 10 goto :loop2 -if %reminder% EQU 0 ( - curl %host%^?op=compact>NUL 2>&1 -) -curl -s %host%^?key=aaa>NUL 2>&1 -curl -s %host%^?key=bbb>NUL 2>&1 -curl -s %host%^?key=ccc>NUL 2>&1 -curl -s %host%^?key=ddd>NUL 2>&1 -curl -s %host%^?op=delete^&key=bbb>NUL 2>&1 -curl -s %host%^?op=list^&key=ALL>NUL 2>&1 -curl -s %host%/stats -curl %host%/config?trace_level=0000>NUL 2>&1 -if %pass1% EQU 100 ( - curl %host%/quit - goto :EXIT -) -@set /a "pass1=%pass1%+1" -goto :loop1 -:EXIT \ No newline at end of file diff --git a/seastar.kdev4 b/seastar.kdev4 deleted file mode 100644 index cd9800e0815..00000000000 --- a/seastar.kdev4 +++ /dev/null @@ -1,4 +0,0 @@ -[Project] -CreatedFrom=CMakeLists.txt -Manager=KDevCMakeManager -Name=seastar From c0343244d54bc0fdd5d258c15acb8a2704739549 Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Sat, 13 Apr 2024 23:45:37 +0300 Subject: [PATCH 09/19] Removed files that shouldn't be in the sources of SeaStar. --- CMakeLists.txt.user | 2545 ------------------------------------- demos/CMakeLists.txt.user | 418 ------ 2 files changed, 2963 deletions(-) delete mode 100644 CMakeLists.txt.user delete mode 100644 demos/CMakeLists.txt.user diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user deleted file mode 100644 index 095cf6367a3..00000000000 --- a/CMakeLists.txt.user +++ /dev/null @@ -1,2545 +0,0 @@ - - - - - - EnvironmentId - {ca393d1f-e9ed-4bec-aa26-20e86827200b} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - 0 - false - true - false - 2 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 4 - true - - - - true - - - - - ProjectExplorer.Project.Target.0 - - Desktop - Imported Kit - Imported Kit - {53be7c7e-4147-4502-8b20-72627760d018} - 0 - 0 - 11 - - Debug - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=Debug --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - /home/DEV/seastar/build/Imported_Kit_temporary-Debug - - - - - all - - false - - true - Build - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - Build - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - CMakeProjectManager.CMakeBuildConfiguration - - - Release - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=Release --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - /home/DEV/seastar/build/Imported_Kit_temporary-Release - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release - CMakeProjectManager.CMakeBuildConfiguration - - - Debug - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=Debug --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - /home/DEV/seastar - /home/DEV/seastar/build2 - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug2 - CMakeProjectManager.CMakeBuildConfiguration - - - Debug - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=Debug --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - /home/DEV/seastar - /home/DEV/seastar/build/debug - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug3 - CMakeProjectManager.CMakeBuildConfiguration - - - RelWithDebInfo - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - /home/DEV/seastar - /home/DEV/seastar/build/release - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release with Debug Information - CMakeProjectManager.CMakeBuildConfiguration - - 5 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_httpd - CMakeProjectManager.CMakeRunConfiguration.app_httpd - app_httpd - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/httpd - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_io_tester - CMakeProjectManager.CMakeRunConfiguration.app_io_tester - app_io_tester - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/io_tester - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_coroutines - CMakeProjectManager.CMakeRunConfiguration.demo_coroutines - demo_coroutines - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_sstring - CMakeProjectManager.CMakeRunConfiguration.test_unit_sstring - test_unit_sstring - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_stall_detector - CMakeProjectManager.CMakeRunConfiguration.test_unit_stall_detector - test_unit_stall_detector - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_stream_reader - CMakeProjectManager.CMakeRunConfiguration.test_unit_stream_reader - test_unit_stream_reader - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_thread - CMakeProjectManager.CMakeRunConfiguration.test_unit_thread - test_unit_thread - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_thread_context_switch - CMakeProjectManager.CMakeRunConfiguration.test_unit_thread_context_switch - test_unit_thread_context_switch - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_timer - CMakeProjectManager.CMakeRunConfiguration.test_unit_timer - test_unit_timer - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_tls - CMakeProjectManager.CMakeRunConfiguration.test_unit_tls - test_unit_tls - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_tuple_utils - CMakeProjectManager.CMakeRunConfiguration.test_unit_tuple_utils - test_unit_tuple_utils - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_uname - CMakeProjectManager.CMakeRunConfiguration.test_unit_uname - test_unit_uname - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_unix_domain - CMakeProjectManager.CMakeRunConfiguration.test_unit_unix_domain - test_unit_unix_domain - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_db - CMakeProjectManager.CMakeRunConfiguration.demo_db - demo_db - true - -c4 - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_unwind - CMakeProjectManager.CMakeRunConfiguration.test_unit_unwind - test_unit_unwind - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_weak_ptr - CMakeProjectManager.CMakeRunConfiguration.test_unit_weak_ptr - test_unit_weak_ptr - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_websocket - CMakeProjectManager.CMakeRunConfiguration.test_unit_websocket - test_unit_websocket - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_echo - CMakeProjectManager.CMakeRunConfiguration.demo_echo - demo_echo - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_file - CMakeProjectManager.CMakeRunConfiguration.demo_file - demo_file - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_hello-world - CMakeProjectManager.CMakeRunConfiguration.demo_hello-world - demo_hello-world - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_http_client - CMakeProjectManager.CMakeRunConfiguration.demo_http_client - demo_http_client - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_ip - CMakeProjectManager.CMakeRunConfiguration.demo_ip - demo_ip - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_l3 - CMakeProjectManager.CMakeRunConfiguration.demo_l3 - demo_l3 - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_line_count - CMakeProjectManager.CMakeRunConfiguration.demo_line_count - demo_line_count - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_rpc - CMakeProjectManager.CMakeRunConfiguration.demo_rpc - demo_rpc - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_ioinfo - CMakeProjectManager.CMakeRunConfiguration.app_ioinfo - app_ioinfo - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/io_tester - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_scheduling_group - CMakeProjectManager.CMakeRunConfiguration.demo_scheduling_group - demo_scheduling_group - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_sharded_parameter - CMakeProjectManager.CMakeRunConfiguration.demo_sharded_parameter - demo_sharded_parameter - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tcp - CMakeProjectManager.CMakeRunConfiguration.demo_tcp - demo_tcp - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tcp_sctp_client - CMakeProjectManager.CMakeRunConfiguration.demo_tcp_sctp_client - demo_tcp_sctp_client - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tcp_sctp_server - CMakeProjectManager.CMakeRunConfiguration.demo_tcp_sctp_server - demo_tcp_sctp_server - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tls_echo_server - CMakeProjectManager.CMakeRunConfiguration.demo_tls_echo_server - demo_tls_echo_server - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tls_simple_client - CMakeProjectManager.CMakeRunConfiguration.demo_tls_simple_client - demo_tls_simple_client - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tutorial_examples - CMakeProjectManager.CMakeRunConfiguration.demo_tutorial_examples - demo_tutorial_examples - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_udp_client - CMakeProjectManager.CMakeRunConfiguration.demo_udp_client - demo_udp_client - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_udp_server - CMakeProjectManager.CMakeRunConfiguration.demo_udp_server - demo_udp_server - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_iotune - CMakeProjectManager.CMakeRunConfiguration.app_iotune - app_iotune - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/iotune - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_udp_zero_copy - CMakeProjectManager.CMakeRunConfiguration.demo_udp_zero_copy - demo_udp_zero_copy - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_websocket - CMakeProjectManager.CMakeRunConfiguration.demo_websocket - demo_websocket - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_allocator - CMakeProjectManager.CMakeRunConfiguration.test_perf_allocator - test_perf_allocator - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_coroutine - CMakeProjectManager.CMakeRunConfiguration.test_perf_coroutine - test_perf_coroutine - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_fair_queue - CMakeProjectManager.CMakeRunConfiguration.test_perf_fair_queue - test_perf_fair_queue - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_fstream - CMakeProjectManager.CMakeRunConfiguration.test_perf_fstream - test_perf_fstream - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_future_util - CMakeProjectManager.CMakeRunConfiguration.test_perf_future_util - test_perf_future_util - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_rpc - CMakeProjectManager.CMakeRunConfiguration.test_perf_rpc - test_perf_rpc - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_shared_token_bucket - CMakeProjectManager.CMakeRunConfiguration.test_perf_shared_token_bucket - test_perf_shared_token_bucket - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_smp_submit_to - CMakeProjectManager.CMakeRunConfiguration.test_perf_smp_submit_to - test_perf_smp_submit_to - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_memcached - CMakeProjectManager.CMakeRunConfiguration.app_memcached - app_memcached - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/memcached - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_abort_source - CMakeProjectManager.CMakeRunConfiguration.test_unit_abort_source - test_unit_abort_source - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_abortable_fifo - CMakeProjectManager.CMakeRunConfiguration.test_unit_abortable_fifo - test_unit_abortable_fifo - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_alien - CMakeProjectManager.CMakeRunConfiguration.test_unit_alien - test_unit_alien - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_alloc - CMakeProjectManager.CMakeRunConfiguration.test_unit_alloc - test_unit_alloc - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_allocator - CMakeProjectManager.CMakeRunConfiguration.test_unit_allocator - test_unit_allocator - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_app-template - CMakeProjectManager.CMakeRunConfiguration.test_unit_app-template - test_unit_app-template - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_checked_ptr - CMakeProjectManager.CMakeRunConfiguration.test_unit_checked_ptr - test_unit_checked_ptr - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_chunk_parsers - CMakeProjectManager.CMakeRunConfiguration.test_unit_chunk_parsers - test_unit_chunk_parsers - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_chunked_fifo - CMakeProjectManager.CMakeRunConfiguration.test_unit_chunked_fifo - test_unit_chunked_fifo - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_circular_buffer - CMakeProjectManager.CMakeRunConfiguration.test_unit_circular_buffer - test_unit_circular_buffer - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_memcached_test_ascii - CMakeProjectManager.CMakeRunConfiguration.app_memcached_test_ascii - app_memcached_test_ascii - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/memcached/tests - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_circular_buffer_fixed_capacity - CMakeProjectManager.CMakeRunConfiguration.test_unit_circular_buffer_fixed_capacity - test_unit_circular_buffer_fixed_capacity - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_closeable - CMakeProjectManager.CMakeRunConfiguration.test_unit_closeable - test_unit_closeable - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_condition_variable - CMakeProjectManager.CMakeRunConfiguration.test_unit_condition_variable - test_unit_condition_variable - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_connect - CMakeProjectManager.CMakeRunConfiguration.test_unit_connect - test_unit_connect - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_content_source - CMakeProjectManager.CMakeRunConfiguration.test_unit_content_source - test_unit_content_source - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_coroutines - CMakeProjectManager.CMakeRunConfiguration.test_unit_coroutines - test_unit_coroutines - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_defer - CMakeProjectManager.CMakeRunConfiguration.test_unit_defer - test_unit_defer - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_deleter - CMakeProjectManager.CMakeRunConfiguration.test_unit_deleter - test_unit_deleter - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_directory - CMakeProjectManager.CMakeRunConfiguration.test_unit_directory - test_unit_directory - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_distributed - CMakeProjectManager.CMakeRunConfiguration.test_unit_distributed - test_unit_distributed - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_metrics_tester - CMakeProjectManager.CMakeRunConfiguration.app_metrics_tester - app_metrics_tester - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/metrics_tester - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_dns - CMakeProjectManager.CMakeRunConfiguration.test_unit_dns - test_unit_dns - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_exception_logging - CMakeProjectManager.CMakeRunConfiguration.test_unit_exception_logging - test_unit_exception_logging - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_execution_stage - CMakeProjectManager.CMakeRunConfiguration.test_unit_execution_stage - test_unit_execution_stage - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_expiring_fifo - CMakeProjectManager.CMakeRunConfiguration.test_unit_expiring_fifo - test_unit_expiring_fifo - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_fair_queue - CMakeProjectManager.CMakeRunConfiguration.test_unit_fair_queue - test_unit_fair_queue - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_file_io - CMakeProjectManager.CMakeRunConfiguration.test_unit_file_io - test_unit_file_io - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_file_utils - CMakeProjectManager.CMakeRunConfiguration.test_unit_file_utils - test_unit_file_utils - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_foreign_ptr - CMakeProjectManager.CMakeRunConfiguration.test_unit_foreign_ptr - test_unit_foreign_ptr - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_fsnotifier - CMakeProjectManager.CMakeRunConfiguration.test_unit_fsnotifier - test_unit_fsnotifier - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_fstream - CMakeProjectManager.CMakeRunConfiguration.test_unit_fstream - test_unit_fstream - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_rpc_tester - CMakeProjectManager.CMakeRunConfiguration.app_rpc_tester - app_rpc_tester - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/rpc_tester - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_futures - CMakeProjectManager.CMakeRunConfiguration.test_unit_futures - test_unit_futures - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_httpd - CMakeProjectManager.CMakeRunConfiguration.test_unit_httpd - test_unit_httpd - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_io_queue - CMakeProjectManager.CMakeRunConfiguration.test_unit_io_queue - test_unit_io_queue - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_ipv6 - CMakeProjectManager.CMakeRunConfiguration.test_unit_ipv6 - test_unit_ipv6 - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_json_formatter - CMakeProjectManager.CMakeRunConfiguration.test_unit_json_formatter - test_unit_json_formatter - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_locking - CMakeProjectManager.CMakeRunConfiguration.test_unit_locking - test_unit_locking - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_log_buf - CMakeProjectManager.CMakeRunConfiguration.test_unit_log_buf - test_unit_log_buf - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_lowres_clock - CMakeProjectManager.CMakeRunConfiguration.test_unit_lowres_clock - test_unit_lowres_clock - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_metrics - CMakeProjectManager.CMakeRunConfiguration.test_unit_metrics - test_unit_metrics - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_net_config - CMakeProjectManager.CMakeRunConfiguration.test_unit_net_config - test_unit_net_config - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_seawreck - CMakeProjectManager.CMakeRunConfiguration.app_seawreck - app_seawreck - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/apps/seawreck - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_network_interface - CMakeProjectManager.CMakeRunConfiguration.test_unit_network_interface - test_unit_network_interface - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_noncopyable_function - CMakeProjectManager.CMakeRunConfiguration.test_unit_noncopyable_function - test_unit_noncopyable_function - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_output_stream - CMakeProjectManager.CMakeRunConfiguration.test_unit_output_stream - test_unit_output_stream - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_packet - CMakeProjectManager.CMakeRunConfiguration.test_unit_packet - test_unit_packet - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_pipe - CMakeProjectManager.CMakeRunConfiguration.test_unit_pipe - test_unit_pipe - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_program_options - CMakeProjectManager.CMakeRunConfiguration.test_unit_program_options - test_unit_program_options - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_queue - CMakeProjectManager.CMakeRunConfiguration.test_unit_queue - test_unit_queue - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_request_parser - CMakeProjectManager.CMakeRunConfiguration.test_unit_request_parser - test_unit_request_parser - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_rpc - CMakeProjectManager.CMakeRunConfiguration.test_unit_rpc - test_unit_rpc - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_scheduling_group - CMakeProjectManager.CMakeRunConfiguration.test_unit_scheduling_group - test_unit_scheduling_group - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_block_discard - CMakeProjectManager.CMakeRunConfiguration.demo_block_discard - demo_block_discard - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_semaphore - CMakeProjectManager.CMakeRunConfiguration.test_unit_semaphore - test_unit_semaphore - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_sharded - CMakeProjectManager.CMakeRunConfiguration.test_unit_sharded - test_unit_sharded - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_shared_ptr - CMakeProjectManager.CMakeRunConfiguration.test_unit_shared_ptr - test_unit_shared_ptr - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_shared_token_bucket - CMakeProjectManager.CMakeRunConfiguration.test_unit_shared_token_bucket - test_unit_shared_token_bucket - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_signal - CMakeProjectManager.CMakeRunConfiguration.test_unit_signal - test_unit_signal - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_simple_stream - CMakeProjectManager.CMakeRunConfiguration.test_unit_simple_stream - test_unit_simple_stream - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_smp - CMakeProjectManager.CMakeRunConfiguration.test_unit_smp - test_unit_smp - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_socket - CMakeProjectManager.CMakeRunConfiguration.test_unit_socket - test_unit_socket - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_source_location - CMakeProjectManager.CMakeRunConfiguration.test_unit_source_location - test_unit_source_location - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_spawn - CMakeProjectManager.CMakeRunConfiguration.test_unit_spawn - test_unit_spawn - false - true - true - true - /home/DEV/seastar/build/Imported_Kit_temporary-Debug/tests/unit - - 113 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - diff --git a/demos/CMakeLists.txt.user b/demos/CMakeLists.txt.user deleted file mode 100644 index 98bdc336304..00000000000 --- a/demos/CMakeLists.txt.user +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - EnvironmentId - {ca393d1f-e9ed-4bec-aa26-20e86827200b} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - 0 - false - true - false - 2 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 4 - true - - - - true - - - - - ProjectExplorer.Project.Target.0 - - Desktop - Desktop Qt 6.7.0 - Desktop Qt 6.7.0 - qt.qt6.670.linux_gcc_64_kit - 0 - 0 - 0 - - Debug - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=Debug --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} --DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} - 0 - /home/DEV/seastar/demos/build/Desktop_Qt_6_7_0-Debug - - - - - all - - false - - true - Build - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - Build - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - CMakeProjectManager.CMakeBuildConfiguration - - - Release - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=Release --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} --DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} - /home/DEV/seastar/demos/build/Desktop_Qt_6_7_0-Release - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release - CMakeProjectManager.CMakeBuildConfiguration - - - RelWithDebInfo - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} --DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} - /home/DEV/seastar/demos/build/Desktop_Qt_6_7_0-RelWithDebInfo - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release with Debug Information - CMakeProjectManager.CMakeBuildConfiguration - - - RelWithDebInfo - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} --DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} - 0 - /home/DEV/seastar/demos/build/Desktop_Qt_6_7_0-Profile - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Profile - CMakeProjectManager.CMakeBuildConfiguration - - - MinSizeRel - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=MinSizeRel --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} --DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} - /home/DEV/seastar/demos/build/Desktop_Qt_6_7_0-MinSizeRel - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Minimum Size Release - CMakeProjectManager.CMakeBuildConfiguration - - 5 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - - ProjectExplorer.CustomExecutableRunConfiguration - - false - true - true - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - From fab1bd35b2f8d18d4a697db27e80edc133fce4dd Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Sat, 13 Apr 2024 23:47:15 +0300 Subject: [PATCH 10/19] Removed files that shouldn't be in the sources of SeaStar. --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index fa02a0bb934..411a9385da2 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,4 @@ tags .vscode/ compile_commands.json .clangd -.cache -/build2/ +.cache \ No newline at end of file From 86d4823c0b872862001c359f1e7ed0b29e04c97f Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Sun, 14 Apr 2024 04:47:41 +0300 Subject: [PATCH 11/19] Repaired the key deletion code path. Closes bug #13. Added loops to self_test. --- demos/db_demo.cc | 549 +++++++++++++++++++++++++++-------------------- 1 file changed, 317 insertions(+), 232 deletions(-) diff --git a/demos/db_demo.cc b/demos/db_demo.cc index db0aff15264..064e56fe9ee 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -76,6 +76,7 @@ #include #pragma GCC diagnostic ignored "-Wunused-variable" +#pragma GCC diagnostic ignored "-Wstringop-truncation" namespace bpo = boost::program_options; @@ -179,40 +180,61 @@ std::atomic_int Lock::collisions = 0; struct Stats { - static std::atomic_int requests, creates, drops; + static std::atomic_int requests, creates, drops, self_tests; std::atomic_int inserts{0}, deletes{0}, updates{0}, gets{0}, purges{0}, invalidates{0}, evictions{0}, compacts{0}; - operator sstring() const + static std::string get_static_profiles() { - return format( - "requests:{}\n" - "creates:{}\n" - "drops:{}\n" - "inserts:{}\n" - "deletes:{}\n" - "updates:{}\n" - "gets:{}\n" - "purges:{}\n" - "invalidates:{}\n" - "evictions:{}\n" - "compacts:{}\n" + char buf[0x1000]; + sprintf(buf, + "*requests:%d\n" + "*creates:%d\n" + "*drops:%d\n" + "*self_tests:%d\n" , - requests, - creates, - drops, - inserts, - deletes, - updates, - gets, - purges, - invalidates, - evictions, - compacts + requests.load(), + creates.load(), + drops.load(), + self_tests.load() ); + return buf; + } + operator std::string() const + { + char buf[0x1000]; + sprintf(buf, + "*requests:%d\n" + "*creates:%d\n" + "*drops:%d\n" + "*self_tests:%d\n" + "inserts:%d\n" + "deletes:%d\n" + "updates:%d\n" + "gets:%d\n" + "purges:%d\n" + "invalidates:%d\n" + "evictions:%d\n" + "compacts:%d\n" + , + requests.load(), + creates.load(), + drops.load(), + self_tests.load(), + inserts.load(), + deletes.load(), + updates.load(), + gets.load(), + purges.load(), + invalidates.load(), + evictions.load(), + compacts.load() + ); + return get_static_profiles() + buf; } }; std::atomic_int Stats::requests = 0; std::atomic_int Stats::creates = 0; std::atomic_int Stats::drops = 0; +std::atomic_int Stats::self_tests = 0; struct Table : Stats { std::string name; @@ -229,7 +251,7 @@ struct Table : Stats { struct Value { std::string text; - long long fpos; + off_t fpos; size_t sz; }; struct Key @@ -238,16 +260,25 @@ struct Table : Stats { long long fpos; std::deque::iterator it_value; }; - struct Index { int index; char key[256]; off_t vfpos; size_t vsz; }; + struct Index + { + int index; char key[256]; off_t vfpos; size_t vsz; + constexpr static size_t key_len = 256+1 +20+10+1+1; // key,int64,int32\n0 + constexpr static int index_end_marker = -1; + constexpr static int index_deleted_marker = -2; + auto access(int fid, bool write) {return *this; } + }; Table(Table const &) = delete; void operator=(Table const &) = delete; explicit Table(std::string name) : name(name) { fid_keys = open((db_prefix+name+keys_fname).c_str(), O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); - applog.info("Opened {:} returned {:}, {:}", db_prefix+name+keys_fname, fid_keys, errno); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("Opened {} returned {}, {}", db_prefix+name+keys_fname, fid_keys, errno); fid_values = open((db_prefix+name+values_fname).c_str(), O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); - applog.info("Opened {:} returned {:}", name+keys_fname, fid_values, errno); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("Opened {} returned {}", name+keys_fname, fid_values, errno); creates++; } std::string close(bool remove_files) @@ -284,8 +315,8 @@ struct Table : Stats { s = "Purged cache"; invalidates++; if (trace_level & ((1 << ETrace::CACHE) | (1 << ETrace::FILEIO))) - applog.info("purge: cache{:}", files ? " and files" : ""); - return s; + applog.info("purge: cache{}", files ? " and files" : ""); + return s + "\n"; } std::string compact() { @@ -298,7 +329,7 @@ struct Table : Stats { off_t fpos_keys = 0; off_t fpos_values = 0; off_t fpos_temp = 0; - char buf[key_len]; + char buf[Index::key_len]; lseek(fid_keys, 0, SEEK_SET); while (true) { @@ -310,27 +341,34 @@ struct Table : Stats { problems |= (1<<0); break; } + __L: char * sp = strchr(buf,','); - *sp++=0; + size_t key_len = sp-buf; size_t sz; - sscanf(sp, "%jd,%zu", &fpos_values, &sz); - if (fpos_values==index_deleted_marker) + sscanf(sp+1, "%jd,%zu", &fpos_values, &sz); + if (fpos_values==Index::index_deleted_marker) { - auto len = read(fid_keys, buf, sizeof(buf)-1); + char buf_next[Index::key_len]; + + auto len = read(fid_keys, buf_next, sizeof(buf_next)-1); if (len==0) { ftruncate(fid_keys, fpos_keys); break; // end of index file } lseek(fid_keys, fpos_keys, SEEK_SET); - write(fid_keys, buf, sizeof(buf)-1); // Shift the next index entry up by one. - continue; // index key is marked as deleted + write(fid_keys, buf_next, sizeof(buf_next)-1); // Shift the next index entry up by one. + write(fid_keys, buf, sizeof(buf)-1); // Swap curent and next index entries. + memcpy(buf, buf_next, sizeof(buf)); + goto __L; + } + { + std::string val(sz, 0); + lseek(fid_values, fpos_values, SEEK_SET); + read(fid_values, (char*)val.c_str(), sz); + write(fid_temp, val.c_str(), sz); } - std::string val(sz+1, 0); - lseek(fid_values, fpos_values, SEEK_SET); - read(fid_values, (char*)val.c_str(), sz); - write(fid_temp, val.c_str(), sz); - sprintf(buf+strlen(buf), ",%jd,%zu,", fpos_temp, sz); + sprintf(buf+key_len+1, "%jd,%zu,", fpos_temp, sz); len = strlen(buf); auto pad = sizeof(buf)-1-len-1; sprintf(buf+len, "%*c\n", int(pad), ' '); @@ -364,66 +402,10 @@ struct Table : Stats { else problems |= (1<<3); if (trace_level & (1 << ETrace::FILEIO)) - applog.info("compacted: {:}, problems: {:}, errno: {:}", db_prefix+name+compact_fname, problems, errno); + applog.info("compacted: {}, problems: {}, errno: {}", db_prefix+name+compact_fname, problems, errno); return s; } - std::string evict() - { - if (keys.size() == max_cache) - { - auto key = keys.back().text; - xref.erase(xref.find(key)); - keys.pop_back(); - values.pop_back(); // Eviction - if (trace_level & (1 << ETrace::CACHE)) - applog.info("evict key {:}", key); - evictions++; - return "Eviction of key " + key; - } - return "Evition not required"; - } - // Tried to use seastar::coroutine::experimental::generator - Generator index_revolver(bool locked, int &remove) - { - off_t fpos = 0; - int count = 0; - while (true) - { - char buf[key_len]; - { - Lock l(lock_cache, locked); - lseek(fid_keys, fpos, SEEK_SET); - auto len = read(fid_keys, buf, sizeof(buf)-1); - if (len==0) - { - if (trace_level & (1 << ETrace::FILEIO)) - applog.info("Reached the end of {}, count {}", db_prefix+name+keys_fname, count); - co_yield Index{.index = -count, .vfpos = index_end_marker, .vsz = 0}; - fpos = 0; - count = 0; - continue; - } - if (len<0) - { - if (trace_level & (1 << ETrace::FILEIO)) - applog.info("Error reading {}, count {}, errno {}", db_prefix+name+keys_fname, count, errno); - break; - } - } - count++; - char * sp = strchr(buf,','); - *sp++=0; - Index ind{.index=int(fpos/(sizeof(buf)-1))}; - strncpy(ind.key, buf, sizeof(ind.key)); - sscanf(sp, "%jd,%zu", &ind.vfpos, &ind.vsz); - if (trace_level & (1 << ETrace::FILEIO)) - applog.info("{} [{}, {}, {}, {}] of index {}", ind.vfpos==index_deleted_marker ? "Skipping deleted" : "Yielding", ind.index, ind.vfpos, ind.key, ind.vsz, name+keys_fname); - if (ind.vfpos!=index_deleted_marker) - co_yield ind; - fpos += sizeof(buf)-1; - } - } int delete_index = false; Generator co_index_locked = index_revolver(false, delete_index); Generator co_index_unlocked = index_revolver(true, delete_index); @@ -438,7 +420,7 @@ struct Table : Stats { while (true) { auto [index, key, vfpos, vsz] = locked ? co_index_locked() : co_index_unlocked(); - if (vfpos!=index_end_marker) // reached the end, must roll over + if (vfpos!=Index::index_end_marker) // reached the end, must roll over keys.insert(key); else if ((max_count = -index) == 0) @@ -451,7 +433,7 @@ struct Table : Stats { for (auto& key : keys) s += key + "\n"; if (trace_level & (1 << ETrace::SERVER)) - applog.info("list: {:}", s); + applog.info("list: {}", s); return s; } auto get(const std::string &key, std::string &value, bool reentered=false, bool remove=false) @@ -459,9 +441,10 @@ struct Table : Stats { Lock l(lock_cache, reentered); auto x = xref.begin(); int problems = 0; - char buf[key_len]; - off_t fpos_values = index_end_marker; + char buf[Index::key_len]; + off_t fpos_values = Index::index_end_marker; size_t sz; + bool found = true; if (key=="") { if (remove) @@ -492,7 +475,7 @@ struct Table : Stats { size_t sz; sscanf(sp, "%jd,%zu", &fpos_values, &sz); lseek(fid_keys, fpos_keys, SEEK_SET); - fpos_values = index_deleted_marker; + fpos_values = Index::index_deleted_marker; sprintf(buf, "%s,%jd,%zu,", key.c_str(), fpos_values, sz); len = strlen(buf); if (write(fid_keys, buf, len) != (ssize_t)len) @@ -511,7 +494,7 @@ struct Table : Stats { else gets++; if (trace_level & (1 << ETrace::CACHE)) - applog.info("{:} {:} {:} problems {}", remove ? "remove" : "get: ", key=="" ? "" : key, value, problems); + applog.info("{} {} {} problems {}", remove ? "remove" : "get: ", key=="" ? "" : key, value, problems); } else { @@ -531,39 +514,69 @@ struct Table : Stats { if (!strcmp(buf,key.c_str())) { sscanf(sp, "%jd,%zu", &fpos_values, &sz); - if (fpos_values != index_deleted_marker) + if (fpos_values != Index::index_deleted_marker) break; // key found in index file } fpos_keys = lseek(fid_keys, 0, SEEK_CUR); } - if (fpos_values!=index_end_marker) // Load key from index file + if (fpos_values!=Index::index_end_marker) // Load key from index file { if (remove) + { + lseek(fid_keys, fpos_keys, SEEK_SET); + auto len = read(fid_keys, buf, sizeof(buf)-1); + if (len==sizeof(buf)-1) + { + char * sp = strchr(buf,','); + *sp++=0; + len = sp-buf-1; + size_t sz; + sscanf(sp, "%jd,%zu", &fpos_values, &sz); + lseek(fid_keys, fpos_keys, SEEK_SET); + fpos_values = Index::index_deleted_marker; + sprintf(buf, "%s,%jd,%zu,", key.c_str(), fpos_values, sz); + len = strlen(buf); + if (write(fid_keys, buf, len) != (ssize_t)len) + problems |= (1<<0); // Cannot write to keys file + len = sizeof(buf)-1-len-1; + sprintf(buf, "%*c\n", int(len), ' '); + len++; + if (write(fid_keys, buf, len) != (ssize_t)len) + problems |= (1<<1); // Cannot write to keys file + } + entries--; if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("get: (remove) {:} {:} {:}", key, value, problems); - lseek(fid_values, fpos_values, SEEK_SET); - value.resize(sz); - if (read(fid_values, (char*)value.c_str(), sz) != (ssize_t)sz) - problems |= (1<<3); // Cannot read from values file + applog.info("get: (remove) {} {} {}", key, value, problems); + } else { - evict(); - values.push_front({value, fpos_values, sz}); - keys.push_front({buf, fpos_keys, values.begin()}); - x = xref.insert_or_assign(key, keys.begin()).first; - if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("get: (cachefill) {:} {:} {:}", key, value, problems); + lseek(fid_values, fpos_values, SEEK_SET); + //value.resize(sz); + std::string v(sz, 0); + if (read(fid_values, (char*)v.c_str(), sz) != (ssize_t)sz) + problems |= (1<<3); // Cannot read from values file + else + { + evict(); + value = v; + values.push_front({value, fpos_values, sz}); + keys.push_front({buf, fpos_keys, values.begin()}); + x = xref.insert_or_assign(key, keys.begin()).first; + if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) + applog.info("get: (cachefill) {} {} {}", key, value, problems); + } } } else { + found = false; x = xref.end(); if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("get: key {:} not found", key); + applog.info("get: key {} not found", key); } } struct RV{bool found; decltype(x) it; }; - return RV{x != xref.end(), x}; + return RV{found, x}; } bool set(const std::string &key, const std::string &val, bool update) { @@ -576,7 +589,7 @@ struct Table : Stats { if (!update || val != old_val) // not found, or found different for update { bool overwrite = false; - char buf[key_len]; + char buf[Index::key_len]; if (!found) // key not in cache and not in file { if (update) @@ -585,7 +598,7 @@ struct Table : Stats { { evict(); off_t fpos_keys = lseek(fid_keys, 0, SEEK_END); - off_t fpos_values = index_end_marker; + off_t fpos_values = Index::index_end_marker; //size_t sz; fpos_values = lseek(fid_values, 0, SEEK_END); values.push_front({val, fpos_values, 0}); @@ -646,14 +659,14 @@ struct Table : Stats { } } if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("set: {:} {:} {:} problems: {:}, result: {:}", branch, key, val, problems, rv); + applog.info("set: {} {} {} problems: {}, result: {}", branch, key, val, problems, rv); return rv; } - operator sstring() const + operator std::string() const { return sstring(VERSION) + "\n" + "table:" + name + "\n" + - Stats::operator::sstring() + + Stats::operator::std::string() + format( "index entries:{}\n" "cache_entries:{}\n" @@ -669,105 +682,111 @@ struct Table : Stats { spaces ); } - static auto selftest(int level) + static bool self_test(int test, int loop, std::string &s) { bool ok = true; - std::string s; - s += format("Starting self test {}\n", level); - auto table_name = std::string(Table::master_table_name); - s += "Dropping & using {}\n" + table_name; - auto it_table = tables.find(table_name); - if (it_table == tables.end()) + s += format("Starting self test {}, id {}\n", test, self_tests++); + if (loop>1) { - it_table = tables.emplace(table_name, new Table(table_name)).first; - auto &table = *it_table->second; - s += "Using table " + table_name + ".\n"; - s += table.purge(true); - s += table.close(true); - Table::tables.erase(it_table); - s += "Dropping table " + table_name + ".\n"; - it_table = tables.emplace(table_name, new Table(table_name)).first; - s += "(Re)create table " + table_name + ".\n"; - } - auto &table = *it_table->second; - std::string keys[] = {"aaa", "bbb", "ccc", "null"}; - std::string values0[] = {"test_aaa\n", "test_bbb\n", "test_ccc\n", ""}; - for (int i=0; auto key : keys) - if (auto value = values0[i++]; !table.set(key, value, false)) // insert + for (int i=0; isecond; + s += "Using table " + table_name + ".\n"; + s += table.purge(true); + s += table.close(true); + Table::tables.erase(it_table); + s += "Dropping table " + table_name + ".\n"; + it_table = tables.emplace(table_name, new Table(table_name)).first; + s += "(Re)create table " + table_name + ".\n"; } - if (value!=values0[i]) + auto &table = *it_table->second; + std::string keys[] = {"aaa", "bbb", "ccc", "null"}; + std::string values0[] = {"test_aaa\n", "test_bbb\n", "test_ccc\n", ""}; + for (int i=0; auto key : keys) + if (auto value = values0[i++]; !table.set(key, value, false)) // insert + { + s += format("Failed to insert {}={}\n", key, value); + ok = false; + } + for (int i=0; auto key : keys) { - s += format("Unexpected value for key {}={} <> {}\n", key, value, values0[i]); - ok = false; + std::string value; + if (!table.get(key, value).found) // read + { + s += format("Failed to retrieve {}\n", key); + ok = false; + } + if (value!=values0[i]) + { + s += format("Unexpected value for key {}={} <> {}\n", key, value, values0[i]); + ok = false; + } + i++; } - i++; - } - for (int i=0; auto key : keys) - if (auto value = values0[i++]; table.set(key, value, false)) // overinsert + for (int i=0; auto key : keys) + if (auto value = values0[i++]; table.set(key, value, false)) // overinsert + { + s += format("Failed to prevent overinsertion on pre-existing key {}={}\n", key, value); + ok = false; + } + std::string values1[] = {"test_AAAA\n", "test_BBB\n", "test_CC\n", "text_NotNull\n"}; + for (int i=0; auto key : keys) + if (auto value = values1[i++]; !table.set(key, value, true)) // update + { + s += format("Failed to update existing key {}={}\n", key, value); + ok = false; + } + if (auto key = "ddd", value="text_ddd"; table.set(key, value, true)) // update inexistent key { - s += format("Failed to prevent overinsertion on pre-existing key {}={}\n", key, value); + s += format("Failed to prevent updating of inexistent key {}={}\n", key, value); ok = false; } - std::string values1[] = {"test_AAAA\n", "test_BBB\n", "test_CC\n", "text_NotNull\n"}; - for (int i=0; auto key : keys) - if (auto value = values1[i++]; !table.set(key, value, true)) // update + for (int i=0; auto key : keys) { - s += format("Failed to update existing key {}={}\n", key, value); - ok = false; + if (std::string value; !table.get(key, value).found || value!=values1[i]) + { + s += format("Unexpected value for key {}={}, expected {}\n", key, value, values1[i]); + ok = false; + } + i++; } - if (auto key = "ddd", value="text_ddd"; table.set(key, value, true)) // update inexistent key - { - s += format("Failed to prevent updating of inexistent key {}={}\n", key, value); - ok = false; - } - for (int i=0; auto key : keys) - { - if (std::string value; !table.get(key, value).found || value!=values1[i]) + if (table.spaces==0) + s += format("Table {} expected to have {} internal fragmentation\n", table.name, "non-zero"); + s += table.compact(); // Compacting must reorder the values file. + for (int i=0; auto key : keys) { - s += format("Unexpected value for key {}={}, expected {}\n", key, value, values1[i]); - ok = false; + if (i%2) // delete every second key + if (std::string value; !table.get(key, value, false, true).found) // delete + { + s += format("Delete failed for key {}={}, expected {}\n", key, value, values1[i]); + ok = false; + } + i++; } - i++; - } - if (table.spaces==0) - s += format("Table {} expected to have {} internal fragmentation\n", table.name, "non-zero"); - - s += table.compact(); // Compacting must reorder the values file. - - for (int i=0; auto key : keys) - { - if (std::string value; !table.get(key, value, false, true).found) // delete + s += table.compact(); // Compacting remove all index entries marked as "deleted" and reorders the value file. + if (auto count = (sizeof(keys)/sizeof(keys[0])+1) / 2; table.entries != count) { - s += format("Delete failed for key {}={}, expected {}\n", key, value, values1[i]); + s += format("Unexpected number of keys in table {}: {}, expected {}\n", table.name, table.entries, count); ok = false; } - i++; - break; // do just one delete + s += table.list(true); // revolve though index keys once } - - s += table.compact(); // Compacting remove all index entries marked as "deleted" and reorders the value file. - - if (auto count = sizeof(keys)/sizeof(keys[0]) - 1; table.entries != count) - { - s += format("Unexpected number of keys in table {}: {}, expected {}\n", table.name, table.entries, count); - ok = false; - } - - s += table.list(true); // revolve though index keys once - - s += format("Self test {} {}\n", level, ok ? "passed" : "failed"); - return s; + s += format("Self test {} {}\n", test, ok ? "passed" : "failed") + Stats::get_static_profiles(); + return ok; } bool get_file(std::string &val, bool keys) { @@ -782,11 +801,8 @@ struct Table : Stats { lseek(fid, 0, SEEK_SET); return ::read(fid, (char*)val.c_str(), sz) == sz; } + static std::atomic_bool tables_lock; // One self-test through private: - constexpr static size_t key_len = 256+1 +20+10+1+1; // key,int64,int32\n0 - constexpr static int index_end_marker = -1; - constexpr static int index_deleted_marker = -2; - std::atomic_bool lock_fio = false; // file lock: mutually exclussive readers and writers std::atomic_bool lock_cache = false; // cache lock: shared readers, exclusive writers std::atomic_int readers = 0; // count of concurrent readers @@ -798,9 +814,72 @@ struct Table : Stats { std::deque values; std::deque keys; std::map::iterator> xref; + + std::string evict() + { + if (keys.size() == max_cache) + { + auto key = keys.back().text; + xref.erase(xref.find(key)); + keys.pop_back(); + values.pop_back(); // Eviction + if (trace_level & (1 << ETrace::CACHE)) + applog.info("evict key {}", key); + evictions++; + return "Eviction of key " + key; + } + return "Evition not required"; + } + // Tried to use seastar::coroutine::experimental::generator + Generator index_revolver(bool locked, int &remove) + { + off_t fpos = 0; + int count = 0; + while (true) + { + char buf[Index::key_len]; + { + Lock l(lock_cache, locked); + lseek(fid_keys, fpos, SEEK_SET); + auto len = read(fid_keys, buf, sizeof(buf)-1); + if (len==0) + { + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("Reached the end of {}, count {}", db_prefix+name+keys_fname, count); + co_yield Index{.index = -count, .vfpos = Index::index_end_marker, .vsz = 0}; + fpos = 0; + count = 0; + continue; + } + if (len<0) + { + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("Error reading {}, count {}, errno {}", db_prefix+name+keys_fname, count, errno); + break; + } + } + count++; + char * sp = strchr(buf,','); + *sp++=0; + Index ind{.index=int(fpos/(sizeof(buf)-1))}; + strncpy(ind.key, buf, sizeof(ind.key)); + sscanf(sp, "%jd,%zu", &ind.vfpos, &ind.vsz); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("{} [{}, {}, {}, {}] of index {}", + ind.vfpos==Index::index_deleted_marker ? "Skipping deleted" : "Yielding", + ind.index, + ind.vfpos, + ind.key, + ind.vsz, + db_prefix+name+keys_fname); + if (ind.vfpos!=Index::index_deleted_marker) + co_yield ind; + fpos += sizeof(buf)-1; + } + } }; std::map Table::tables; -std::atomic_bool tables_lock = false; +std::atomic_bool Table::tables_lock = false; class DefaultHandle : public httpd::handler_base { public: @@ -810,7 +889,7 @@ class DefaultHandle : public httpd::handler_base { { sstring s; s += plain_text ? - format("{:}.{:}\n", VERSION) + + format("{}.{}\n", VERSION) + format("Global commands\n") : sstring("

") + VERSION + "

\n" + @@ -831,10 +910,10 @@ class DefaultHandle : public httpd::handler_base { }; for (auto arg : args_global) s += plain_text ? - format("{:}: {:}/{:}\n", arg.label, host, arg.str) : - sstring("") + arg.label + ": " + host + "/" + arg.str + "
\n"; + format("{}: {}/{}\n", arg.label, host, arg.str) : + sstring("") + arg.label + ": " + arg.str + "
\n"; s += plain_text ? - format("Commands for table: {:}\n", table_name) : + format("Commands for table: {}\n", table_name) : sstring("

\n

Commands for table: " + table_name + " 

\n" "For any of the following commands to work, a table must be created, or opened if it exists, with the ?use REST command.\n" "

"); @@ -889,20 +968,22 @@ class DefaultHandle : public httpd::handler_base { surl = tmp.substr(0, sl-tmp.c_str()); } s += plain_text ? - format("{:}: {:}/{:}\n", arg.label, surl, arg.str) : + format("{}: {}/{}\n", arg.label, surl, arg.str) : sstring("") + arg.label + ": " + arg.str + "
\n"; } struct {const char*label, *str; } args_tests[] = { - {"simple insert/update/delete", "?selftest=0"}, - {"poop insert/update/delete", "?selftest=1"}, + {"Test1 insert/update/delete", "?self_test=1"}, + {"Test1*10 insert/update/delete", "?self_test=1&loop=10"}, + {"Test1*100 insert/update/delete", "?self_test=1&loop=100"}, + {"Test1*1000 insert/update/delete", "?self_test=1&loop=1000"}, }; s += plain_text ? format("Self tests:\n") : sstring("

\n

Self tests:"" 

\n"); for (auto arg : args_tests) s += plain_text ? - format("{:}: {:}/{:}\n", arg.label, host, arg.str) : + format("{}: {}/{}\n", arg.label, host, arg.str) : sstring("") + arg.label + ": " + arg.str + "
\n"; s += plain_text ? "" : @@ -956,7 +1037,7 @@ class DefaultHandle : public httpd::handler_base { } else if (req->query_parameters.contains("use")) { - Lock l(tables_lock); + Lock l(Table::tables_lock); it_table = Table::tables.find(table_name); if (it_table == Table::tables.end()) { @@ -966,29 +1047,33 @@ class DefaultHandle : public httpd::handler_base { } else if (req->query_parameters.contains("used")) { - Lock l(tables_lock); + Lock l(Table::tables_lock); for (auto t : Table::tables) s += t.first + "\n"; } - else if (req->query_parameters.contains("selftest")) + else if (req->query_parameters.contains("self_test")) { - auto level = req->query_parameters.at("selftest"); + auto test = req->query_parameters.at("self_test"); + int tn; + sscanf(test.c_str(),"%d", &tn); + auto loop = req->query_parameters.contains("loop") ? req->query_parameters.at("loop") : "1"; int l; - sscanf(level.c_str(),"%d", &l); - std::string result = Table::selftest(l); + sscanf(loop.c_str(),"%d", &l); + std::string text; + bool result = Table::self_test(tn, l, text); std::string::size_type n = 0; const std::string rwhat = "\n"; const std::string rwith = "
\n"; - while ((n = result.find(rwhat, n)) != std::string::npos) + while ((n = text.find(rwhat, n)) != std::string::npos) { - result.replace( n, rwhat.size(), rwith); + text.replace( n, rwhat.size(), rwith); n += rwith.size(); } - s += result; + s += text; } else { { - Lock l(tables_lock); + Lock l(Table::tables_lock); it_table = Table::tables.find(table_name); if (it_table == Table::tables.end()) s += "Table " + table_name + " is not in use.\n"; @@ -1011,7 +1096,7 @@ class DefaultHandle : public httpd::handler_base { "LockPasses:{}\n" "LockCollisions:{}\n" , - (sstring)table, + (std::string)table, Lock::passes, Lock::collisions); else if (req->query_parameters.contains("drop")) @@ -1032,7 +1117,7 @@ class DefaultHandle : public httpd::handler_base { table.max_cache = new_max_cache; } s += sstring(s.length() > 0 ? "\n" : "") + format( - "Changing max_cache from {:} to {:}", old_max_cache, new_max_cache); + "Changing max_cache from {} to {}", old_max_cache, new_max_cache); } else if (req->query_parameters.contains("file")) { @@ -1046,7 +1131,7 @@ class DefaultHandle : public httpd::handler_base { else if (req->query_parameters.contains("rownext")) { auto [index, key, fpos, sz] = table.co_index_locked(); - s = format("test index {:}, key:{:}, valpos:{:}, valsz:{:}", index, key, fpos, sz); + s = format("test index {}, key:{}, valpos:{}, valsz:{}", index, key, fpos, sz); } else if (req->query_parameters.contains("op")) { @@ -1083,7 +1168,7 @@ void set_routes(routes& r) { std::string s = "Server shutting down"; exit(0); if (trace_level & (1 << ETrace::SERVER)) - applog.info("{:}", s); + applog.info("{}", s); return s; }); r.add_default_handler(&defaultHandle); @@ -1092,7 +1177,7 @@ void set_routes(routes& r) { } int main(int ac, char** av) { - applog.info("Db demo {:}", VERSION); + applog.info("Db demo {}", VERSION); httpd::http_server_control prometheus_server; prometheus::config pctx; app_template app; From 54dbf69eaaa9d2dc033ed2e0ea0164445bb2046d Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Sun, 14 Apr 2024 09:30:25 +0300 Subject: [PATCH 12/19] Table::Index::access is the new, low-level, file IO method. All file IO code should be reduced to this. Much better trace messages. Self tests. Corrections so that the self tests pass. --- demos/db_demo.cc | 593 +++++++++++++++++++++++++---------------------- 1 file changed, 312 insertions(+), 281 deletions(-) diff --git a/demos/db_demo.cc b/demos/db_demo.cc index 064e56fe9ee..ccf6a986977 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -60,6 +60,7 @@ * - To keep the index human-readable, a CSV format was chosen: (key-name,off_values,size_value, padding). * - This format implies that keys must not contain comma characters. * - The empty string in queries has special meaning. Keys cannot be empty, values can. + * - Cache is currently WRITETHROUGH. */ #include @@ -83,10 +84,10 @@ namespace bpo = boost::program_options; using namespace seastar; using namespace httpd; -const char*VERSION="Demo Database Server 0.3"; -const char* available_trace_levels[] = {"LOCKS", "FILEIO", "CACHE", "SERVER"}; -enum ETrace { LOCKS, FILEIO, CACHE, SERVER, MAX}; -int trace_level = (1 << ETrace::FILEIO) | (1 << ETrace::CACHE) | (1 << ETrace::SERVER); +const char*VERSION="Demo Database Server 0.4"; +const char* available_trace_levels[] = {"LOCKS", "FILEIO", "CACHE", "SERVER", "TEST"}; +enum ETrace { LOCKS, FILEIO, CACHE, SERVER, TEST, MAX}; +int trace_level = (1 << ETrace::FILEIO) | (1 << ETrace::CACHE) | (1 << ETrace::SERVER) | (1 << ETrace::TEST); logger applog("app"); // Tried to use seastar::coroutine::experimental::generator. @@ -163,13 +164,13 @@ struct Lock while (!atomic_compare_exchange_strong(&value, &expected, true)) collisions++; passes++; - if (trace_level & (1 << ETrace::LOCKS)) applog.info("Locked"); + if (trace_level & (1 << ETrace::LOCKS)) applog.info("LOCKS: Locked"); } ~Lock() { if (reentered) return; - if (trace_level & (1 << ETrace::LOCKS)) applog.info("Unlocked"); + if (trace_level & (1 << ETrace::LOCKS)) applog.info("LOCKS: Unlocked"); value = false; } static std::atomic_int passes; @@ -252,21 +253,123 @@ struct Table : Stats { { std::string text; off_t fpos; - size_t sz; + ssize_t sz; }; struct Key { std::string text; - long long fpos; + off_t fpos; std::deque::iterator it_value; }; struct Index { - int index; char key[256]; off_t vfpos; size_t vsz; - constexpr static size_t key_len = 256+1 +20+10+1+1; // key,int64,int32\n0 - constexpr static int index_end_marker = -1; - constexpr static int index_deleted_marker = -2; - auto access(int fid, bool write) {return *this; } + int index; + char key[256]; + off_t vfpos; + ssize_t vsz; + constexpr static size_t entry_sz = 256 + 44; // 300 = key,int64,int32,extra\n0 + constexpr static off_t end_marker = -1; + constexpr static off_t deleted_marker = -2; + + auto access_value(int fid_values, off_t vpos, std::string *value, std::string &table_name, bool write) + { + sstring msg; + if (write) + { + if (value!=nullptr && value->length()>0) + { + vsz = value->length(); + vfpos = lseek(fid_values, 0 , SEEK_END); + if (::write(fid_values, value->c_str(), vsz) != vsz) + msg+=format(", Error {} writing values file fid:{}", errno, fid_values); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("FILEIO: Value write {}{}", *value, msg); + } + } + else + { + if (value!=nullptr && vfpos>=0 && vsz>0) + { + lseek(fid_values, vfpos, SEEK_SET); + value->resize(vsz, 0); + if (::read(fid_values, (char*)value->c_str(), vsz) != vsz) + msg+=format(", Error {} reading values filefid:{}", errno, fid_values); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("FILEIO: Value write {}{}", *value, msg); + } + } + } + auto access(int fid_keys, int fid_values, std::string *value, std::string &table_name, bool write) + { + auto fname = db_prefix+table_name+keys_fname; + char buf[entry_sz+1]; + ssize_t len = 0; + sstring msg; + if (write) + { + access_value(fid_values, vfpos, value, table_name, write); + auto fpos_keys = lseek(fid_keys, index * entry_sz, SEEK_SET); + sprintf(buf, "%s,%jd,%zu,", key, vfpos, vsz); + len = strlen(buf); + sprintf(buf+len, "%*c\n", int(Index::entry_sz-1-len), ' '); + lseek(fid_keys, fpos_keys, SEEK_SET); + if (::write(fid_keys, buf, Index::entry_sz) != Index::entry_sz) + msg+=format(", Error {} writing keys file", errno); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("FILEIO: Index write {}[{}] {}{} {}{}", fname, index, key, value==nullptr ? "" : ("=" + *value), vfpos == deleted_marker ? ", deleted" : "", msg); + } + else + { + auto fpos_keys = lseek(fid_keys, 0, SEEK_CUR); + auto fpos_next = fpos_keys; + index = fpos_keys / entry_sz; + int deleted_keys = 0; + vfpos = end_marker; + len = ::read(fid_keys, buf, Index::entry_sz); + if (len<0) + msg+=format(", Error1 {} reading keys file", errno); + else if (len==0) + msg+=format(", EIF at {}", fpos_keys); + else if (len!=Index::entry_sz) + msg+=format(", Could not read a full index line, errno:{}", errno); + else while (len==Index::entry_sz) + { + char * sp = strchr(buf,','); + strncpy(key, buf, sp-buf); + key[sp-buf]=0; + sscanf(sp+1, "%jd,%zu", &vfpos, &vsz); + if (vfpos!=Index::deleted_marker) + break; + vfpos = end_marker; + deleted_keys++; + char buf_next[Index::entry_sz+1]; + fpos_next += Index::entry_sz; + auto len = ::read(fid_keys, buf_next, Index::entry_sz); + if (len<0) + { + msg+=format(", Error2 {} reading keys file", errno); + break; + } + if (len==0) // end of index file + { + msg+=format(", EIF at {}", fpos_keys); + ftruncate(fid_keys, fpos_keys); + break; + } + lseek(fid_keys, fpos_keys, SEEK_SET); + ::write(fid_keys, buf_next, Index::entry_sz); // Shift the next index entry up by one. + lseek(fid_keys, fpos_next, SEEK_SET); + ::write(fid_keys, buf, Index::entry_sz); // Swap curent and next index entries. + memcpy(buf, buf_next, Index::entry_sz); + } + access_value(fid_values, vfpos, value, table_name, write); + if (deleted_keys>0) + msg+=format(" compacted {} index entries", deleted_keys); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("FILEIO: index read {}[{}] {}{}{}", fname, index, key, value==nullptr ? "" : ("=" + *value), msg); + } + return *this; + } }; Table(Table const &) = delete; @@ -275,10 +378,10 @@ struct Table : Stats { { fid_keys = open((db_prefix+name+keys_fname).c_str(), O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); if (trace_level & (1 << ETrace::FILEIO)) - applog.info("Opened {} returned {}, {}", db_prefix+name+keys_fname, fid_keys, errno); + applog.info("FILEIO: Opened {} returned {}, {}", db_prefix+name+keys_fname, fid_keys, errno); fid_values = open((db_prefix+name+values_fname).c_str(), O_CREAT | O_RDWR, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); if (trace_level & (1 << ETrace::FILEIO)) - applog.info("Opened {} returned {}", name+keys_fname, fid_values, errno); + applog.info("FILEIO: Opened {} returned {}", name+keys_fname, fid_values, errno); creates++; } std::string close(bool remove_files) @@ -288,12 +391,12 @@ struct Table : Stats { if (fid_values>0) ::close(fid_values); if (!remove_files) - return "Closed files " + (db_prefix+name+keys_fname) + " and " + (db_prefix+name+values_fname) + "\n"; + return "Closed files " + (db_prefix+name+keys_fname) + " and " + (db_prefix+name+values_fname); drops++; unlink((db_prefix+name+keys_fname).c_str()); unlink((db_prefix+name+values_fname).c_str()); unlink((db_prefix+name+compact_fname).c_str()); - return "Removed files " + (db_prefix+name+keys_fname) + " and " + (db_prefix+name+values_fname) + "\n"; + return "Removed files " + (db_prefix+name+keys_fname) + " and " + (db_prefix+name+values_fname); } std::string purge(bool files) { @@ -301,108 +404,67 @@ struct Table : Stats { values.clear(); keys.clear(); xref.clear(); - std::string s=""; + std::string s = "Purged cache"; if (files) { - s = "Purged cache and files"; + s += " and files"; entries = 0; spaces = 0; ftruncate(fid_values, 0); ftruncate(fid_keys, 0); purges++; } - else - s = "Purged cache"; invalidates++; if (trace_level & ((1 << ETrace::CACHE) | (1 << ETrace::FILEIO))) - applog.info("purge: cache{}", files ? " and files" : ""); - return s + "\n"; + applog.info("CACHE|FILEIO: purge cache{}", files ? " and files" : ""); + return s; } std::string compact() { Lock l(lock_cache); std::string s = purge(false); - int problems = 0; + sstring msg; auto fid_temp = open((db_prefix+name+compact_fname).c_str(), O_CREAT | O_TRUNC | O_RDWR /*| O_TMPFILE*/, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); if (fid_temp>0) { - off_t fpos_keys = 0; - off_t fpos_values = 0; - off_t fpos_temp = 0; - char buf[Index::key_len]; lseek(fid_keys, 0, SEEK_SET); + int deleted = 0; + int index = 0; while (true) { - auto len = read(fid_keys, buf, sizeof(buf)-1); - if (len==0) - break; // end of index file - if (len<0) - { - problems |= (1<<0); + Index entry; + std::string value; + entry.access(fid_keys, fid_values, &value, name, false); // read entry + if (entry.vfpos == Index::end_marker) break; - } - __L: - char * sp = strchr(buf,','); - size_t key_len = sp-buf; - size_t sz; - sscanf(sp+1, "%jd,%zu", &fpos_values, &sz); - if (fpos_values==Index::index_deleted_marker) - { - char buf_next[Index::key_len]; - - auto len = read(fid_keys, buf_next, sizeof(buf_next)-1); - if (len==0) - { - ftruncate(fid_keys, fpos_keys); - break; // end of index file - } - lseek(fid_keys, fpos_keys, SEEK_SET); - write(fid_keys, buf_next, sizeof(buf_next)-1); // Shift the next index entry up by one. - write(fid_keys, buf, sizeof(buf)-1); // Swap curent and next index entries. - memcpy(buf, buf_next, sizeof(buf)); - goto __L; - } - { - std::string val(sz, 0); - lseek(fid_values, fpos_values, SEEK_SET); - read(fid_values, (char*)val.c_str(), sz); - write(fid_temp, val.c_str(), sz); - } - sprintf(buf+key_len+1, "%jd,%zu,", fpos_temp, sz); - len = strlen(buf); - auto pad = sizeof(buf)-1-len-1; - sprintf(buf+len, "%*c\n", int(pad), ' '); - lseek(fid_keys, fpos_keys, SEEK_SET); - write(fid_keys, buf, sizeof(buf)-1); - fpos_keys += sizeof(buf)-1; - fpos_temp += sz; + entry.index = index++; + entry.access(fid_keys, fid_temp, &value, name, true); // write entry } - ftruncate(fid_keys, fpos_keys); lseek(fid_temp, 0, SEEK_SET); lseek(fid_values, 0, SEEK_SET); - while (true) + char buf[0x1000]; + while (auto len = ::read(fid_temp, buf, Index::entry_sz)) { - auto len = read(fid_temp, buf, sizeof(buf)-1); if (len==0) - break; // end of temporary values file + break; // end of temp values file if (len<0) { - problems |= (1<<1); + msg+=format(", Error {} reading temp values file", errno); break; } - write(fid_values, buf, sizeof(buf)-1); - fpos_values += sizeof(buf)-1; + ::write(fid_values, buf, len); } - ftruncate(fid_values, fpos_temp); + ftruncate(fid_values, lseek(fid_values, 0, SEEK_CUR)); ::close(fid_temp); unlink((db_prefix+name+compact_fname).c_str()); compacts++; spaces=0; + s = format("Compacted index to {} entries. ", index) + s; } else - problems |= (1<<3); + msg+=format(", Error {} creating temp values file", errno); if (trace_level & (1 << ETrace::FILEIO)) - applog.info("compacted: {}, problems: {}, errno: {}", db_prefix+name+compact_fname, problems, errno); + applog.info("FILEIO: {}{}{}", s, db_prefix+name+compact_fname, msg); return s; } @@ -419,12 +481,14 @@ struct Table : Stats { int max_count = std::numeric_limits::max(); while (true) { - auto [index, key, vfpos, vsz] = locked ? co_index_locked() : co_index_unlocked(); - if (vfpos!=Index::index_end_marker) // reached the end, must roll over - keys.insert(key); - else - if ((max_count = -index) == 0) - break; + { + auto [index, key, vfpos, vsz] = locked ? co_index_locked() : co_index_unlocked(); + if (vfpos!=Index::end_marker) // reached the end, must roll over + keys.insert(key); + else + if ((max_count = -index) == 0) + break; + } if (++count > max_count) break; } @@ -432,29 +496,25 @@ struct Table : Stats { std::string s; for (auto& key : keys) s += key + "\n"; - if (trace_level & (1 << ETrace::SERVER)) - applog.info("list: {}", s); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("FILEIO: list: {}", s); return s; } auto get(const std::string &key, std::string &value, bool reentered=false, bool remove=false) { Lock l(lock_cache, reentered); auto x = xref.begin(); - int problems = 0; - char buf[Index::key_len]; - off_t fpos_values = Index::index_end_marker; - size_t sz; bool found = true; if (key=="") { - if (remove) + if (remove) // clear the cache purge(false); - else + else // list cache content { for (auto &x : xref) value += x.first + "=" + x.second->it_value->text + "\n"; if (trace_level & (1 << ETrace::CACHE)) - applog.info("get: (cache) {}", value); + applog.info("CACHE: get (cache) {}", value); } } else if ((x = xref.find(key)) != xref.end()) @@ -466,26 +526,10 @@ struct Table : Stats { // The revolver coroutine should come to clean-it up. off_t fpos_keys = x->second->fpos; lseek(fid_keys, fpos_keys, SEEK_SET); - auto len = read(fid_keys, buf, sizeof(buf)-1); - if (len==sizeof(buf)-1) - { - char * sp = strchr(buf,','); - *sp++=0; - len = sp-buf-1; - size_t sz; - sscanf(sp, "%jd,%zu", &fpos_values, &sz); - lseek(fid_keys, fpos_keys, SEEK_SET); - fpos_values = Index::index_deleted_marker; - sprintf(buf, "%s,%jd,%zu,", key.c_str(), fpos_values, sz); - len = strlen(buf); - if (write(fid_keys, buf, len) != (ssize_t)len) - problems |= (1<<0); // Cannot write to keys file - len = sizeof(buf)-1-len-1; - sprintf(buf, "%*c\n", int(len), ' '); - len++; - if (write(fid_keys, buf, len) != (ssize_t)len) - problems |= (1<<1); // Cannot write to keys file - } + Index entry; + entry.access(fid_keys, fid_values, nullptr, name, false); // Read index entry from file + entry.vfpos = Index::deleted_marker; + entry.access(fid_keys, fid_values, nullptr, name, true); // Write index entry back to file values.erase(x->second->it_value); keys.erase(x->second); xref.erase(x); @@ -494,77 +538,40 @@ struct Table : Stats { else gets++; if (trace_level & (1 << ETrace::CACHE)) - applog.info("{} {} {} problems {}", remove ? "remove" : "get: ", key=="" ? "" : key, value, problems); + applog.info("CACHE: get {} {} {}", remove ? "(remove)" : "", key=="" ? "" : key, value); } else { - off_t fpos_keys = lseek(fid_keys, 0, SEEK_SET); + lseek(fid_keys, 0, SEEK_SET); + Index entry; while (true) { - auto len = read(fid_keys, buf, sizeof(buf)-1); - if (len==0) - break; // end of index file - if (len != sizeof(buf)-1) - { - problems |= (1<<2); // didn't read enough + entry.access(fid_keys, fid_values, nullptr, name, false); // Read index entry from file + if (entry.vfpos==Index::end_marker) + break; + if (key==entry.key) break; - } - char * sp = strchr(buf,','); - *sp++=0; - if (!strcmp(buf,key.c_str())) - { - sscanf(sp, "%jd,%zu", &fpos_values, &sz); - if (fpos_values != Index::index_deleted_marker) - break; // key found in index file - } - fpos_keys = lseek(fid_keys, 0, SEEK_CUR); } - if (fpos_values!=Index::index_end_marker) // Load key from index file + if (entry.vfpos != Index::end_marker) { if (remove) { - lseek(fid_keys, fpos_keys, SEEK_SET); - auto len = read(fid_keys, buf, sizeof(buf)-1); - if (len==sizeof(buf)-1) - { - char * sp = strchr(buf,','); - *sp++=0; - len = sp-buf-1; - size_t sz; - sscanf(sp, "%jd,%zu", &fpos_values, &sz); - lseek(fid_keys, fpos_keys, SEEK_SET); - fpos_values = Index::index_deleted_marker; - sprintf(buf, "%s,%jd,%zu,", key.c_str(), fpos_values, sz); - len = strlen(buf); - if (write(fid_keys, buf, len) != (ssize_t)len) - problems |= (1<<0); // Cannot write to keys file - len = sizeof(buf)-1-len-1; - sprintf(buf, "%*c\n", int(len), ' '); - len++; - if (write(fid_keys, buf, len) != (ssize_t)len) - problems |= (1<<1); // Cannot write to keys file - } + entry.vfpos = Index::deleted_marker; + entry.access(fid_keys, fid_values, nullptr, name, true); // Write index entry back to file entries--; if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("get: (remove) {} {} {}", key, value, problems); + applog.info("CACHE|FILEIO: get (remove) {} {}", key, value); } else { - lseek(fid_values, fpos_values, SEEK_SET); - //value.resize(sz); - std::string v(sz, 0); - if (read(fid_values, (char*)v.c_str(), sz) != (ssize_t)sz) - problems |= (1<<3); // Cannot read from values file - else - { - evict(); - value = v; - values.push_front({value, fpos_values, sz}); - keys.push_front({buf, fpos_keys, values.begin()}); - x = xref.insert_or_assign(key, keys.begin()).first; - if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("get: (cachefill) {} {} {}", key, value, problems); - } + entry.access_value(fid_values, entry.vfpos, &value, name, false); + evict(); + off_t fpos_keys = entry.index * Index::entry_sz; + values.push_front({value, entry.vfpos, entry.vsz}); + keys.push_front({key, fpos_keys, values.begin()}); + x = xref.insert_or_assign(key, keys.begin()).first; + if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) + applog.info("CACHE|FILEIO: get (cachefill) {}={}", key, value); } } else @@ -572,7 +579,7 @@ struct Table : Stats { found = false; x = xref.end(); if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("get: key {} not found", key); + applog.info("CACHE|FILEIO: get key {} not found", key); } } struct RV{bool found; decltype(x) it; }; @@ -584,12 +591,12 @@ struct Table : Stats { Lock l(lock_cache, false); std::string old_val; auto [found, x] = get(key, old_val, true); - int problems = 0; + sstring msg; std::string branch = "Skip"; if (!update || val != old_val) // not found, or found different for update { bool overwrite = false; - char buf[Index::key_len]; + char buf[Index::entry_sz+1]; if (!found) // key not in cache and not in file { if (update) @@ -598,8 +605,7 @@ struct Table : Stats { { evict(); off_t fpos_keys = lseek(fid_keys, 0, SEEK_END); - off_t fpos_values = Index::index_end_marker; - //size_t sz; + off_t fpos_values = Index::end_marker; fpos_values = lseek(fid_values, 0, SEEK_END); values.push_front({val, fpos_values, 0}); keys.push_front({key, fpos_keys, values.begin()}); @@ -626,7 +632,7 @@ struct Table : Stats { else { auto sz = oldv.sz; - bool reuse_value_space = val.length() <= sz; + bool reuse_value_space = (ssize_t)val.length() <= sz; off_t fpos_values = 0; if (reuse_value_space) { @@ -638,20 +644,16 @@ struct Table : Stats { sz = val.length(); fpos_values = lseek(fid_values, fpos_values, reuse_value_space ? SEEK_SET : SEEK_END); if (write(fid_values, val.c_str(), val.length()) != (ssize_t)val.length()) - problems |= (1<<0); // Cannot write to values file + msg+=format(", Error {} writing to values file", errno); values.erase(x->second->it_value); values.push_front({val, fpos_values, sz}); sprintf(buf, "%s,%jd,%zu,", key.c_str(), fpos_values, sz); auto len = strlen(buf); auto fpos_keys = x->second->fpos; - lseek(fid_keys, x->second->fpos, SEEK_SET); - if (write(fid_keys, buf, len) != (ssize_t)len) - problems |= (1<<1); // Cannot write to keys file - len = sizeof(buf)-1-len-1; - sprintf(buf, "%*c\n", int(len), ' '); - len++; - if (write(fid_keys, buf, len) != (ssize_t)len) - problems |= (1<<2); // Cannot write to keys file + lseek(fid_keys, fpos_keys, SEEK_SET); + sprintf(buf+len, "%*c\n", int(Index::entry_sz-1-len), ' '); + if (write(fid_keys, buf, Index::entry_sz) != (ssize_t)Index::entry_sz) + msg+=format(", Error {} writing to keys file", errno); keys.erase(x->second); keys.push_front({key, fpos_keys, values.begin()}); x->second = keys.begin(); @@ -659,7 +661,7 @@ struct Table : Stats { } } if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("set: {} {} {} problems: {}, result: {}", branch, key, val, problems, rv); + applog.info("CACHE|FILEIO: set {} {}={}{} {}", branch, key, val, msg, rv ? "ok" : "fail"); return rv; } operator std::string() const @@ -685,7 +687,9 @@ struct Table : Stats { static bool self_test(int test, int loop, std::string &s) { bool ok = true; - s += format("Starting self test {}, id {}\n", test, self_tests++); + sstring t; + #define LOG s+= t+"\n"; if (trace_level & (1 << ETrace::TEST)) applog.info("TEST: {}", t) + t = format("Starting test {}, id {}...", test, self_tests++); LOG; if (loop>1) { for (int i=0; isecond; - s += "Using table " + table_name + ".\n"; - s += table.purge(true); - s += table.close(true); + t = "Using table " + table_name; LOG; + t = table.purge(true); LOG; + t = table.close(true); LOG; Table::tables.erase(it_table); - s += "Dropping table " + table_name + ".\n"; + t = "Dropping table " + table_name; LOG; it_table = tables.emplace(table_name, new Table(table_name)).first; - s += "(Re)create table " + table_name + ".\n"; + t = "(Re)create table " + table_name; LOG; } auto &table = *it_table->second; - std::string keys[] = {"aaa", "bbb", "ccc", "null"}; - std::string values0[] = {"test_aaa\n", "test_bbb\n", "test_ccc\n", ""}; - for (int i=0; auto key : keys) - if (auto value = values0[i++]; !table.set(key, value, false)) // insert + if (test==1) + { + if (!table.set("aaa", "_aaa_", false)) // insert { - s += format("Failed to insert {}={}\n", key, value); + t = format("Failed to insert aaa=_aaa_"); LOG; ok = false; } - for (int i=0; auto key : keys) - { - std::string value; - if (!table.get(key, value).found) // read + if (!table.set("bbb", "_bbb_", false)) // insert { - s += format("Failed to retrieve {}\n", key); + t = format("Failed to insert bbb=_bbb_"); LOG; ok = false; } - if (value!=values0[i]) + if (std::string value; !table.get("aaa", value, false, true).found) // delete { - s += format("Unexpected value for key {}={} <> {}\n", key, value, values0[i]); + t = format("Delete failed for key aaa"); LOG; ok = false; } - i++; } - for (int i=0; auto key : keys) - if (auto value = values0[i++]; table.set(key, value, false)) // overinsert + else + { + std::string keys[] = {"aaa", "bbb", "ccc", "null"}; + std::string values0[] = {"_aaa_", "_bbb_", "_ccc_", ""}; + for (int i=0; auto key : keys) + if (auto value = values0[i++]; !table.set(key, value, false)) // insert (key=value)s + { + t = format("Failed to insert {}={}", key, value); LOG; + ok = false; + } + for (int i=0; auto key : keys) // retrieve values of keys { - s += format("Failed to prevent overinsertion on pre-existing key {}={}\n", key, value); - ok = false; + std::string value; + if (!table.get(key, value).found) // read + { + t = format("Failed to retrieve {}", key); LOG; + ok = false; + } + if (value!=values0[i]) + { + t = format("Unexpected value for key {}={} <> {}", key, value, values0[i]); LOG; + ok = false; + } + i++; } - std::string values1[] = {"test_AAAA\n", "test_BBB\n", "test_CC\n", "text_NotNull\n"}; - for (int i=0; auto key : keys) - if (auto value = values1[i++]; !table.set(key, value, true)) // update + for (int i=0; auto key : keys) + if (auto value = values0[i++]; table.set(key, value, false)) // try to overinsert (key=value)s + { + t = format("Failed to prevent overinsertion on pre-existing key {}={}", key, value); LOG; + ok = false; + } + std::string values1[] = {"_AAAA_", "_BBB_", "_CC_", "_null_"}; + for (int i=0; auto key : keys) + if (auto value = values1[i++]; !table.set(key, value, true)) // update (key=value)s + { + t = format("Failed to update existing key {}={}", key, value); LOG; + ok = false; + } + if (auto key = "ddd", value="_ddd_"; table.set(key, value, true)) // try to update inexistent key { - s += format("Failed to update existing key {}={}\n", key, value); + t = format("Failed to prevent updating of inexistent key {}={}", key, value); LOG; ok = false; } - if (auto key = "ddd", value="text_ddd"; table.set(key, value, true)) // update inexistent key - { - s += format("Failed to prevent updating of inexistent key {}={}\n", key, value); - ok = false; - } - for (int i=0; auto key : keys) - { - if (std::string value; !table.get(key, value).found || value!=values1[i]) + for (int i=0; auto key : keys) { - s += format("Unexpected value for key {}={}, expected {}\n", key, value, values1[i]); - ok = false; - } - i++; - } - if (table.spaces==0) - s += format("Table {} expected to have {} internal fragmentation\n", table.name, "non-zero"); - s += table.compact(); // Compacting must reorder the values file. - for (int i=0; auto key : keys) - { - if (i%2) // delete every second key - if (std::string value; !table.get(key, value, false, true).found) // delete + if (std::string value; !table.get(key, value).found || value!=values1[i]) { - s += format("Delete failed for key {}={}, expected {}\n", key, value, values1[i]); + t = format("Different value for key {}={}, expected {}", key, value, values1[i]); LOG; ok = false; } - i++; - } - s += table.compact(); // Compacting remove all index entries marked as "deleted" and reorders the value file. - if (auto count = (sizeof(keys)/sizeof(keys[0])+1) / 2; table.entries != count) - { - s += format("Unexpected number of keys in table {}: {}, expected {}\n", table.name, table.entries, count); - ok = false; + i++; + } + if (table.spaces==0) + { + t = format("Table {} expected to have {} internal fragmentation", table.name, "non-zero"); LOG; + } + t = table.compact(); LOG; // Compacting must reorder the values file. + for (int i=0; auto key : keys) + { + if (i%2) // delete every second key + if (std::string value; !table.get(key, value, false, true).found) // delete key + { + t = format("Delete failed for key {}={}, expected {}", key, value, values1[i]); LOG; + ok = false; + } + i++; + } + t = table.compact(); LOG; // Compacting remove all index entries marked as "deleted" and reorders the value file. + if (auto count = (sizeof(keys)/sizeof(keys[0])+1) / 2; table.entries != count) + { + t = format("Unexpected number of keys in table {}: {}, expected {}", table.name, table.entries, count); LOG; + ok = false; + } + t = table.list(true); LOG; // revolve though index keys once } - s += table.list(true); // revolve though index keys once } - s += format("Self test {} {}\n", test, ok ? "passed" : "failed") + Stats::get_static_profiles(); + t = format("... test {} {}.\n", test, ok ? "passed" : "failed") + Stats::get_static_profiles(); LOG; return ok; } bool get_file(std::string &val, bool keys) @@ -802,11 +829,14 @@ struct Table : Stats { return ::read(fid, (char*)val.c_str(), sz) == sz; } static std::atomic_bool tables_lock; // One self-test through + private: std::atomic_bool lock_fio = false; // file lock: mutually exclussive readers and writers std::atomic_bool lock_cache = false; // cache lock: shared readers, exclusive writers std::atomic_int readers = 0; // count of concurrent readers + enum ECacheMode {WRITETHROUGH, WRITEBACK}; + int cache_mode = WRITETHROUGH; int fid_keys{0}; int fid_values{0}; size_t entries{0}; @@ -824,7 +854,7 @@ struct Table : Stats { keys.pop_back(); values.pop_back(); // Eviction if (trace_level & (1 << ETrace::CACHE)) - applog.info("evict key {}", key); + applog.info("CACHE: evict key {}", key); evictions++; return "Eviction of key " + key; } @@ -837,16 +867,16 @@ struct Table : Stats { int count = 0; while (true) { - char buf[Index::key_len]; + char buf[Index::entry_sz+1]; { Lock l(lock_cache, locked); lseek(fid_keys, fpos, SEEK_SET); - auto len = read(fid_keys, buf, sizeof(buf)-1); + auto len = read(fid_keys, buf, Index::entry_sz); if (len==0) { if (trace_level & (1 << ETrace::FILEIO)) - applog.info("Reached the end of {}, count {}", db_prefix+name+keys_fname, count); - co_yield Index{.index = -count, .vfpos = Index::index_end_marker, .vsz = 0}; + applog.info("FILEIO: EIF Reached the end of {}, count {}", db_prefix+name+keys_fname, count); + co_yield Index{.index = -count, .vfpos = Index::end_marker, .vsz = 0}; fpos = 0; count = 0; continue; @@ -854,27 +884,27 @@ struct Table : Stats { if (len<0) { if (trace_level & (1 << ETrace::FILEIO)) - applog.info("Error reading {}, count {}, errno {}", db_prefix+name+keys_fname, count, errno); + applog.info("FILEIO: Error reading {}, count {}, errno {}", db_prefix+name+keys_fname, count, errno); break; } } count++; char * sp = strchr(buf,','); - *sp++=0; - Index ind{.index=int(fpos/(sizeof(buf)-1))}; - strncpy(ind.key, buf, sizeof(ind.key)); - sscanf(sp, "%jd,%zu", &ind.vfpos, &ind.vsz); + Index ind{.index=int(fpos/(Index::entry_sz))}; + strncpy(ind.key, buf, sp-buf); + ind.key[sp-buf]=0; + sscanf(sp+1, "%jd,%zu", &ind.vfpos, &ind.vsz); if (trace_level & (1 << ETrace::FILEIO)) - applog.info("{} [{}, {}, {}, {}] of index {}", - ind.vfpos==Index::index_deleted_marker ? "Skipping deleted" : "Yielding", - ind.index, - ind.vfpos, - ind.key, - ind.vsz, - db_prefix+name+keys_fname); - if (ind.vfpos!=Index::index_deleted_marker) + applog.info("FILEIO: {} [{}, {}, {}, {}] of index {}", + ind.vfpos==Index::deleted_marker ? "Skipping deleted" : "Yielding", + ind.index, + ind.vfpos, + ind.key, + ind.vsz, + db_prefix+name+keys_fname); + if (ind.vfpos!=Index::deleted_marker) co_yield ind; - fpos += sizeof(buf)-1; + fpos += Index::entry_sz; } } }; @@ -904,8 +934,8 @@ class DefaultHandle : public httpd::handler_base { struct {const char*label, *str; } args_global[] = { {"QUIT", "quit"}, - {"trace level all ON", "?trace_level=1111"}, - {"trace level all OFF", "?trace_level=0000"}, + {"trace level all ON", "?trace_level=11111"}, + {"trace level all OFF", "?trace_level=00000"}, {"list tables in use", "?used"}, }; for (auto arg : args_global) @@ -934,18 +964,18 @@ class DefaultHandle : public httpd::handler_base { {"list all keys", "?list"}, {"row next", "?rownext"}, {"row next", "?rownext"}, - {"insert aaa=text_aaa", "?op=insert&key=aaa&value=text_aaa%0A"}, - {"insert bbb=text_bbb", "?op=insert&key=bbb&value=text_bbb%0A"}, - {"insert ccc=text_ccc", "?op=insert&key=ccc&value=text_ccc%0A"}, - {"insert null=NULL", "?op=insert&key=null&value="}, + {"insert aaa=_aaa_", "?op=insert&key=aaa&value=_aaa_"}, + {"insert bbb=_bbb_", "?op=insert&key=bbb&value=_bbb_"}, + {"insert ccc=_ccc_", "?op=insert&key=ccc&value=_ccc_"}, + {"insert null=", "?op=insert&key=null&value="}, {"query aaa", "?key=aaa"}, {"query bbb", "?key=bbb"}, {"query ccc", "?key=ccc"}, {"query null", "?key=null"}, - {"update aaa=text_aaaa", "?op=update&key=aaa&value=text_aaaa%0A"}, - {"update bbb=text_BBB", "?op=update&key=bbb&value=text_BBB%0A"}, - {"update ccc=text_cc", "?op=update&key=ccc&value=text_cc%0A"}, - {"update null=text_nonnull","?op=update&key=null&value=text_nonnull%0A"}, + {"update aaa=_aaaa_", "?op=update&key=aaa&value=_aaaa_"}, + {"update bbb=_BBB_", "?op=update&key=bbb&value=_BBB_"}, + {"update ccc=_cc_", "?op=update&key=ccc&value=_cc_"}, + {"update null=_null_", "?op=update&key=null&value=_null_"}, {"delete aaa", "?op=delete&key=aaa"}, {"delete bbb", "?op=delete&key=bbb"}, {"delete ccc", "?op=delete&key=ccc"}, @@ -973,10 +1003,11 @@ class DefaultHandle : public httpd::handler_base { } struct {const char*label, *str; } args_tests[] = { - {"Test1 insert/update/delete", "?self_test=1"}, - {"Test1*10 insert/update/delete", "?self_test=1&loop=10"}, - {"Test1*100 insert/update/delete", "?self_test=1&loop=100"}, - {"Test1*1000 insert/update/delete", "?self_test=1&loop=1000"}, + {"Test1: 2 inserts, 1 delete", "?self_test=1"}, + {"Test2: 4-keys composite", "?self_test=2"}, + {"Test2*10", "?self_test=2&loop=10"}, + {"Test2*100", "?self_test=2&loop=100"}, + {"Test2*1000", "?self_test=2&loop=1000"}, }; s += plain_text ? format("Self tests:\n") : @@ -1131,7 +1162,7 @@ class DefaultHandle : public httpd::handler_base { else if (req->query_parameters.contains("rownext")) { auto [index, key, fpos, sz] = table.co_index_locked(); - s = format("test index {}, key:{}, valpos:{}, valsz:{}", index, key, fpos, sz); + s = format("test index {}, key:{}, valpos:{}, valsz:{}, value:{}", index, key, fpos, sz, "?"); } else if (req->query_parameters.contains("op")) { @@ -1154,7 +1185,7 @@ class DefaultHandle : public httpd::handler_base { } } if (trace_level & (1 << ETrace::SERVER)) - applog.info("DB request {} on table {}, {}", Stats::requests++, table_name, s); + applog.info("SERVER: DB request {} on table {}, {}", Stats::requests++, table_name, s); plain = true; } rep->_content = s; @@ -1168,7 +1199,7 @@ void set_routes(routes& r) { std::string s = "Server shutting down"; exit(0); if (trace_level & (1 << ETrace::SERVER)) - applog.info("{}", s); + applog.info("SERVER: {}", s); return s; }); r.add_default_handler(&defaultHandle); From 277dfe232e114b187d406ef7d568f132f3279dbc Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Mon, 15 Apr 2024 03:53:03 +0300 Subject: [PATCH 13/19] Reworked Table::set to use Index::access for low-level file IO. Closes issue #16 regarding the encapsulation of IO operations. This version has a self-test as per issue #11. --- CMakeLists.txt.user | 2387 +++++++++++++++++++++++++++++++++++++++++++ demos/db_demo.cc | 168 ++- 2 files changed, 2459 insertions(+), 96 deletions(-) create mode 100644 CMakeLists.txt.user diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user new file mode 100644 index 00000000000..d8b76e086be --- /dev/null +++ b/CMakeLists.txt.user @@ -0,0 +1,2387 @@ + + + + + + EnvironmentId + {ca393d1f-e9ed-4bec-aa26-20e86827200b} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + 0 + false + true + false + 2 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + false + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + + 0 + true + + true + true + Builtin.DefaultTidyAndClazy + 4 + true + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Imported Kit + Imported Kit + {53be7c7e-4147-4502-8b20-72627760d018} + 0 + 0 + 11 + + Debug + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + /home/DEV/seastar + /home/DEV/seastar/build/debug + + + + + all + + false + + true + Build + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + Build + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + CMakeProjectManager.CMakeBuildConfiguration + + + RelWithDebInfo + 2 + false + + -DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo +-DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + /home/DEV/seastar + /home/DEV/seastar/build/release + + + + + all + + false + + true + Build + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + Build + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release with Debug Information + CMakeProjectManager.CMakeBuildConfiguration + + 2 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_httpd + CMakeProjectManager.CMakeRunConfiguration.app_httpd + app_httpd + false + true + true + true + /home/DEV/seastar/build/debug/apps/httpd + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_io_tester + CMakeProjectManager.CMakeRunConfiguration.app_io_tester + app_io_tester + false + true + true + true + /home/DEV/seastar/build/debug/apps/io_tester + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_coroutines + CMakeProjectManager.CMakeRunConfiguration.demo_coroutines + demo_coroutines + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_sstring + CMakeProjectManager.CMakeRunConfiguration.test_unit_sstring + test_unit_sstring + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_stall_detector + CMakeProjectManager.CMakeRunConfiguration.test_unit_stall_detector + test_unit_stall_detector + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_stream_reader + CMakeProjectManager.CMakeRunConfiguration.test_unit_stream_reader + test_unit_stream_reader + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_thread + CMakeProjectManager.CMakeRunConfiguration.test_unit_thread + test_unit_thread + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_thread_context_switch + CMakeProjectManager.CMakeRunConfiguration.test_unit_thread_context_switch + test_unit_thread_context_switch + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_timer + CMakeProjectManager.CMakeRunConfiguration.test_unit_timer + test_unit_timer + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_tls + CMakeProjectManager.CMakeRunConfiguration.test_unit_tls + test_unit_tls + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_tuple_utils + CMakeProjectManager.CMakeRunConfiguration.test_unit_tuple_utils + test_unit_tuple_utils + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_uname + CMakeProjectManager.CMakeRunConfiguration.test_unit_uname + test_unit_uname + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_unix_domain + CMakeProjectManager.CMakeRunConfiguration.test_unit_unix_domain + test_unit_unix_domain + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_db + CMakeProjectManager.CMakeRunConfiguration.demo_db + demo_db + true + -c4 + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_unwind + CMakeProjectManager.CMakeRunConfiguration.test_unit_unwind + test_unit_unwind + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_weak_ptr + CMakeProjectManager.CMakeRunConfiguration.test_unit_weak_ptr + test_unit_weak_ptr + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_websocket + CMakeProjectManager.CMakeRunConfiguration.test_unit_websocket + test_unit_websocket + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_echo + CMakeProjectManager.CMakeRunConfiguration.demo_echo + demo_echo + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_file + CMakeProjectManager.CMakeRunConfiguration.demo_file + demo_file + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_hello-world + CMakeProjectManager.CMakeRunConfiguration.demo_hello-world + demo_hello-world + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_http_client + CMakeProjectManager.CMakeRunConfiguration.demo_http_client + demo_http_client + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_ip + CMakeProjectManager.CMakeRunConfiguration.demo_ip + demo_ip + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_l3 + CMakeProjectManager.CMakeRunConfiguration.demo_l3 + demo_l3 + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_line_count + CMakeProjectManager.CMakeRunConfiguration.demo_line_count + demo_line_count + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_rpc + CMakeProjectManager.CMakeRunConfiguration.demo_rpc + demo_rpc + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_ioinfo + CMakeProjectManager.CMakeRunConfiguration.app_ioinfo + app_ioinfo + false + true + true + true + /home/DEV/seastar/build/debug/apps/io_tester + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_scheduling_group + CMakeProjectManager.CMakeRunConfiguration.demo_scheduling_group + demo_scheduling_group + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_sharded_parameter + CMakeProjectManager.CMakeRunConfiguration.demo_sharded_parameter + demo_sharded_parameter + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tcp + CMakeProjectManager.CMakeRunConfiguration.demo_tcp + demo_tcp + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tcp_sctp_client + CMakeProjectManager.CMakeRunConfiguration.demo_tcp_sctp_client + demo_tcp_sctp_client + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tcp_sctp_server + CMakeProjectManager.CMakeRunConfiguration.demo_tcp_sctp_server + demo_tcp_sctp_server + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tls_echo_server + CMakeProjectManager.CMakeRunConfiguration.demo_tls_echo_server + demo_tls_echo_server + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tls_simple_client + CMakeProjectManager.CMakeRunConfiguration.demo_tls_simple_client + demo_tls_simple_client + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_tutorial_examples + CMakeProjectManager.CMakeRunConfiguration.demo_tutorial_examples + demo_tutorial_examples + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_udp_client + CMakeProjectManager.CMakeRunConfiguration.demo_udp_client + demo_udp_client + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_udp_server + CMakeProjectManager.CMakeRunConfiguration.demo_udp_server + demo_udp_server + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_iotune + CMakeProjectManager.CMakeRunConfiguration.app_iotune + app_iotune + false + true + true + true + /home/DEV/seastar/build/debug/apps/iotune + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_udp_zero_copy + CMakeProjectManager.CMakeRunConfiguration.demo_udp_zero_copy + demo_udp_zero_copy + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_websocket + CMakeProjectManager.CMakeRunConfiguration.demo_websocket + demo_websocket + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_allocator + CMakeProjectManager.CMakeRunConfiguration.test_perf_allocator + test_perf_allocator + false + true + true + true + /home/DEV/seastar/build/debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_coroutine + CMakeProjectManager.CMakeRunConfiguration.test_perf_coroutine + test_perf_coroutine + false + true + true + true + /home/DEV/seastar/build/debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_fair_queue + CMakeProjectManager.CMakeRunConfiguration.test_perf_fair_queue + test_perf_fair_queue + false + true + true + true + /home/DEV/seastar/build/debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_fstream + CMakeProjectManager.CMakeRunConfiguration.test_perf_fstream + test_perf_fstream + false + true + true + true + /home/DEV/seastar/build/debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_future_util + CMakeProjectManager.CMakeRunConfiguration.test_perf_future_util + test_perf_future_util + false + true + true + true + /home/DEV/seastar/build/debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_rpc + CMakeProjectManager.CMakeRunConfiguration.test_perf_rpc + test_perf_rpc + false + true + true + true + /home/DEV/seastar/build/debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_shared_token_bucket + CMakeProjectManager.CMakeRunConfiguration.test_perf_shared_token_bucket + test_perf_shared_token_bucket + false + true + true + true + /home/DEV/seastar/build/debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_perf_smp_submit_to + CMakeProjectManager.CMakeRunConfiguration.test_perf_smp_submit_to + test_perf_smp_submit_to + false + true + true + true + /home/DEV/seastar/build/debug/tests/perf + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_memcached + CMakeProjectManager.CMakeRunConfiguration.app_memcached + app_memcached + false + true + true + true + /home/DEV/seastar/build/debug/apps/memcached + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_abort_source + CMakeProjectManager.CMakeRunConfiguration.test_unit_abort_source + test_unit_abort_source + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_abortable_fifo + CMakeProjectManager.CMakeRunConfiguration.test_unit_abortable_fifo + test_unit_abortable_fifo + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_alien + CMakeProjectManager.CMakeRunConfiguration.test_unit_alien + test_unit_alien + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_alloc + CMakeProjectManager.CMakeRunConfiguration.test_unit_alloc + test_unit_alloc + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_allocator + CMakeProjectManager.CMakeRunConfiguration.test_unit_allocator + test_unit_allocator + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_app-template + CMakeProjectManager.CMakeRunConfiguration.test_unit_app-template + test_unit_app-template + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_checked_ptr + CMakeProjectManager.CMakeRunConfiguration.test_unit_checked_ptr + test_unit_checked_ptr + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_chunk_parsers + CMakeProjectManager.CMakeRunConfiguration.test_unit_chunk_parsers + test_unit_chunk_parsers + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_chunked_fifo + CMakeProjectManager.CMakeRunConfiguration.test_unit_chunked_fifo + test_unit_chunked_fifo + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_circular_buffer + CMakeProjectManager.CMakeRunConfiguration.test_unit_circular_buffer + test_unit_circular_buffer + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_memcached_test_ascii + CMakeProjectManager.CMakeRunConfiguration.app_memcached_test_ascii + app_memcached_test_ascii + false + true + true + true + /home/DEV/seastar/build/debug/apps/memcached/tests + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_circular_buffer_fixed_capacity + CMakeProjectManager.CMakeRunConfiguration.test_unit_circular_buffer_fixed_capacity + test_unit_circular_buffer_fixed_capacity + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_closeable + CMakeProjectManager.CMakeRunConfiguration.test_unit_closeable + test_unit_closeable + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_condition_variable + CMakeProjectManager.CMakeRunConfiguration.test_unit_condition_variable + test_unit_condition_variable + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_connect + CMakeProjectManager.CMakeRunConfiguration.test_unit_connect + test_unit_connect + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_content_source + CMakeProjectManager.CMakeRunConfiguration.test_unit_content_source + test_unit_content_source + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_coroutines + CMakeProjectManager.CMakeRunConfiguration.test_unit_coroutines + test_unit_coroutines + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_defer + CMakeProjectManager.CMakeRunConfiguration.test_unit_defer + test_unit_defer + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_deleter + CMakeProjectManager.CMakeRunConfiguration.test_unit_deleter + test_unit_deleter + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_directory + CMakeProjectManager.CMakeRunConfiguration.test_unit_directory + test_unit_directory + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_distributed + CMakeProjectManager.CMakeRunConfiguration.test_unit_distributed + test_unit_distributed + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_metrics_tester + CMakeProjectManager.CMakeRunConfiguration.app_metrics_tester + app_metrics_tester + false + true + true + true + /home/DEV/seastar/build/debug/apps/metrics_tester + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_dns + CMakeProjectManager.CMakeRunConfiguration.test_unit_dns + test_unit_dns + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_exception_logging + CMakeProjectManager.CMakeRunConfiguration.test_unit_exception_logging + test_unit_exception_logging + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_execution_stage + CMakeProjectManager.CMakeRunConfiguration.test_unit_execution_stage + test_unit_execution_stage + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_expiring_fifo + CMakeProjectManager.CMakeRunConfiguration.test_unit_expiring_fifo + test_unit_expiring_fifo + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_fair_queue + CMakeProjectManager.CMakeRunConfiguration.test_unit_fair_queue + test_unit_fair_queue + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_file_io + CMakeProjectManager.CMakeRunConfiguration.test_unit_file_io + test_unit_file_io + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_file_utils + CMakeProjectManager.CMakeRunConfiguration.test_unit_file_utils + test_unit_file_utils + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_foreign_ptr + CMakeProjectManager.CMakeRunConfiguration.test_unit_foreign_ptr + test_unit_foreign_ptr + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_fsnotifier + CMakeProjectManager.CMakeRunConfiguration.test_unit_fsnotifier + test_unit_fsnotifier + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_fstream + CMakeProjectManager.CMakeRunConfiguration.test_unit_fstream + test_unit_fstream + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_rpc_tester + CMakeProjectManager.CMakeRunConfiguration.app_rpc_tester + app_rpc_tester + false + true + true + true + /home/DEV/seastar/build/debug/apps/rpc_tester + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_futures + CMakeProjectManager.CMakeRunConfiguration.test_unit_futures + test_unit_futures + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_httpd + CMakeProjectManager.CMakeRunConfiguration.test_unit_httpd + test_unit_httpd + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_io_queue + CMakeProjectManager.CMakeRunConfiguration.test_unit_io_queue + test_unit_io_queue + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_ipv6 + CMakeProjectManager.CMakeRunConfiguration.test_unit_ipv6 + test_unit_ipv6 + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_json_formatter + CMakeProjectManager.CMakeRunConfiguration.test_unit_json_formatter + test_unit_json_formatter + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_locking + CMakeProjectManager.CMakeRunConfiguration.test_unit_locking + test_unit_locking + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_log_buf + CMakeProjectManager.CMakeRunConfiguration.test_unit_log_buf + test_unit_log_buf + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_lowres_clock + CMakeProjectManager.CMakeRunConfiguration.test_unit_lowres_clock + test_unit_lowres_clock + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_metrics + CMakeProjectManager.CMakeRunConfiguration.test_unit_metrics + test_unit_metrics + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_net_config + CMakeProjectManager.CMakeRunConfiguration.test_unit_net_config + test_unit_net_config + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + app_seawreck + CMakeProjectManager.CMakeRunConfiguration.app_seawreck + app_seawreck + false + true + true + true + /home/DEV/seastar/build/debug/apps/seawreck + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_network_interface + CMakeProjectManager.CMakeRunConfiguration.test_unit_network_interface + test_unit_network_interface + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_noncopyable_function + CMakeProjectManager.CMakeRunConfiguration.test_unit_noncopyable_function + test_unit_noncopyable_function + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_output_stream + CMakeProjectManager.CMakeRunConfiguration.test_unit_output_stream + test_unit_output_stream + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_packet + CMakeProjectManager.CMakeRunConfiguration.test_unit_packet + test_unit_packet + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_pipe + CMakeProjectManager.CMakeRunConfiguration.test_unit_pipe + test_unit_pipe + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_program_options + CMakeProjectManager.CMakeRunConfiguration.test_unit_program_options + test_unit_program_options + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_queue + CMakeProjectManager.CMakeRunConfiguration.test_unit_queue + test_unit_queue + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_request_parser + CMakeProjectManager.CMakeRunConfiguration.test_unit_request_parser + test_unit_request_parser + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_rpc + CMakeProjectManager.CMakeRunConfiguration.test_unit_rpc + test_unit_rpc + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_scheduling_group + CMakeProjectManager.CMakeRunConfiguration.test_unit_scheduling_group + test_unit_scheduling_group + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + demo_block_discard + CMakeProjectManager.CMakeRunConfiguration.demo_block_discard + demo_block_discard + false + true + true + true + /home/DEV/seastar/build/debug/demos + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_semaphore + CMakeProjectManager.CMakeRunConfiguration.test_unit_semaphore + test_unit_semaphore + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_sharded + CMakeProjectManager.CMakeRunConfiguration.test_unit_sharded + test_unit_sharded + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_shared_ptr + CMakeProjectManager.CMakeRunConfiguration.test_unit_shared_ptr + test_unit_shared_ptr + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_shared_token_bucket + CMakeProjectManager.CMakeRunConfiguration.test_unit_shared_token_bucket + test_unit_shared_token_bucket + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_signal + CMakeProjectManager.CMakeRunConfiguration.test_unit_signal + test_unit_signal + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_simple_stream + CMakeProjectManager.CMakeRunConfiguration.test_unit_simple_stream + test_unit_simple_stream + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_smp + CMakeProjectManager.CMakeRunConfiguration.test_unit_smp + test_unit_smp + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_socket + CMakeProjectManager.CMakeRunConfiguration.test_unit_socket + test_unit_socket + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_source_location + CMakeProjectManager.CMakeRunConfiguration.test_unit_source_location + test_unit_source_location + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + test_unit_spawn + CMakeProjectManager.CMakeRunConfiguration.test_unit_spawn + test_unit_spawn + false + true + true + true + /home/DEV/seastar/build/debug/tests/unit + + 113 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/demos/db_demo.cc b/demos/db_demo.cc index ccf6a986977..860fb3739c8 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -84,7 +84,7 @@ namespace bpo = boost::program_options; using namespace seastar; using namespace httpd; -const char*VERSION="Demo Database Server 0.4"; +const char*VERSION="Demo Database Server 0.5"; const char* available_trace_levels[] = {"LOCKS", "FILEIO", "CACHE", "SERVER", "TEST"}; enum ETrace { LOCKS, FILEIO, CACHE, SERVER, TEST, MAX}; int trace_level = (1 << ETrace::FILEIO) | (1 << ETrace::CACHE) | (1 << ETrace::SERVER) | (1 << ETrace::TEST); @@ -92,7 +92,7 @@ logger applog("app"); // Tried to use seastar::coroutine::experimental::generator. // Resorted to adopting the following ugly construct for the index revolver coroutine. -// Generator should be part of std, or be a compiler generated construct. +// Generator should be part of std, if not a compiler generated construct. // C++ coroutines are trully a mess. template @@ -249,18 +249,6 @@ struct Table : Stats { static std::map tables; - struct Value - { - std::string text; - off_t fpos; - ssize_t sz; - }; - struct Key - { - std::string text; - off_t fpos; - std::deque::iterator it_value; - }; struct Index { int index; @@ -270,8 +258,7 @@ struct Table : Stats { constexpr static size_t entry_sz = 256 + 44; // 300 = key,int64,int32,extra\n0 constexpr static off_t end_marker = -1; constexpr static off_t deleted_marker = -2; - - auto access_value(int fid_values, off_t vpos, std::string *value, std::string &table_name, bool write) + auto access_value(int fid_values, std::string *value, std::string &table_name, bool write) { sstring msg; if (write) @@ -307,7 +294,7 @@ struct Table : Stats { sstring msg; if (write) { - access_value(fid_values, vfpos, value, table_name, write); + access_value(fid_values, value, table_name, write); auto fpos_keys = lseek(fid_keys, index * entry_sz, SEEK_SET); sprintf(buf, "%s,%jd,%zu,", key, vfpos, vsz); len = strlen(buf); @@ -362,7 +349,7 @@ struct Table : Stats { ::write(fid_keys, buf, Index::entry_sz); // Swap curent and next index entries. memcpy(buf, buf_next, Index::entry_sz); } - access_value(fid_values, vfpos, value, table_name, write); + access_value(fid_values, value, table_name, write); if (deleted_keys>0) msg+=format(" compacted {} index entries", deleted_keys); if (trace_level & (1 << ETrace::FILEIO)) @@ -500,7 +487,7 @@ struct Table : Stats { applog.info("FILEIO: list: {}", s); return s; } - auto get(const std::string &key, std::string &value, bool reentered=false, bool remove=false) + auto get(const std::string &key, std::string &value, bool remove = false, bool reentered = false) { Lock l(lock_cache, reentered); auto x = xref.begin(); @@ -564,7 +551,7 @@ struct Table : Stats { } else { - entry.access_value(fid_values, entry.vfpos, &value, name, false); + entry.access_value(fid_values, &value, name, false); evict(); off_t fpos_keys = entry.index * Index::entry_sz; values.push_front({value, entry.vfpos, entry.vsz}); @@ -585,84 +572,61 @@ struct Table : Stats { struct RV{bool found; decltype(x) it; }; return RV{found, x}; } - bool set(const std::string &key, const std::string &val, bool update) + bool set(const std::string &key, const std::string &value, bool update, bool reentered = false) { - bool rv = true; - Lock l(lock_cache, false); + std::string branch; + if (key=="null") + if (value=="") + branch = "trap "; + + Lock l(lock_cache, reentered); std::string old_val; - auto [found, x] = get(key, old_val, true); - sstring msg; - std::string branch = "Skip"; - if (!update || val != old_val) // not found, or found different for update + auto [found, x] = get(key, old_val, false, true); + if (update && found && value == old_val) + branch += "ignore"; // ignore update with the same value + else if (found == update) { - bool overwrite = false; - char buf[Index::entry_sz+1]; + off_t fpos_values = lseek(fid_values, 0, SEEK_END); + auto val = value; // value is const + Index entry; + snprintf(entry.key, 256, "%s", key.c_str()); + entry.vfpos = fpos_values; + entry.vsz = val.length(); if (!found) // key not in cache and not in file { - if (update) - rv = false; - else // insert - { - evict(); - off_t fpos_keys = lseek(fid_keys, 0, SEEK_END); - off_t fpos_values = Index::end_marker; - fpos_values = lseek(fid_values, 0, SEEK_END); - values.push_front({val, fpos_values, 0}); - keys.push_front({key, fpos_keys, values.begin()}); - x = xref.insert_or_assign(key, keys.begin()).first; - branch = "Add"; - entries++; - inserts++; - } - } - else - { - branch = "Overwrite"; - overwrite = true; - if (update) - updates++; - else - rv = false; + branch += "Insert"; + off_t fpos_keys = lseek(fid_keys, 0, SEEK_END); + entry.index = fpos_keys / Index::entry_sz; + entry.access(fid_keys, fid_values, &val, name, true); // write key to keys file and value to values file + evict(); + values.push_front({val, entry.vfpos, 0}); // load into cache + keys.push_front({key, fpos_keys, values.begin()}); + x = xref.insert_or_assign(key, keys.begin()).first; + entries++; + inserts++; } - if (rv && x != xref.end()) + else // found in cache { + branch += "Update"; Value& oldv = *x->second->it_value; - if (overwrite && val == oldv.text) - branch = "ignore"; - else - { - auto sz = oldv.sz; - bool reuse_value_space = (ssize_t)val.length() <= sz; - off_t fpos_values = 0; - if (reuse_value_space) - { - spaces += sz-val.length(); - fpos_values = oldv.fpos; - } - else - spaces += sz; - sz = val.length(); - fpos_values = lseek(fid_values, fpos_values, reuse_value_space ? SEEK_SET : SEEK_END); - if (write(fid_values, val.c_str(), val.length()) != (ssize_t)val.length()) - msg+=format(", Error {} writing to values file", errno); - values.erase(x->second->it_value); - values.push_front({val, fpos_values, sz}); - sprintf(buf, "%s,%jd,%zu,", key.c_str(), fpos_values, sz); - auto len = strlen(buf); - auto fpos_keys = x->second->fpos; - lseek(fid_keys, fpos_keys, SEEK_SET); - sprintf(buf+len, "%*c\n", int(Index::entry_sz-1-len), ' '); - if (write(fid_keys, buf, Index::entry_sz) != (ssize_t)Index::entry_sz) - msg+=format(", Error {} writing to keys file", errno); - keys.erase(x->second); - keys.push_front({key, fpos_keys, values.begin()}); - x->second = keys.begin(); - } + bool inplace = val.length() <= old_val.length(); + spaces += old_val.length() - (inplace ? value.length() : 0); + entry.index = x->second->fpos / Index::entry_sz; + if (inplace) + entry.vfpos = fpos_values; + entry.access(fid_keys, fid_values, &val, name, true); + values.erase(x->second->it_value); + off_t fpos_keys = entry.index * Index::entry_sz; + values.push_front({val, fpos_keys, (ssize_t)value.length()}); + keys.erase(x->second); + keys.push_front({key, fpos_keys, values.begin()}); + x->second = keys.begin(); + updates++; } } if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) - applog.info("CACHE|FILEIO: set {} {}={}{} {}", branch, key, val, msg, rv ? "ok" : "fail"); - return rv; + applog.info("CACHE|FILEIO: set {} {}={} {}", branch, key, value, update == found ? "ok" : "fail"); + return update == found; } operator std::string() const { @@ -691,13 +655,11 @@ struct Table : Stats { #define LOG s+= t+"\n"; if (trace_level & (1 << ETrace::TEST)) applog.info("TEST: {}", t) t = format("Starting test {}, id {}...", test, self_tests++); LOG; if (loop>1) - { for (int i=0; i::iterator it_value; + }; + std::deque values; std::deque keys; std::map::iterator> xref; @@ -945,7 +921,7 @@ class DefaultHandle : public httpd::handler_base { s += plain_text ? format("Commands for table: {}\n", table_name) : sstring("

\n

Commands for table: " + table_name + " 

\n" - "For any of the following commands to work, a table must be created, or opened if it exists, with the ?use REST command.\n" + "For any of the following commands to work, a table must be created, or opened if it exists, with the ?use command.\n" "

"); struct {const char*label, *str; } args_per_table[] = { @@ -962,8 +938,7 @@ class DefaultHandle : public httpd::handler_base { {"invalidate cache", "?invalidate"}, {"list cached keys/vals", "?key="}, {"list all keys", "?list"}, - {"row next", "?rownext"}, - {"row next", "?rownext"}, + {"(co)index next", "?rownext"}, {"insert aaa=_aaa_", "?op=insert&key=aaa&value=_aaa_"}, {"insert bbb=_bbb_", "?op=insert&key=bbb&value=_bbb_"}, {"insert ccc=_ccc_", "?op=insert&key=ccc&value=_ccc_"}, @@ -976,6 +951,7 @@ class DefaultHandle : public httpd::handler_base { {"update bbb=_BBB_", "?op=update&key=bbb&value=_BBB_"}, {"update ccc=_cc_", "?op=update&key=ccc&value=_cc_"}, {"update null=_null_", "?op=update&key=null&value=_null_"}, + {"update null=", "?op=update&key=null&value="}, {"delete aaa", "?op=delete&key=aaa"}, {"delete bbb", "?op=delete&key=bbb"}, {"delete ccc", "?op=delete&key=ccc"}, From 91b9834f974cc9e95206089babc1a2d96458fe63 Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Mon, 15 Apr 2024 04:09:24 +0300 Subject: [PATCH 14/19] Reworked Table::set to use Index::access for low-level file IO. Closes issue #16 regarding the encapsulation of IO operations. This version has a self-test as per issue #11. --- CMakeLists.txt.user | 2387 ------------------------------------------- 1 file changed, 2387 deletions(-) delete mode 100644 CMakeLists.txt.user diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user deleted file mode 100644 index d8b76e086be..00000000000 --- a/CMakeLists.txt.user +++ /dev/null @@ -1,2387 +0,0 @@ - - - - - - EnvironmentId - {ca393d1f-e9ed-4bec-aa26-20e86827200b} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - 0 - false - true - false - 2 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - - 0 - true - - true - true - Builtin.DefaultTidyAndClazy - 4 - true - - - - true - - - - - ProjectExplorer.Project.Target.0 - - Desktop - Imported Kit - Imported Kit - {53be7c7e-4147-4502-8b20-72627760d018} - 0 - 0 - 11 - - Debug - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=Debug --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - /home/DEV/seastar - /home/DEV/seastar/build/debug - - - - - all - - false - - true - Build - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - Build - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - CMakeProjectManager.CMakeBuildConfiguration - - - RelWithDebInfo - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - /home/DEV/seastar - /home/DEV/seastar/build/release - - - - - all - - false - - true - Build - CMakeProjectManager.MakeStep - - 1 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - Build - CMakeProjectManager.MakeStep - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release with Debug Information - CMakeProjectManager.CMakeBuildConfiguration - - 2 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_httpd - CMakeProjectManager.CMakeRunConfiguration.app_httpd - app_httpd - false - true - true - true - /home/DEV/seastar/build/debug/apps/httpd - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_io_tester - CMakeProjectManager.CMakeRunConfiguration.app_io_tester - app_io_tester - false - true - true - true - /home/DEV/seastar/build/debug/apps/io_tester - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_coroutines - CMakeProjectManager.CMakeRunConfiguration.demo_coroutines - demo_coroutines - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_sstring - CMakeProjectManager.CMakeRunConfiguration.test_unit_sstring - test_unit_sstring - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_stall_detector - CMakeProjectManager.CMakeRunConfiguration.test_unit_stall_detector - test_unit_stall_detector - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_stream_reader - CMakeProjectManager.CMakeRunConfiguration.test_unit_stream_reader - test_unit_stream_reader - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_thread - CMakeProjectManager.CMakeRunConfiguration.test_unit_thread - test_unit_thread - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_thread_context_switch - CMakeProjectManager.CMakeRunConfiguration.test_unit_thread_context_switch - test_unit_thread_context_switch - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_timer - CMakeProjectManager.CMakeRunConfiguration.test_unit_timer - test_unit_timer - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_tls - CMakeProjectManager.CMakeRunConfiguration.test_unit_tls - test_unit_tls - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_tuple_utils - CMakeProjectManager.CMakeRunConfiguration.test_unit_tuple_utils - test_unit_tuple_utils - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_uname - CMakeProjectManager.CMakeRunConfiguration.test_unit_uname - test_unit_uname - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_unix_domain - CMakeProjectManager.CMakeRunConfiguration.test_unit_unix_domain - test_unit_unix_domain - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_db - CMakeProjectManager.CMakeRunConfiguration.demo_db - demo_db - true - -c4 - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_unwind - CMakeProjectManager.CMakeRunConfiguration.test_unit_unwind - test_unit_unwind - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_weak_ptr - CMakeProjectManager.CMakeRunConfiguration.test_unit_weak_ptr - test_unit_weak_ptr - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_websocket - CMakeProjectManager.CMakeRunConfiguration.test_unit_websocket - test_unit_websocket - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_echo - CMakeProjectManager.CMakeRunConfiguration.demo_echo - demo_echo - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_file - CMakeProjectManager.CMakeRunConfiguration.demo_file - demo_file - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_hello-world - CMakeProjectManager.CMakeRunConfiguration.demo_hello-world - demo_hello-world - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_http_client - CMakeProjectManager.CMakeRunConfiguration.demo_http_client - demo_http_client - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_ip - CMakeProjectManager.CMakeRunConfiguration.demo_ip - demo_ip - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_l3 - CMakeProjectManager.CMakeRunConfiguration.demo_l3 - demo_l3 - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_line_count - CMakeProjectManager.CMakeRunConfiguration.demo_line_count - demo_line_count - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_rpc - CMakeProjectManager.CMakeRunConfiguration.demo_rpc - demo_rpc - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_ioinfo - CMakeProjectManager.CMakeRunConfiguration.app_ioinfo - app_ioinfo - false - true - true - true - /home/DEV/seastar/build/debug/apps/io_tester - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_scheduling_group - CMakeProjectManager.CMakeRunConfiguration.demo_scheduling_group - demo_scheduling_group - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_sharded_parameter - CMakeProjectManager.CMakeRunConfiguration.demo_sharded_parameter - demo_sharded_parameter - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tcp - CMakeProjectManager.CMakeRunConfiguration.demo_tcp - demo_tcp - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tcp_sctp_client - CMakeProjectManager.CMakeRunConfiguration.demo_tcp_sctp_client - demo_tcp_sctp_client - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tcp_sctp_server - CMakeProjectManager.CMakeRunConfiguration.demo_tcp_sctp_server - demo_tcp_sctp_server - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tls_echo_server - CMakeProjectManager.CMakeRunConfiguration.demo_tls_echo_server - demo_tls_echo_server - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tls_simple_client - CMakeProjectManager.CMakeRunConfiguration.demo_tls_simple_client - demo_tls_simple_client - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_tutorial_examples - CMakeProjectManager.CMakeRunConfiguration.demo_tutorial_examples - demo_tutorial_examples - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_udp_client - CMakeProjectManager.CMakeRunConfiguration.demo_udp_client - demo_udp_client - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_udp_server - CMakeProjectManager.CMakeRunConfiguration.demo_udp_server - demo_udp_server - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_iotune - CMakeProjectManager.CMakeRunConfiguration.app_iotune - app_iotune - false - true - true - true - /home/DEV/seastar/build/debug/apps/iotune - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_udp_zero_copy - CMakeProjectManager.CMakeRunConfiguration.demo_udp_zero_copy - demo_udp_zero_copy - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_websocket - CMakeProjectManager.CMakeRunConfiguration.demo_websocket - demo_websocket - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_allocator - CMakeProjectManager.CMakeRunConfiguration.test_perf_allocator - test_perf_allocator - false - true - true - true - /home/DEV/seastar/build/debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_coroutine - CMakeProjectManager.CMakeRunConfiguration.test_perf_coroutine - test_perf_coroutine - false - true - true - true - /home/DEV/seastar/build/debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_fair_queue - CMakeProjectManager.CMakeRunConfiguration.test_perf_fair_queue - test_perf_fair_queue - false - true - true - true - /home/DEV/seastar/build/debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_fstream - CMakeProjectManager.CMakeRunConfiguration.test_perf_fstream - test_perf_fstream - false - true - true - true - /home/DEV/seastar/build/debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_future_util - CMakeProjectManager.CMakeRunConfiguration.test_perf_future_util - test_perf_future_util - false - true - true - true - /home/DEV/seastar/build/debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_rpc - CMakeProjectManager.CMakeRunConfiguration.test_perf_rpc - test_perf_rpc - false - true - true - true - /home/DEV/seastar/build/debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_shared_token_bucket - CMakeProjectManager.CMakeRunConfiguration.test_perf_shared_token_bucket - test_perf_shared_token_bucket - false - true - true - true - /home/DEV/seastar/build/debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_perf_smp_submit_to - CMakeProjectManager.CMakeRunConfiguration.test_perf_smp_submit_to - test_perf_smp_submit_to - false - true - true - true - /home/DEV/seastar/build/debug/tests/perf - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_memcached - CMakeProjectManager.CMakeRunConfiguration.app_memcached - app_memcached - false - true - true - true - /home/DEV/seastar/build/debug/apps/memcached - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_abort_source - CMakeProjectManager.CMakeRunConfiguration.test_unit_abort_source - test_unit_abort_source - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_abortable_fifo - CMakeProjectManager.CMakeRunConfiguration.test_unit_abortable_fifo - test_unit_abortable_fifo - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_alien - CMakeProjectManager.CMakeRunConfiguration.test_unit_alien - test_unit_alien - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_alloc - CMakeProjectManager.CMakeRunConfiguration.test_unit_alloc - test_unit_alloc - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_allocator - CMakeProjectManager.CMakeRunConfiguration.test_unit_allocator - test_unit_allocator - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_app-template - CMakeProjectManager.CMakeRunConfiguration.test_unit_app-template - test_unit_app-template - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_checked_ptr - CMakeProjectManager.CMakeRunConfiguration.test_unit_checked_ptr - test_unit_checked_ptr - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_chunk_parsers - CMakeProjectManager.CMakeRunConfiguration.test_unit_chunk_parsers - test_unit_chunk_parsers - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_chunked_fifo - CMakeProjectManager.CMakeRunConfiguration.test_unit_chunked_fifo - test_unit_chunked_fifo - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_circular_buffer - CMakeProjectManager.CMakeRunConfiguration.test_unit_circular_buffer - test_unit_circular_buffer - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_memcached_test_ascii - CMakeProjectManager.CMakeRunConfiguration.app_memcached_test_ascii - app_memcached_test_ascii - false - true - true - true - /home/DEV/seastar/build/debug/apps/memcached/tests - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_circular_buffer_fixed_capacity - CMakeProjectManager.CMakeRunConfiguration.test_unit_circular_buffer_fixed_capacity - test_unit_circular_buffer_fixed_capacity - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_closeable - CMakeProjectManager.CMakeRunConfiguration.test_unit_closeable - test_unit_closeable - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_condition_variable - CMakeProjectManager.CMakeRunConfiguration.test_unit_condition_variable - test_unit_condition_variable - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_connect - CMakeProjectManager.CMakeRunConfiguration.test_unit_connect - test_unit_connect - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_content_source - CMakeProjectManager.CMakeRunConfiguration.test_unit_content_source - test_unit_content_source - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_coroutines - CMakeProjectManager.CMakeRunConfiguration.test_unit_coroutines - test_unit_coroutines - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_defer - CMakeProjectManager.CMakeRunConfiguration.test_unit_defer - test_unit_defer - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_deleter - CMakeProjectManager.CMakeRunConfiguration.test_unit_deleter - test_unit_deleter - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_directory - CMakeProjectManager.CMakeRunConfiguration.test_unit_directory - test_unit_directory - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_distributed - CMakeProjectManager.CMakeRunConfiguration.test_unit_distributed - test_unit_distributed - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_metrics_tester - CMakeProjectManager.CMakeRunConfiguration.app_metrics_tester - app_metrics_tester - false - true - true - true - /home/DEV/seastar/build/debug/apps/metrics_tester - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_dns - CMakeProjectManager.CMakeRunConfiguration.test_unit_dns - test_unit_dns - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_exception_logging - CMakeProjectManager.CMakeRunConfiguration.test_unit_exception_logging - test_unit_exception_logging - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_execution_stage - CMakeProjectManager.CMakeRunConfiguration.test_unit_execution_stage - test_unit_execution_stage - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_expiring_fifo - CMakeProjectManager.CMakeRunConfiguration.test_unit_expiring_fifo - test_unit_expiring_fifo - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_fair_queue - CMakeProjectManager.CMakeRunConfiguration.test_unit_fair_queue - test_unit_fair_queue - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_file_io - CMakeProjectManager.CMakeRunConfiguration.test_unit_file_io - test_unit_file_io - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_file_utils - CMakeProjectManager.CMakeRunConfiguration.test_unit_file_utils - test_unit_file_utils - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_foreign_ptr - CMakeProjectManager.CMakeRunConfiguration.test_unit_foreign_ptr - test_unit_foreign_ptr - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_fsnotifier - CMakeProjectManager.CMakeRunConfiguration.test_unit_fsnotifier - test_unit_fsnotifier - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_fstream - CMakeProjectManager.CMakeRunConfiguration.test_unit_fstream - test_unit_fstream - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_rpc_tester - CMakeProjectManager.CMakeRunConfiguration.app_rpc_tester - app_rpc_tester - false - true - true - true - /home/DEV/seastar/build/debug/apps/rpc_tester - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_futures - CMakeProjectManager.CMakeRunConfiguration.test_unit_futures - test_unit_futures - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_httpd - CMakeProjectManager.CMakeRunConfiguration.test_unit_httpd - test_unit_httpd - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_io_queue - CMakeProjectManager.CMakeRunConfiguration.test_unit_io_queue - test_unit_io_queue - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_ipv6 - CMakeProjectManager.CMakeRunConfiguration.test_unit_ipv6 - test_unit_ipv6 - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_json_formatter - CMakeProjectManager.CMakeRunConfiguration.test_unit_json_formatter - test_unit_json_formatter - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_locking - CMakeProjectManager.CMakeRunConfiguration.test_unit_locking - test_unit_locking - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_log_buf - CMakeProjectManager.CMakeRunConfiguration.test_unit_log_buf - test_unit_log_buf - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_lowres_clock - CMakeProjectManager.CMakeRunConfiguration.test_unit_lowres_clock - test_unit_lowres_clock - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_metrics - CMakeProjectManager.CMakeRunConfiguration.test_unit_metrics - test_unit_metrics - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_net_config - CMakeProjectManager.CMakeRunConfiguration.test_unit_net_config - test_unit_net_config - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - app_seawreck - CMakeProjectManager.CMakeRunConfiguration.app_seawreck - app_seawreck - false - true - true - true - /home/DEV/seastar/build/debug/apps/seawreck - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_network_interface - CMakeProjectManager.CMakeRunConfiguration.test_unit_network_interface - test_unit_network_interface - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_noncopyable_function - CMakeProjectManager.CMakeRunConfiguration.test_unit_noncopyable_function - test_unit_noncopyable_function - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_output_stream - CMakeProjectManager.CMakeRunConfiguration.test_unit_output_stream - test_unit_output_stream - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_packet - CMakeProjectManager.CMakeRunConfiguration.test_unit_packet - test_unit_packet - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_pipe - CMakeProjectManager.CMakeRunConfiguration.test_unit_pipe - test_unit_pipe - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_program_options - CMakeProjectManager.CMakeRunConfiguration.test_unit_program_options - test_unit_program_options - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_queue - CMakeProjectManager.CMakeRunConfiguration.test_unit_queue - test_unit_queue - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_request_parser - CMakeProjectManager.CMakeRunConfiguration.test_unit_request_parser - test_unit_request_parser - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_rpc - CMakeProjectManager.CMakeRunConfiguration.test_unit_rpc - test_unit_rpc - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_scheduling_group - CMakeProjectManager.CMakeRunConfiguration.test_unit_scheduling_group - test_unit_scheduling_group - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - demo_block_discard - CMakeProjectManager.CMakeRunConfiguration.demo_block_discard - demo_block_discard - false - true - true - true - /home/DEV/seastar/build/debug/demos - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_semaphore - CMakeProjectManager.CMakeRunConfiguration.test_unit_semaphore - test_unit_semaphore - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_sharded - CMakeProjectManager.CMakeRunConfiguration.test_unit_sharded - test_unit_sharded - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_shared_ptr - CMakeProjectManager.CMakeRunConfiguration.test_unit_shared_ptr - test_unit_shared_ptr - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_shared_token_bucket - CMakeProjectManager.CMakeRunConfiguration.test_unit_shared_token_bucket - test_unit_shared_token_bucket - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_signal - CMakeProjectManager.CMakeRunConfiguration.test_unit_signal - test_unit_signal - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_simple_stream - CMakeProjectManager.CMakeRunConfiguration.test_unit_simple_stream - test_unit_simple_stream - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_smp - CMakeProjectManager.CMakeRunConfiguration.test_unit_smp - test_unit_smp - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_socket - CMakeProjectManager.CMakeRunConfiguration.test_unit_socket - test_unit_socket - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_source_location - CMakeProjectManager.CMakeRunConfiguration.test_unit_source_location - test_unit_source_location - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - - true - true - 0 - true - - 2 - - false - -e cpu-cycles --call-graph dwarf,4096 -F 250 - test_unit_spawn - CMakeProjectManager.CMakeRunConfiguration.test_unit_spawn - test_unit_spawn - false - true - true - true - /home/DEV/seastar/build/debug/tests/unit - - 113 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - From e7df9dc89055eeec76a39fadadeb730dbabc2bb1 Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Tue, 16 Apr 2024 20:10:27 +0300 Subject: [PATCH 15/19] Using a future to quit the process but have the browser navigate back to the main page before that. This is to avoid quit-restarting in a loop. Perparing to async-ify. A global and configurable mode_async. Added a rest provision to read the console log, if available. Reporting the sub-log of a Failed test when running in a loop. Git-ignoring Visual Studio temporary files and user-files of cmake. Working on issue #17. --- .gitignore | 5 +- demos/db_demo.cc | 278 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 206 insertions(+), 77 deletions(-) diff --git a/.gitignore b/.gitignore index 411a9385da2..46d57d31fec 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,7 @@ tags .vscode/ compile_commands.json .clangd -.cache \ No newline at end of file +.cache +/.vs/ +/CMakeLists.txt.user +/CMakeSettings.json diff --git a/demos/db_demo.cc b/demos/db_demo.cc index 860fb3739c8..0664c4a32f3 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -75,6 +75,8 @@ #include #include #include +#include +#include #pragma GCC diagnostic ignored "-Wunused-variable" #pragma GCC diagnostic ignored "-Wstringop-truncation" @@ -84,7 +86,7 @@ namespace bpo = boost::program_options; using namespace seastar; using namespace httpd; -const char*VERSION="Demo Database Server 0.5"; +const char*VERSION="Demo Database Server 0.6"; const char* available_trace_levels[] = {"LOCKS", "FILEIO", "CACHE", "SERVER", "TEST"}; enum ETrace { LOCKS, FILEIO, CACHE, SERVER, TEST, MAX}; int trace_level = (1 << ETrace::FILEIO) | (1 << ETrace::CACHE) | (1 << ETrace::SERVER) | (1 << ETrace::TEST); @@ -187,15 +189,19 @@ struct Stats { char buf[0x1000]; sprintf(buf, - "*requests:%d\n" - "*creates:%d\n" - "*drops:%d\n" - "*self_tests:%d\n" + "requests: %d\n" + "creates: %d\n" + "drops: %d\n" + "self_tests: %d\n" + "LockPasses: %d\n" + "LockCollisions: %d\n" , requests.load(), creates.load(), drops.load(), - self_tests.load() + self_tests.load(), + Lock::passes.load(), + Lock::collisions.load() ); return buf; } @@ -203,23 +209,15 @@ struct Stats { char buf[0x1000]; sprintf(buf, - "*requests:%d\n" - "*creates:%d\n" - "*drops:%d\n" - "*self_tests:%d\n" - "inserts:%d\n" - "deletes:%d\n" - "updates:%d\n" - "gets:%d\n" - "purges:%d\n" - "invalidates:%d\n" - "evictions:%d\n" - "compacts:%d\n" + "inserts: %d\n" + "deletes: %d\n" + "updates: %d\n" + "gets: %d\n" + "purges: %d\n" + "invalidates: %d\n" + "evictions: %d\n" + "compacts: %d\n" , - requests.load(), - creates.load(), - drops.load(), - self_tests.load(), inserts.load(), deletes.load(), updates.load(), @@ -240,11 +238,13 @@ std::atomic_int Stats::self_tests = 0; struct Table : Stats { std::string name; size_t max_cache {2}; + static bool mode_async; constexpr static auto db_prefix = "db_"; constexpr static auto keys_fname = "_keys.txt"; constexpr static auto values_fname = "_values.txt"; constexpr static auto compact_fname = "_compact.txt"; + constexpr static auto console_fname = "_console.txt"; constexpr static auto master_table_name = "Master"; static std::map tables; @@ -258,7 +258,7 @@ struct Table : Stats { constexpr static size_t entry_sz = 256 + 44; // 300 = key,int64,int32,extra\n0 constexpr static off_t end_marker = -1; constexpr static off_t deleted_marker = -2; - auto access_value(int fid_values, std::string *value, std::string &table_name, bool write) + void access_value(int fid_values, std::string *value, std::string &table_name, bool write) { sstring msg; if (write) @@ -286,7 +286,7 @@ struct Table : Stats { } } } - auto access(int fid_keys, int fid_values, std::string *value, std::string &table_name, bool write) + Index& access(int fid_keys, int fid_values, std::string *value, std::string &table_name, bool write) { auto fname = db_prefix+table_name+keys_fname; char buf[entry_sz+1]; @@ -294,7 +294,10 @@ struct Table : Stats { sstring msg; if (write) { - access_value(fid_values, value, table_name, write); + if (mode_async) + std::async([this, fid_values, &value, &table_name, write]{access_value(fid_values, value, table_name, write);}).get(); // Read value from values file + else + access_value(fid_values, value, table_name, write); // Read value from values file auto fpos_keys = lseek(fid_keys, index * entry_sz, SEEK_SET); sprintf(buf, "%s,%jd,%zu,", key, vfpos, vsz); len = strlen(buf); @@ -349,7 +352,10 @@ struct Table : Stats { ::write(fid_keys, buf, Index::entry_sz); // Swap curent and next index entries. memcpy(buf, buf_next, Index::entry_sz); } - access_value(fid_values, value, table_name, write); + if (mode_async) + std::async([this, fid_values, &value, &table_name, write]{ access_value(fid_values, value, table_name, write); }).get(); // Write value to values file + else + access_value(fid_values, value, table_name, write); // Write value to file if (deleted_keys>0) msg+=format(" compacted {} index entries", deleted_keys); if (trace_level & (1 << ETrace::FILEIO)) @@ -421,11 +427,17 @@ struct Table : Stats { { Index entry; std::string value; - entry.access(fid_keys, fid_values, &value, name, false); // read entry + if (mode_async) + std::async([&entry, &value, this]{ entry.access(fid_keys, fid_values, &value, name, false); }).get(); // read entry + else + entry.access(fid_keys, fid_values, &value, name, false); // read entry if (entry.vfpos == Index::end_marker) break; entry.index = index++; - entry.access(fid_keys, fid_temp, &value, name, true); // write entry + if (mode_async) + std::async([&entry, &value, fid_temp, this]{ entry.access(fid_keys, fid_temp, &value, name, true); }).get(); // write entry + else + entry.access(fid_keys, fid_temp, &value, name, true); // write entry } lseek(fid_temp, 0, SEEK_SET); lseek(fid_values, 0, SEEK_SET); @@ -514,9 +526,15 @@ struct Table : Stats { off_t fpos_keys = x->second->fpos; lseek(fid_keys, fpos_keys, SEEK_SET); Index entry; - entry.access(fid_keys, fid_values, nullptr, name, false); // Read index entry from file + if (mode_async) + std::async([&entry, this]{ entry.access(fid_keys, fid_values, nullptr, name, false); }).get(); // Read index entry from file ignoring value + else + entry.access(fid_keys, fid_values, nullptr, name, false); // Read index entry from file ignoring value entry.vfpos = Index::deleted_marker; - entry.access(fid_keys, fid_values, nullptr, name, true); // Write index entry back to file + if (mode_async) + std::async([&entry, this]{ entry.access(fid_keys, fid_values, nullptr, name, true); }).get(); // Write index entry back to file ignoring value + else + entry.access(fid_keys, fid_values, nullptr, name, true); // Write index entry back to file ignoring value values.erase(x->second->it_value); keys.erase(x->second); xref.erase(x); @@ -533,7 +551,10 @@ struct Table : Stats { Index entry; while (true) { - entry.access(fid_keys, fid_values, nullptr, name, false); // Read index entry from file + if (mode_async) + std::async([&entry, this]{ entry.access(fid_keys, fid_values, nullptr, name, false); }).get(); // Read index entry from file ignoring value + else + entry.access(fid_keys, fid_values, nullptr, name, false); // Read index entry from file ignoring value if (entry.vfpos==Index::end_marker) break; if (key==entry.key) @@ -544,14 +565,20 @@ struct Table : Stats { if (remove) { entry.vfpos = Index::deleted_marker; - entry.access(fid_keys, fid_values, nullptr, name, true); // Write index entry back to file + if (mode_async) + std::async([&entry, this]{ entry.access(fid_keys, fid_values, nullptr, name, true); }).get(); // Write index entry back to file ignoring value + else + entry.access(fid_keys, fid_values, nullptr, name, true); // Write index entry back to file ignoring value entries--; if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) applog.info("CACHE|FILEIO: get (remove) {} {}", key, value); } else { - entry.access_value(fid_values, &value, name, false); + if (mode_async) + std::async([&entry, &value, this]{ entry.access_value(fid_values, &value, name, false); }).get(); // Read value from values file + else + entry.access_value(fid_values, &value, name, false); // Read value from values file evict(); off_t fpos_keys = entry.index * Index::entry_sz; values.push_front({value, entry.vfpos, entry.vsz}); @@ -597,7 +624,10 @@ struct Table : Stats { branch += "Insert"; off_t fpos_keys = lseek(fid_keys, 0, SEEK_END); entry.index = fpos_keys / Index::entry_sz; - entry.access(fid_keys, fid_values, &val, name, true); // write key to keys file and value to values file + if (mode_async) + std::async([&entry, &val, this]{ entry.access(fid_keys, fid_values, &val, name, true); }).get(); // write key to keys file and value to values file + else + entry.access(fid_keys, fid_values, &val, name, true); // write key to keys file and value to values file evict(); values.push_front({val, entry.vfpos, 0}); // load into cache keys.push_front({key, fpos_keys, values.begin()}); @@ -614,7 +644,10 @@ struct Table : Stats { entry.index = x->second->fpos / Index::entry_sz; if (inplace) entry.vfpos = fpos_values; - entry.access(fid_keys, fid_values, &val, name, true); + if (mode_async) + std::async([&entry, &val, this]{ entry.access(fid_keys, fid_values, &val, name, true); }).get(); // Read index entry from file ignoring value + else + entry.access(fid_keys, fid_values, &val, name, true); // Read index entry from file ignoring value values.erase(x->second->it_value); off_t fpos_keys = entry.index * Index::entry_sz; values.push_front({val, fpos_keys, (ssize_t)value.length()}); @@ -631,15 +664,15 @@ struct Table : Stats { operator std::string() const { return sstring(VERSION) + "\n" + - "table:" + name + "\n" + + "table: " + name + "\n" + Stats::operator::std::string() + format( - "index entries:{}\n" - "cache_entries:{}\n" - "lock_cache:{}\n" - "lock_fio:{}\n" - "readers:{}\n" - "value spaces:{}\n", + "index entries: {}\n" + "cache_entries: {}\n" + "lock_cache: {}\n" + "lock_fio: {}\n" + "readers: {}\n" + "value spaces: {}\n", entries, xref.size(), lock_cache, @@ -648,7 +681,7 @@ struct Table : Stats { spaces ); } - static bool self_test(int test, int loop, std::string &s) + static bool _self_test(int test, int loop, std::string &s) { bool ok = true; sstring t; @@ -657,8 +690,16 @@ struct Table : Stats { if (loop>1) for (int i=0; isecond; if (test==1) { - if (!table.set("aaa", "_aaa_", false)) // insert + std::string keys[] = {"aaa", "bbb"}; + std::string values0[] = {"_aaa_", "_bbb_"}; + for (int i=0; auto key : keys) + if (auto value = values0[i++]; !table.set(key, value, false)) // insert (key=value)s + { + t = format("Failed to insert {}={}", key, value); LOG; + ok = false; + } + for (int i=0; auto key : keys) // retrieve values of keys { - t = format("Failed to insert aaa=_aaa_"); LOG; - ok = false; + std::string value; + if (!table.get(key, value).found) // read + { + t = format("Failed to retrieve {}", key); LOG; + ok = false; + } + if (value!=values0[i]) + { + t = format("Unexpected value for key {}={} <> {}", key, value, values0[i]); LOG; + ok = false; + } + i++; } - if (!table.set("bbb", "_bbb_", false)) // insert + if (std::string value; !table.get(keys[0], value, true).found) // delete { - t = format("Failed to insert bbb=_bbb_"); LOG; + t = format("Delete failed for key {}", keys[0]); LOG; ok = false; } - if (std::string value; !table.get("aaa", value, false, true).found) // delete + for (int i=0; auto key : keys) // retrieve values of keys { - t = format("Delete failed for key aaa"); LOG; - ok = false; + std::string value; + bool found = table.get(key, value).found; // read + if (i==0) + { + if (found) + { + t = format("Key {} was not deleted", key); LOG; + ok = false; + } + } + else if (value!=values0[i]) + { + t = format("Unexpected value for key {}={} <> {}", key, value, values0[i]); LOG; + ok = false; + } + i++; } } else @@ -774,7 +847,7 @@ struct Table : Stats { t = table.list(true); LOG; // revolve though index keys once } } - t = format("... test {} {}.\n", test, ok ? "passed" : "failed") + Stats::get_static_profiles(); LOG; + t = format("... test {} ==== {} ====.\n", test, ok ? "PASSED" : "FAILED") + Stats::get_static_profiles(); LOG; return ok; } bool get_file(std::string &val, bool keys) @@ -886,6 +959,7 @@ struct Table : Stats { }; std::map Table::tables; std::atomic_bool Table::tables_lock = false; +bool Table::mode_async = false; class DefaultHandle : public httpd::handler_base { public: @@ -896,23 +970,30 @@ class DefaultHandle : public httpd::handler_base { sstring s; s += plain_text ? format("{}.{}\n", VERSION) + + format("Global stats: {}\n", Stats::get_static_profiles()) + format("Global commands\n") : sstring("

") + VERSION + "

\n" + + format("Global stats: {}
\n", Stats::get_static_profiles()) + "\n\n\n\n\n" + sstring("

Global commands:

\n

"); struct {const char*label, *str; } args_global[] = { + //{"Prometeus server", "metrics?__name__=http*"}, {"QUIT", "quit"}, {"trace level all ON", "?trace_level=11111"}, {"trace level all OFF", "?trace_level=00000"}, {"list tables in use", "?used"}, + {"mode async", "?mode=async"}, + {"mode sync(default)", "?mode=sync"}, + {"view console file", "?file_console"}, }; for (auto arg : args_global) s += plain_text ? @@ -1011,6 +1092,7 @@ class DefaultHandle : public httpd::handler_base { sstring s = ""; bool plain = plain_text; auto it_table = Table::tables.end(); + Stats::requests++; if (req->query_parameters.size()==0) // HELP s += build_help(url, host, table_name); else if (req->query_parameters.contains("trace_level")) @@ -1040,7 +1122,41 @@ class DefaultHandle : public httpd::handler_base { } s = format("Changing trace_level from {} to {}", old_tl, new_tl); trace_level = new_trace_level; - plain = true; + } + else if (req->query_parameters.contains("mode")) + { + auto level = req->query_parameters.at("mode"); + bool old_mode = Table::mode_async; + bool new_mode = old_mode; + if (level=="async") + new_mode=true; + else if (level=="sync") + new_mode=false; + s = format("Changing mode from {} to {}", old_mode ? "async" : "sync", new_mode ? "async" : "sync"); + Table::mode_async = new_mode; + } + else if (req->query_parameters.contains("file_console")) + { + auto fid_console = open((Table::db_prefix + std::string("") + Table::console_fname).c_str(), O_RDWR /*| O_TMPFILE*/, S_IREAD|S_IWRITE|S_IRGRP|S_IROTH); + std::string text; + if (fid_console>0) + { + auto fsize = lseek(fid_console, 0, SEEK_END); + ssize_t max_size = 0x10000; + size_t fpos = (max_size < fsize) ? 0 : (fsize - max_size); + if (fpos>0) + max_size = fsize - fpos; + lseek(fid_console, fpos, SEEK_SET); + text.resize(max_size); + if (::read(fid_console, (char*)text.c_str(), max_size) != max_size) + text = format(", Error {} reading console file\n", errno) + text; + ::close(fid_console); + } + else + text = format(", Error {} opening console file", errno); + if (trace_level & (1 << ETrace::FILEIO)) + applog.info("SERVER: {}{}{}", s, "console", text); + s += text; } else if (req->query_parameters.contains("use")) { @@ -1066,7 +1182,9 @@ class DefaultHandle : public httpd::handler_base { int l; sscanf(loop.c_str(),"%d", &l); std::string text; - bool result = Table::self_test(tn, l, text); + bool result = Table::mode_async ? + std::async([tn,l,&text]{ return Table::_self_test(tn, l, text); }).get() : + Table::_self_test(tn, l, text); std::string::size_type n = 0; const std::string rwhat = "\n"; const std::string rwith = "
\n"; @@ -1100,12 +1218,8 @@ class DefaultHandle : public httpd::handler_base { else if (req->query_parameters.contains("stats")) s += sstring(s.length() > 0 ? "\n" : "") + format( "{}" - "LockPasses:{}\n" - "LockCollisions:{}\n" , - (std::string)table, - Lock::passes, - Lock::collisions); + (std::string)table); else if (req->query_parameters.contains("drop")) { s += table.purge(true); @@ -1161,7 +1275,7 @@ class DefaultHandle : public httpd::handler_base { } } if (trace_level & (1 << ETrace::SERVER)) - applog.info("SERVER: DB request {} on table {}, {}", Stats::requests++, table_name, s); + applog.info("SERVER: DB request {} on table {}, {}", Stats::requests, table_name, s); plain = true; } rep->_content = s; @@ -1170,21 +1284,33 @@ class DefaultHandle : public httpd::handler_base { } } defaultHandle(false); +class QuitHandle : public httpd::handler_base { +public: + virtual future > handle(const sstring& path, + std::unique_ptr req, std::unique_ptr rep) + { + // Need to quit the reactor, but also back the web browser. + // Set a future to trigger after the page is sent-out for rendering + auto rv = seastar::sleep(1s).then([] { + if (trace_level & (1 << ETrace::SERVER)) + applog.info("SERVER: exiting..."); + // This doesn't do the job: seastar::engine().exit(0); // gracefully... + exit(0); // not so gracefully... + }); + rep->_content = "Server shutting down\n"; + rep->done("html"); + return make_ready_future>(std::move(rep)); + } +} quitHandle; + void set_routes(routes& r) { - function_handler* h4 = new function_handler([](const_req req) { - std::string s = "Server shutting down"; - exit(0); - if (trace_level & (1 << ETrace::SERVER)) - applog.info("SERVER: {}", s); - return s; - }); r.add_default_handler(&defaultHandle); - r.add(operation_type::GET, url("/quit"), h4); + r.add(operation_type::GET, url("/quit"), &quitHandle); r.add(operation_type::GET, url("/file").remainder("path"), new directory_handler("/")); } int main(int ac, char** av) { - applog.info("Db demo {}", VERSION); + applog.info("{}", VERSION); httpd::http_server_control prometheus_server; prometheus::config pctx; app_template app; From 16dcc78c2028afe63e6842579c64a55f31c017b8 Mon Sep 17 00:00:00 2001 From: Alexander Mihail Date: Tue, 16 Apr 2024 22:22:37 +0300 Subject: [PATCH 16/19] Using a timer future to quit the process but have the browser navigate back to the main page before that. This is to avoid quit-restarting in a loop. Perparing to async-ify. A global and configurable mode_async. Added the static Table::co_self_test coroutine to wrap around run Table::self_test. The HTTP DefaultHandler calls either the self_test or the co_self_test depending on mode_async. In async mode, the self-test, which is a huge time penalty, is coroutined in the hope that it would split-up into individual, smaller, batches for the SHARD executor. This is to increase parallelism of the HTTP server when multiple users are concurrently active. Table::self_test is recursive in loop mode, and potentially endless. Merged the Prometheus sats server into the Database Demo server so only one port is exposed from the demo container. Added a rest provision to read the console log, if available. Reporting the sub-log of a Failed test when running in a loop. Git-ignoring Visual Studio temporary files and user-files of cmake. Working on issue #17. --- demos/db_demo.cc | 221 ++++++++++++++++------------------------------- 1 file changed, 75 insertions(+), 146 deletions(-) diff --git a/demos/db_demo.cc b/demos/db_demo.cc index 0664c4a32f3..8877799d0bf 100755 --- a/demos/db_demo.cc +++ b/demos/db_demo.cc @@ -63,6 +63,7 @@ * - Cache is currently WRITETHROUGH. */ +#include "seastar/coroutine/maybe_yield.hh" #include #include #include @@ -294,10 +295,7 @@ struct Table : Stats { sstring msg; if (write) { - if (mode_async) - std::async([this, fid_values, &value, &table_name, write]{access_value(fid_values, value, table_name, write);}).get(); // Read value from values file - else - access_value(fid_values, value, table_name, write); // Read value from values file + access_value(fid_values, value, table_name, write); // Read value from values file auto fpos_keys = lseek(fid_keys, index * entry_sz, SEEK_SET); sprintf(buf, "%s,%jd,%zu,", key, vfpos, vsz); len = strlen(buf); @@ -352,10 +350,7 @@ struct Table : Stats { ::write(fid_keys, buf, Index::entry_sz); // Swap curent and next index entries. memcpy(buf, buf_next, Index::entry_sz); } - if (mode_async) - std::async([this, fid_values, &value, &table_name, write]{ access_value(fid_values, value, table_name, write); }).get(); // Write value to values file - else - access_value(fid_values, value, table_name, write); // Write value to file + access_value(fid_values, value, table_name, write); // Write value to file if (deleted_keys>0) msg+=format(" compacted {} index entries", deleted_keys); if (trace_level & (1 << ETrace::FILEIO)) @@ -427,17 +422,11 @@ struct Table : Stats { { Index entry; std::string value; - if (mode_async) - std::async([&entry, &value, this]{ entry.access(fid_keys, fid_values, &value, name, false); }).get(); // read entry - else - entry.access(fid_keys, fid_values, &value, name, false); // read entry + entry.access(fid_keys, fid_values, &value, name, false); // read entry if (entry.vfpos == Index::end_marker) break; entry.index = index++; - if (mode_async) - std::async([&entry, &value, fid_temp, this]{ entry.access(fid_keys, fid_temp, &value, name, true); }).get(); // write entry - else - entry.access(fid_keys, fid_temp, &value, name, true); // write entry + entry.access(fid_keys, fid_temp, &value, name, true); // write entry } lseek(fid_temp, 0, SEEK_SET); lseek(fid_values, 0, SEEK_SET); @@ -526,15 +515,9 @@ struct Table : Stats { off_t fpos_keys = x->second->fpos; lseek(fid_keys, fpos_keys, SEEK_SET); Index entry; - if (mode_async) - std::async([&entry, this]{ entry.access(fid_keys, fid_values, nullptr, name, false); }).get(); // Read index entry from file ignoring value - else - entry.access(fid_keys, fid_values, nullptr, name, false); // Read index entry from file ignoring value + entry.access(fid_keys, fid_values, nullptr, name, false); // Read index entry from file ignoring value entry.vfpos = Index::deleted_marker; - if (mode_async) - std::async([&entry, this]{ entry.access(fid_keys, fid_values, nullptr, name, true); }).get(); // Write index entry back to file ignoring value - else - entry.access(fid_keys, fid_values, nullptr, name, true); // Write index entry back to file ignoring value + entry.access(fid_keys, fid_values, nullptr, name, true); // Write index entry back to file ignoring value values.erase(x->second->it_value); keys.erase(x->second); xref.erase(x); @@ -551,10 +534,7 @@ struct Table : Stats { Index entry; while (true) { - if (mode_async) - std::async([&entry, this]{ entry.access(fid_keys, fid_values, nullptr, name, false); }).get(); // Read index entry from file ignoring value - else - entry.access(fid_keys, fid_values, nullptr, name, false); // Read index entry from file ignoring value + entry.access(fid_keys, fid_values, nullptr, name, false); // Read index entry from file ignoring value if (entry.vfpos==Index::end_marker) break; if (key==entry.key) @@ -565,20 +545,14 @@ struct Table : Stats { if (remove) { entry.vfpos = Index::deleted_marker; - if (mode_async) - std::async([&entry, this]{ entry.access(fid_keys, fid_values, nullptr, name, true); }).get(); // Write index entry back to file ignoring value - else - entry.access(fid_keys, fid_values, nullptr, name, true); // Write index entry back to file ignoring value + entry.access(fid_keys, fid_values, nullptr, name, true); // Write index entry back to file ignoring value entries--; if (trace_level & ((1 << ETrace::FILEIO) | (1 << ETrace::CACHE))) applog.info("CACHE|FILEIO: get (remove) {} {}", key, value); } else { - if (mode_async) - std::async([&entry, &value, this]{ entry.access_value(fid_values, &value, name, false); }).get(); // Read value from values file - else - entry.access_value(fid_values, &value, name, false); // Read value from values file + entry.access_value(fid_values, &value, name, false); // Read value from values file evict(); off_t fpos_keys = entry.index * Index::entry_sz; values.push_front({value, entry.vfpos, entry.vsz}); @@ -624,10 +598,7 @@ struct Table : Stats { branch += "Insert"; off_t fpos_keys = lseek(fid_keys, 0, SEEK_END); entry.index = fpos_keys / Index::entry_sz; - if (mode_async) - std::async([&entry, &val, this]{ entry.access(fid_keys, fid_values, &val, name, true); }).get(); // write key to keys file and value to values file - else - entry.access(fid_keys, fid_values, &val, name, true); // write key to keys file and value to values file + entry.access(fid_keys, fid_values, &val, name, true); // write key to keys file and value to values file evict(); values.push_front({val, entry.vfpos, 0}); // load into cache keys.push_front({key, fpos_keys, values.begin()}); @@ -644,10 +615,7 @@ struct Table : Stats { entry.index = x->second->fpos / Index::entry_sz; if (inplace) entry.vfpos = fpos_values; - if (mode_async) - std::async([&entry, &val, this]{ entry.access(fid_keys, fid_values, &val, name, true); }).get(); // Read index entry from file ignoring value - else - entry.access(fid_keys, fid_values, &val, name, true); // Read index entry from file ignoring value + entry.access(fid_keys, fid_values, &val, name, true); // Read index entry from file ignoring value values.erase(x->second->it_value); off_t fpos_keys = entry.index * Index::entry_sz; values.push_front({val, fpos_keys, (ssize_t)value.length()}); @@ -681,7 +649,7 @@ struct Table : Stats { spaces ); } - static bool _self_test(int test, int loop, std::string &s) + static bool self_test(int test, int loop, std::string &s) { bool ok = true; sstring t; @@ -692,8 +660,8 @@ struct Table : Stats { { std::string localt; bool local_ok = ok && mode_async ? - std::async([test, &localt]{ return _self_test(test, 1, localt); }).get() : - _self_test(test, 1, localt); + co_self_test(test, 1, localt).get() : + self_test(test, 1, localt); if (local_ok != ok) { t = localt; @@ -850,6 +818,10 @@ struct Table : Stats { t = format("... test {} ==== {} ====.\n", test, ok ? "PASSED" : "FAILED") + Stats::get_static_profiles(); LOG; return ok; } + static seastar::future co_self_test(int test, int loop, std::string &s) + { + co_return self_test(test, loop, s); + } bool get_file(std::string &val, bool keys) { auto fid = keys ? fid_keys : fid_values; @@ -963,17 +935,10 @@ bool Table::mode_async = false; class DefaultHandle : public httpd::handler_base { public: - bool plain_text; - DefaultHandle(bool plain_text) : plain_text(plain_text) {} auto build_help(sstring url, sstring host, sstring table_name) { sstring s; - s += plain_text ? - format("{}.{}\n", VERSION) + - format("Global stats: {}\n", Stats::get_static_profiles()) + - format("Global commands\n") - : - sstring("

") + VERSION + "

\n" + + s += sstring("

") + VERSION + "

\n" + format("Global stats: {}
\n", Stats::get_static_profiles()) + "\n\n