From fc009541688e489eab8da8a5a701360050b927e9 Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 12:49:10 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .clang-format | 29 + .clang-tidy | 117 + .clangd | 3 + .dockerignore | 3 + .github/workflows/build-dev-docker-image.yml | 52 + .github/workflows/build.yml | 30 + .gitignore | 17 + .gitmodules | 42 + CMakeLists.txt | 208 + Cargo.lock | 2139 ++ Cargo.toml | 22 + LICENSE | 21 + README.md | 129 + README.wehub.md | 7 + benchmarks/CMakeLists.txt | 1 + benchmarks/fio_usrbio/Makefile | 23 + benchmarks/fio_usrbio/README.md | 40 + benchmarks/fio_usrbio/hf3fs_usrbio.cpp | 286 + benchmarks/storage_bench/CMakeLists.txt | 1 + benchmarks/storage_bench/StorageBench.cc | 291 + benchmarks/storage_bench/StorageBench.h | 906 + cmake/AddCrate.cmake | 33 + cmake/ApacheArrow.cmake | 61 + cmake/CLangFormat.cmake | 24 + cmake/CLangTidy.cmake | 52 + cmake/CTestCustom.cmake | 12 + cmake/CodeCoverage.cmake | 27 + cmake/CompileFlags.cmake | 21 + cmake/DumpConfig.cmake | 15 + cmake/GitVersion.cmake | 127 + cmake/Jemalloc.cmake | 20 + cmake/Sanitizers.cmake | 242 + cmake/Target.cmake | 109 + configs/admin_cli.toml | 338 + configs/hf3fs_client_agent.toml | 557 + configs/hf3fs_client_agent_app.toml | 1 + configs/hf3fs_client_agent_launcher.toml | 88 + configs/hf3fs_fuse_main.toml | 450 + configs/hf3fs_fuse_main_app.toml | 1 + configs/hf3fs_fuse_main_launcher.toml | 95 + configs/meta_main.toml | 633 + configs/meta_main_app.toml | 2 + configs/meta_main_launcher.toml | 93 + configs/mgmtd_main.toml | 232 + configs/mgmtd_main_app.toml | 2 + configs/mgmtd_main_launcher.toml | 44 + configs/monitor_collector_main.toml | 141 + configs/storage_main.toml | 510 + configs/storage_main_app.toml | 2 + configs/storage_main_launcher.toml | 93 + deploy/README.md | 374 + deploy/data_placement/.gitignore | 17 + deploy/data_placement/README.md | 72 + deploy/data_placement/requirements.txt | 12 + deploy/data_placement/src/__init__.py | 0 .../src/model/data_placement.py | 549 + .../src/model/data_placement_job.py | 108 + deploy/data_placement/src/setup/__init__.py | 0 .../src/setup/gen_chain_table.py | 124 + deploy/data_placement/test/test_model.py | 94 + deploy/data_placement/test/test_plan.py | 10 + deploy/data_placement/test/test_setup.py | 55 + deploy/sql/3fs-monitor.sql | 51 + deploy/systemd/hf3fs_fuse_main.service | 12 + deploy/systemd/meta_main.service | 12 + deploy/systemd/mgmtd_main.service | 12 + deploy/systemd/monitor_collector_main.service | 11 + deploy/systemd/storage_main.service | 14 + dockerfile/dev.centos9.dockerfile | 46 + dockerfile/dev.dockerfile | 51 + dockerfile/dev.opencloudos9.dockerfile | 53 + dockerfile/dev.ubuntu2004.dockerfile | 60 + docs/README.md | 6 + docs/design_notes.md | 290 + docs/images/gray_sort_client.png | Bin 0 -> 535589 bytes docs/images/gray_sort_server.png | Bin 0 -> 673307 bytes docs/images/kvcache_gc_iops.png | Bin 0 -> 349445 bytes docs/images/kvcache_read_throughput.png | Bin 0 -> 2701835 bytes docs/images/peak_throughput.jpg | Bin 0 -> 263271 bytes docs/metrics.md | 109 + hf3fs/__init__.py | 310 + hf3fs/fuse.py | 44 + hf3fs_fuse/__init__.py | 0 hf3fs_fuse/fuse.py | 7 + hf3fs_fuse/fuse_demo.py | 30 + hf3fs_fuse/io.py | 139 + hf3fs_utils/README.md | 37 + hf3fs_utils/__init__.py | 0 hf3fs_utils/cli.py | 192 + hf3fs_utils/fs.py | 234 + hf3fs_utils/hf3fs_cli | 5 + hf3fs_utils/trash.py | 176 + licenses/argparse/LICENSE | 7 + licenses/arrow/LICENSE.txt | 2292 ++ licenses/boost/LICENSE_1_0.txt | 23 + licenses/foundationdb/LICENSE | 207 + licenses/leveldb/LICENSE | 27 + licenses/linenoise/LICENSE | 25 + licenses/magic_enum/LICENSE | 21 + licenses/nameof/LICENSE | 21 + licenses/rapidcsv/LICENSE | 29 + licenses/robin-hood-hashing/LICENSE | 21 + licenses/smhasher/LICENSE | 23 + licenses/tomlplusplus/LICENSE | 16 + licenses/utf8.h/LICENSE | 24 + patches/apply.sh | 23 + patches/folly.patch | 1437 ++ patches/rocksdb.patch | 13 + patches/rocksdb.patch.2 | 107 + setup.py | 94 + setup_hf3fs_utils.py | 13 + specs/.config/dotnet-tools.json | 13 + specs/.gitignore | 7 + specs/DataStorage/DataStorage.csproj | 15 + specs/DataStorage/DataStorage.pproj | 12 + specs/DataStorage/PSpec/SystemSpec.p | 492 + specs/DataStorage/PSrc/Common.p | 30 + specs/DataStorage/PSrc/MgmtClient.p | 75 + specs/DataStorage/PSrc/MgmtService.p | 623 + specs/DataStorage/PSrc/StorageClient.p | 315 + specs/DataStorage/PSrc/StorageModules.p | 9 + specs/DataStorage/PSrc/StorageService.p | 2243 ++ specs/DataStorage/PTst/TestDriver.p | 804 + specs/DataStorage/PTst/TestScript.p | 57 + specs/RDMASocket/PSpec/SystemSpec.p | 163 + specs/RDMASocket/PSrc/RDMAModules.p | 2 + specs/RDMASocket/PSrc/RDMASocket.p | 556 + specs/RDMASocket/PTst/TestDriver.p | 418 + specs/RDMASocket/PTst/TestScript.p | 11 + specs/RDMASocket/RDMASocket.csproj | 15 + specs/RDMASocket/RDMASocket.pproj | 10 + specs/README.md | 71 + specs/RunTests.ps1 | 237 + specs/Timer/LICENSE.txt | 20 + specs/Timer/PSrc/Timer.p | 64 + specs/Timer/PSrc/TimerModules.p | 2 + specs/Timer/README.md | 6 + specs/Timer/Timer.pproj | 8 + src/CMakeLists.txt | 18 + src/analytics/CMakeLists.txt | 1 + src/analytics/Common.h | 65 + src/analytics/SerdeObjectReader.h | 238 + src/analytics/SerdeObjectVisitor.h | 129 + src/analytics/SerdeObjectWriter.h | 241 + src/analytics/SerdeSchemaBuilder.h | 219 + src/analytics/SerdeStructVisitor.h | 123 + src/analytics/StructuredTraceLog.h | 285 + src/client/CMakeLists.txt | 6 + src/client/bin/CMakeLists.txt | 2 + src/client/bin/admin_cli.cc | 238 + src/client/cli/CMakeLists.txt | 2 + src/client/cli/admin/AdminEnv.h | 25 + src/client/cli/admin/AdminUserCtrl.cc | 402 + src/client/cli/admin/AdminUserCtrl.h | 8 + src/client/cli/admin/Bench.cc | 137 + src/client/cli/admin/Bench.h | 10 + src/client/cli/admin/CMakeLists.txt | 1 + src/client/cli/admin/Chdir.cc | 75 + src/client/cli/admin/Chdir.h | 8 + src/client/cli/admin/Checksum.cc | 169 + src/client/cli/admin/Checksum.h | 10 + src/client/cli/admin/Create.cc | 51 + src/client/cli/admin/Create.h | 8 + src/client/cli/admin/CreateRange.cc | 81 + src/client/cli/admin/CreateRange.h | 8 + src/client/cli/admin/CreateTarget.cc | 83 + src/client/cli/admin/CreateTarget.h | 8 + src/client/cli/admin/CreateTargets.cc | 80 + src/client/cli/admin/CreateTargets.h | 10 + src/client/cli/admin/DecodeUserToken.cc | 36 + src/client/cli/admin/DecodeUserToken.h | 8 + src/client/cli/admin/DropUserCache.cc | 77 + src/client/cli/admin/DropUserCache.h | 8 + src/client/cli/admin/DumpChainTable.cc | 54 + src/client/cli/admin/DumpChainTable.h | 8 + src/client/cli/admin/DumpChains.cc | 60 + src/client/cli/admin/DumpChains.h | 8 + src/client/cli/admin/DumpChunkMeta.cc | 263 + src/client/cli/admin/DumpChunkMeta.h | 36 + src/client/cli/admin/DumpDirEntries.cc | 164 + src/client/cli/admin/DumpDirEntries.h | 30 + src/client/cli/admin/DumpInodes.cc | 342 + src/client/cli/admin/DumpInodes.h | 44 + src/client/cli/admin/DumpSession.cc | 89 + src/client/cli/admin/DumpSession.h | 8 + src/client/cli/admin/FileWrapper.cc | 287 + src/client/cli/admin/FileWrapper.h | 83 + src/client/cli/admin/FillZero.cc | 123 + src/client/cli/admin/FillZero.h | 10 + src/client/cli/admin/FindOrphanedChunks.cc | 183 + src/client/cli/admin/FindOrphanedChunks.h | 10 + src/client/cli/admin/GetConfig.cc | 180 + src/client/cli/admin/GetConfig.h | 8 + .../cli/admin/GetLastConfigUpdateRecord.cc | 83 + .../cli/admin/GetLastConfigUpdateRecord.h | 8 + src/client/cli/admin/GetRealPath.cc | 35 + src/client/cli/admin/GetRealPath.h | 8 + src/client/cli/admin/HotUpdateConfig.cc | 121 + src/client/cli/admin/HotUpdateConfig.h | 8 + src/client/cli/admin/InitCluster.cc | 182 + src/client/cli/admin/InitCluster.h | 8 + src/client/cli/admin/Layout.h | 67 + src/client/cli/admin/List.cc | 70 + src/client/cli/admin/List.h | 8 + src/client/cli/admin/ListChainTables.cc | 54 + src/client/cli/admin/ListChainTables.h | 8 + src/client/cli/admin/ListChains.cc | 165 + src/client/cli/admin/ListChains.h | 8 + src/client/cli/admin/ListClients.cc | 109 + src/client/cli/admin/ListClients.h | 8 + src/client/cli/admin/ListGc.cc | 62 + src/client/cli/admin/ListGc.h | 8 + src/client/cli/admin/ListNodes.cc | 93 + src/client/cli/admin/ListNodes.h | 8 + src/client/cli/admin/ListTargets.cc | 104 + src/client/cli/admin/ListTargets.h | 8 + src/client/cli/admin/Mkdir.cc | 51 + src/client/cli/admin/Mkdir.h | 8 + src/client/cli/admin/OfflineTarget.cc | 64 + src/client/cli/admin/OfflineTarget.h | 8 + src/client/cli/admin/OpenRange.cc | 83 + src/client/cli/admin/OpenRange.h | 8 + src/client/cli/admin/ParseTargetMeta.cc | 66 + src/client/cli/admin/ParseTargetMeta.h | 10 + src/client/cli/admin/PruneSession.cc | 46 + src/client/cli/admin/PruneSession.h | 8 + src/client/cli/admin/QueryChunk.cc | 128 + src/client/cli/admin/QueryChunk.h | 10 + src/client/cli/admin/ReadBench.cc | 213 + src/client/cli/admin/ReadBench.h | 10 + src/client/cli/admin/ReadFile.cc | 135 + src/client/cli/admin/ReadFile.h | 10 + src/client/cli/admin/RecursiveChown.cc | 233 + src/client/cli/admin/RecursiveChown.h | 8 + src/client/cli/admin/RefreshRoutingInfo.cc | 36 + src/client/cli/admin/RefreshRoutingInfo.h | 8 + src/client/cli/admin/RegisterNode.cc | 41 + src/client/cli/admin/RegisterNode.h | 8 + src/client/cli/admin/RemoteCall.cc | 232 + src/client/cli/admin/RemoteCall.h | 8 + src/client/cli/admin/Remove.cc | 35 + src/client/cli/admin/Remove.h | 8 + src/client/cli/admin/RemoveChunks.cc | 206 + src/client/cli/admin/RemoveChunks.h | 8 + src/client/cli/admin/RemoveRange.cc | 77 + src/client/cli/admin/RemoveRange.h | 8 + src/client/cli/admin/RemoveTarget.cc | 64 + src/client/cli/admin/RemoveTarget.h | 8 + src/client/cli/admin/Rename.cc | 34 + src/client/cli/admin/Rename.h | 8 + src/client/cli/admin/RenderConfig.cc | 184 + src/client/cli/admin/RenderConfig.h | 8 + .../cli/admin/RotateAsPreferredOrder.cc | 38 + src/client/cli/admin/RotateAsPreferredOrder.h | 8 + src/client/cli/admin/RotateLastSrv.cc | 38 + src/client/cli/admin/RotateLastSrv.h | 8 + src/client/cli/admin/ScanTree.cc | 188 + src/client/cli/admin/ScanTree.h | 8 + src/client/cli/admin/SetConfig.cc | 72 + src/client/cli/admin/SetConfig.h | 8 + src/client/cli/admin/SetLayout.cc | 41 + src/client/cli/admin/SetLayout.h | 8 + src/client/cli/admin/SetNodeTags.cc | 85 + src/client/cli/admin/SetNodeTags.h | 8 + src/client/cli/admin/SetPermission.cc | 58 + src/client/cli/admin/SetPermission.h | 8 + .../cli/admin/SetPreferredTargetOrder.cc | 43 + .../cli/admin/SetPreferredTargetOrder.h | 8 + src/client/cli/admin/ShutdownAllChains.cc | 98 + src/client/cli/admin/ShutdownAllChains.h | 8 + src/client/cli/admin/Stat.cc | 194 + src/client/cli/admin/Stat.h | 8 + src/client/cli/admin/Symlink.cc | 34 + src/client/cli/admin/Symlink.h | 8 + src/client/cli/admin/UnregisterNode.cc | 53 + src/client/cli/admin/UnregisterNode.h | 8 + src/client/cli/admin/UpdateChain.cc | 51 + src/client/cli/admin/UpdateChain.h | 8 + src/client/cli/admin/UploadChainTable.cc | 90 + src/client/cli/admin/UploadChainTable.h | 8 + src/client/cli/admin/UploadChains.cc | 101 + src/client/cli/admin/UploadChains.h | 8 + src/client/cli/admin/Utils.cc | 38 + src/client/cli/admin/Utils.h | 10 + src/client/cli/admin/VerifyConfig.cc | 164 + src/client/cli/admin/VerifyConfig.h | 8 + src/client/cli/admin/WriteFile.cc | 130 + src/client/cli/admin/WriteFile.h | 10 + src/client/cli/admin/registerAdminCommands.cc | 139 + src/client/cli/admin/registerAdminCommands.h | 7 + src/client/cli/common/CMakeLists.txt | 2 + src/client/cli/common/Dispatcher.cc | 296 + src/client/cli/common/Dispatcher.h | 51 + src/client/cli/common/IEnv.h | 8 + src/client/cli/common/Parser.cc | 66 + src/client/cli/common/Parser.h | 22 + src/client/cli/common/Printer.cc | 26 + src/client/cli/common/Printer.h | 28 + src/client/cli/common/Utils.h | 9 + src/client/core/CMakeLists.txt | 1 + src/client/core/CoreClient.h | 37 + src/client/meta/CMakeLists.txt | 1 + src/client/meta/MetaClient.cc | 981 + src/client/meta/MetaClient.h | 327 + src/client/meta/ServerSelectionStrategy.cc | 228 + src/client/meta/ServerSelectionStrategy.h | 146 + src/client/mgmtd/CMakeLists.txt | 1 + src/client/mgmtd/CommonMgmtdClient.h | 50 + src/client/mgmtd/ICommonMgmtdClient.h | 40 + src/client/mgmtd/IMgmtdClientForAdmin.h | 57 + src/client/mgmtd/IMgmtdClientForClient.h | 23 + src/client/mgmtd/IMgmtdClientForServer.h | 24 + src/client/mgmtd/MgmtdClient.cc | 998 + src/client/mgmtd/MgmtdClient.h | 130 + src/client/mgmtd/MgmtdClientForAdmin.h | 98 + src/client/mgmtd/MgmtdClientForClient.h | 31 + src/client/mgmtd/MgmtdClientForServer.h | 35 + src/client/mgmtd/RoutingInfo.cc | 59 + src/client/mgmtd/RoutingInfo.h | 66 + src/client/mgmtd/ServiceInfo.h | 25 + src/client/storage/CMakeLists.txt | 1 + src/client/storage/StorageClient.cc | 112 + src/client/storage/StorageClient.h | 593 + src/client/storage/StorageClientBlobImpl.h | 81 + src/client/storage/StorageClientImpl.cc | 2560 +++ src/client/storage/StorageClientImpl.h | 239 + src/client/storage/StorageClientInMem.cc | 395 + src/client/storage/StorageClientInMem.h | 111 + src/client/storage/StorageMessenger.cc | 223 + src/client/storage/StorageMessenger.h | 97 + src/client/storage/TargetSelection.cc | 152 + src/client/storage/TargetSelection.h | 71 + src/client/storage/UpdateChannelAllocator.cc | 81 + src/client/storage/UpdateChannelAllocator.h | 36 + src/client/trash_cleaner/Cargo.toml | 24 + src/client/trash_cleaner/README.md | 21 + src/client/trash_cleaner/src/main.rs | 704 + src/common/CMakeLists.txt | 11 + src/common/app/AppInfo.cc | 240 + src/common/app/AppInfo.h | 157 + src/common/app/ApplicationBase.cc | 284 + src/common/app/ApplicationBase.h | 76 + src/common/app/ClientId.h | 58 + src/common/app/ConfigManager.cc | 113 + src/common/app/ConfigManager.h | 38 + src/common/app/ConfigStatus.h | 7 + src/common/app/ConfigUpdateRecord.h | 12 + src/common/app/NodeId.h | 7 + src/common/app/OnePhaseApplication.h | 145 + src/common/app/Thread.cc | 45 + src/common/app/Thread.h | 11 + src/common/app/TwoPhaseApplication.h | 114 + src/common/app/Utils.cc | 319 + src/common/app/Utils.h | 32 + src/common/app/gflags.cc | 15 + src/common/kv/IKVEngine.h | 15 + src/common/kv/ITransaction.cc | 88 + src/common/kv/ITransaction.h | 165 + src/common/kv/KeyPrefix-def.h | 26 + src/common/kv/KeyPrefix.h | 33 + src/common/kv/TransactionRetry.h | 13 + src/common/kv/WithTransaction.h | 80 + src/common/kv/mem/MemKV.h | 224 + src/common/kv/mem/MemKVEngine.h | 25 + src/common/kv/mem/MemTransaction.h | 379 + src/common/logging/AsyncFileWriter.cc | 93 + src/common/logging/AsyncFileWriter.h | 54 + src/common/logging/FileHandlerFactory.cc | 25 + src/common/logging/FileHandlerFactory.h | 23 + src/common/logging/FileHelper.cc | 112 + src/common/logging/FileHelper.h | 50 + src/common/logging/FileWriterFactory.cc | 103 + src/common/logging/FileWriterFactory.h | 23 + src/common/logging/IWritableFile.h | 17 + src/common/logging/ImmediateFileWriter.cc | 46 + src/common/logging/ImmediateFileWriter.h | 60 + src/common/logging/LogConfig.cc | 103 + src/common/logging/LogConfig.h | 137 + src/common/logging/LogFormatter.cc | 121 + src/common/logging/LogFormatter.h | 37 + src/common/logging/LogHelper.h | 21 + src/common/logging/LogInit.cc | 39 + src/common/logging/LogInit.h | 9 + src/common/logging/RotatingFile.cc | 106 + src/common/logging/RotatingFile.h | 36 + src/common/logging/SingleFile.cc | 18 + src/common/logging/SingleFile.h | 22 + src/common/monitor/ClickHouseClient.cc | 162 + src/common/monitor/ClickHouseClient.h | 36 + src/common/monitor/DigestBuilder.cc | 97 + src/common/monitor/DigestBuilder.h | 80 + src/common/monitor/LogReporter.cc | 66 + src/common/monitor/LogReporter.h | 28 + src/common/monitor/Monitor.cc | 257 + src/common/monitor/Monitor.h | 100 + src/common/monitor/MonitorCollectorClient.cc | 27 + src/common/monitor/MonitorCollectorClient.h | 34 + src/common/monitor/Recorder.cc | 341 + src/common/monitor/Recorder.h | 413 + src/common/monitor/Reporter.h | 17 + src/common/monitor/Sample.h | 118 + src/common/monitor/ScopedMetricsWriter.h | 73 + src/common/monitor/TaosClient.cc | 138 + src/common/monitor/TaosClient.h | 39 + src/common/net/Allocator.h | 45 + src/common/net/Client.h | 90 + src/common/net/EventLoop.cc | 188 + src/common/net/EventLoop.h | 86 + src/common/net/IOWorker.cc | 138 + src/common/net/IOWorker.h | 132 + src/common/net/IfAddrs.h | 131 + src/common/net/Listener.cc | 234 + src/common/net/Listener.h | 80 + src/common/net/MessageHeader.cc | 34 + src/common/net/MessageHeader.h | 96 + src/common/net/Network.h | 38 + src/common/net/PeerInfo.h | 9 + src/common/net/Processor.cc | 37 + src/common/net/Processor.h | 227 + src/common/net/RDMAControl.cc | 43 + src/common/net/RDMAControl.h | 56 + src/common/net/RequestOptions.h | 57 + src/common/net/Server.cc | 97 + src/common/net/Server.h | 101 + src/common/net/ServiceGroup.cc | 56 + src/common/net/ServiceGroup.h | 83 + src/common/net/Socket.h | 42 + src/common/net/ThreadPoolGroup.cc | 52 + src/common/net/ThreadPoolGroup.h | 86 + src/common/net/Transport.cc | 383 + src/common/net/Transport.h | 137 + src/common/net/TransportPool.cc | 212 + src/common/net/TransportPool.h | 108 + src/common/net/Waiter.cc | 135 + src/common/net/Waiter.h | 181 + src/common/net/WriteItem.cc | 157 + src/common/net/WriteItem.h | 207 + src/common/net/ib/IBConnect.cc | 743 + src/common/net/ib/IBConnect.h | 186 + src/common/net/ib/IBConnectService.h | 55 + src/common/net/ib/IBDevice.cc | 844 + src/common/net/ib/IBDevice.h | 322 + src/common/net/ib/IBSocket.cc | 1262 ++ src/common/net/ib/IBSocket.h | 582 + src/common/net/ib/RDMABuf.cc | 177 + src/common/net/ib/RDMABuf.h | 434 + src/common/net/sync/Client.h | 43 + src/common/net/sync/ConnectionPool.cc | 94 + src/common/net/sync/ConnectionPool.h | 37 + src/common/net/tcp/TcpSocket.cc | 228 + src/common/net/tcp/TcpSocket.h | 72 + src/common/serde/BigEndian.h | 25 + src/common/serde/CallContext.cc | 35 + src/common/serde/CallContext.h | 139 + src/common/serde/ClientContext.cc | 77 + src/common/serde/ClientContext.h | 204 + src/common/serde/ClientMockContext.h | 92 + src/common/serde/Echo.h | 22 + src/common/serde/MessagePacket.h | 89 + src/common/serde/Serde.cc | 409 + src/common/serde/Serde.h | 1000 + src/common/serde/SerdeComparisons.h | 37 + src/common/serde/SerdeHelper.h | 59 + src/common/serde/Service.h | 153 + src/common/serde/Services.h | 41 + src/common/serde/TypeName.h | 36 + src/common/serde/Visit.h | 69 + src/common/utils/Address.h | 123 + src/common/utils/ArgParse.h | 1606 ++ src/common/utils/AtomicSharedPtrTable.h | 76 + src/common/utils/AtomicValue.h | 37 + src/common/utils/BackgroundRunner.cc | 117 + src/common/utils/BackgroundRunner.h | 35 + src/common/utils/BoostFileSystemWrappers.cc | 93 + src/common/utils/BoostFileSystemWrappers.h | 31 + src/common/utils/BoundedQueue.h | 102 + src/common/utils/CPUExecutorGroup.cc | 134 + src/common/utils/CPUExecutorGroup.h | 61 + src/common/utils/CoLockManager.h | 122 + src/common/utils/ConcurrencyLimiter.h | 100 + src/common/utils/ConfigBase.cc | 221 + src/common/utils/ConfigBase.h | 925 + src/common/utils/ConstructLog.h | 15 + src/common/utils/Conversion.h | 20 + src/common/utils/CoroSynchronized.h | 56 + src/common/utils/Coroutine.h | 39 + src/common/utils/CoroutinesPool.h | 175 + src/common/utils/CountDownLatch.h | 37 + src/common/utils/DefaultRetryStrategy.h | 85 + src/common/utils/DestructionGuard.h | 20 + src/common/utils/DownwardBytes.h | 159 + src/common/utils/Duration.cc | 105 + src/common/utils/Duration.h | 79 + src/common/utils/DynamicCoroutinesPool.cc | 93 + src/common/utils/DynamicCoroutinesPool.h | 54 + src/common/utils/ExecutorStatsReporter.cc | 42 + src/common/utils/ExecutorStatsReporter.h | 23 + src/common/utils/ExponentialBackoffRetry.h | 49 + src/common/utils/FairSharedMutex.h | 18 + src/common/utils/FaultInjection.h | 149 + src/common/utils/FdWrapper.h | 65 + src/common/utils/FileUtils.cc | 36 + src/common/utils/FileUtils.h | 13 + src/common/utils/HandleException.h | 9 + src/common/utils/IdAllocator.h | 146 + src/common/utils/Int128.h | 25 + src/common/utils/Linenoise.c | 1334 ++ src/common/utils/Linenoise.h | 118 + src/common/utils/LockManager.h | 93 + src/common/utils/LogCommands.h | 117 + src/common/utils/LruCache.h | 118 + src/common/utils/MPSCQueue.h | 77 + src/common/utils/MagicEnum.hpp | 1817 ++ src/common/utils/MurmurHash3.cc | 404 + src/common/utils/MurmurHash3.h | 37 + src/common/utils/NameWrapper.h | 13 + src/common/utils/Nameof.hpp | 1287 ++ src/common/utils/ObjectPool.h | 123 + src/common/utils/OptionalUtils.h | 47 + src/common/utils/Path.cc | 8 + src/common/utils/Path.h | 28 + src/common/utils/PriorityCoroutinePool.h | 85 + src/common/utils/PriorityUnboundedQueue.h | 72 + src/common/utils/RandomUtils.h | 18 + src/common/utils/RapidCsv.h | 1541 ++ src/common/utils/ReentrantLockManager.cc | 155 + src/common/utils/ReentrantLockManager.h | 76 + src/common/utils/Reflection.h | 121 + src/common/utils/RenderConfig.cc | 76 + src/common/utils/RenderConfig.h | 10 + src/common/utils/RequestInfo.h | 24 + src/common/utils/Result.h | 167 + src/common/utils/RobinHood.h | 2484 +++ src/common/utils/RobinHoodUtils.h | 42 + src/common/utils/Selector.h | 58 + src/common/utils/Semaphore.h | 61 + src/common/utils/SemaphoreGuard.h | 41 + src/common/utils/SerDeser.h | 168 + src/common/utils/Shards.h | 34 + src/common/utils/Shuffle.h | 208 + src/common/utils/SimpleRingBuffer.h | 145 + src/common/utils/SimpleSemaphore.cc | 98 + src/common/utils/SimpleSemaphore.h | 29 + src/common/utils/Size.cc | 110 + src/common/utils/Size.h | 81 + src/common/utils/Status.h | 176 + src/common/utils/StatusCode.cc | 107 + src/common/utils/StatusCode.h | 47 + src/common/utils/StatusCodeConversion.cc | 40 + src/common/utils/StatusCodeConversion.h | 23 + src/common/utils/StatusCodeDetails.h | 283 + src/common/utils/String.h | 12 + src/common/utils/StringUtils.cc | 130 + src/common/utils/StringUtils.h | 56 + src/common/utils/StrongType.h | 141 + src/common/utils/SysResource.cc | 216 + src/common/utils/SysResource.h | 39 + src/common/utils/SysvShm.cc | 87 + src/common/utils/SysvShm.h | 28 + src/common/utils/Thief.h | 34 + src/common/utils/Toml.cc | 2 + src/common/utils/Toml.hpp | 17402 ++++++++++++++++ src/common/utils/Tracing.h | 129 + src/common/utils/TracingEvent.cc | 25 + src/common/utils/TracingEvent.h | 53 + src/common/utils/TracingEventDetails.h | 16 + src/common/utils/Transform.h | 21 + src/common/utils/TypeTraits.h | 277 + src/common/utils/UnorderedDense.h | 1470 ++ src/common/utils/UtcTime.cc | 29 + src/common/utils/UtcTime.h | 78 + src/common/utils/UtcTimeSerde.h | 14 + src/common/utils/Utf8.h | 1600 ++ src/common/utils/Uuid.cc | 13 + src/common/utils/Uuid.h | 70 + src/common/utils/Varint32.h | 31 + src/common/utils/Varint64.h | 31 + src/common/utils/VersionInfo.cc.in | 54 + src/common/utils/VersionInfo.h | 25 + src/common/utils/WorkStealingBlockingQueue.h | 256 + src/common/utils/ZSTD.h | 3 + src/common/utils/coding.cc | 155 + src/common/utils/coding.h | 109 + src/common/utils/suicide.cc | 17 + src/common/utils/suicide.h | 7 + src/core/CMakeLists.txt | 3 + src/core/README.md | 1 + src/core/app/CMakeLists.txt | 1 + src/core/app/LauncherUtils.cc | 21 + src/core/app/LauncherUtils.h | 7 + src/core/app/MgmtdClientFetcher.cc | 66 + src/core/app/MgmtdClientFetcher.h | 31 + src/core/app/ServerAppConfig.cc | 12 + src/core/app/ServerAppConfig.h | 20 + src/core/app/ServerEnv.cc | 29 + src/core/app/ServerEnv.h | 53 + src/core/app/ServerLauncher.cc | 12 + src/core/app/ServerLauncher.h | 79 + src/core/app/ServerLauncherConfig.cc | 15 + src/core/app/ServerLauncherConfig.h | 22 + src/core/app/ServerMgmtdClientFetcher.cc | 18 + src/core/app/ServerMgmtdClientFetcher.h | 10 + src/core/service/CMakeLists.txt | 1 + src/core/service/CoreService.cc | 14 + src/core/service/CoreService.h | 14 + src/core/service/ops/EchoOperation.h | 19 + src/core/service/ops/GetConfigOperation.h | 24 + .../ops/GetLastConfigUpdateRecordOperation.h | 24 + .../service/ops/HotUpdateConfigOperation.h | 24 + src/core/service/ops/Include.h | 8 + src/core/service/ops/RenderConfigOperation.h | 29 + src/core/service/ops/ShutdownOperation.h | 24 + src/core/user/CMakeLists.txt | 1 + src/core/user/UserCache.h | 120 + src/core/user/UserStore.cc | 180 + src/core/user/UserStore.h | 47 + src/core/user/UserStoreEx.cc | 83 + src/core/user/UserStoreEx.h | 26 + src/core/user/UserToken.cc | 100 + src/core/user/UserToken.h | 14 + src/core/utils/ServiceOperation.h | 101 + src/core/utils/runOp.h | 20 + src/fbs/CMakeLists.txt | 8 + src/fbs/core/CMakeLists.txt | 3 + src/fbs/core/service/CMakeLists.txt | 2 + src/fbs/core/service/CoreServiceBase.h | 12 + src/fbs/core/service/CoreServiceClient.h | 7 + src/fbs/core/service/CoreServiceDef.h | 10 + src/fbs/core/service/Rpc.h | 58 + src/fbs/core/user/CMakeLists.txt | 2 + src/fbs/core/user/User.cc | 80 + src/fbs/core/user/User.h | 103 + src/fbs/lib/Schema.h | 92 + src/fbs/lib/Service.h | 221 + src/fbs/macros/IStub.h | 39 + src/fbs/macros/ISyncStub.h | 39 + src/fbs/macros/SerdeDef.h | 8 + src/fbs/macros/Stub.h | 46 + src/fbs/macros/SyncStub.h | 45 + src/fbs/macros/Undef.h | 7 + src/fbs/meta/CMakeLists.txt | 1 + src/fbs/meta/Common.h | 285 + src/fbs/meta/FileOperation.cc | 350 + src/fbs/meta/FileOperation.h | 81 + src/fbs/meta/MockService.h | 42 + src/fbs/meta/Schema.cc | 199 + src/fbs/meta/Schema.h | 467 + src/fbs/meta/Service.h | 746 + src/fbs/meta/Utils.h | 447 + src/fbs/mgmtd/CMakeLists.txt | 2 + src/fbs/mgmtd/ChainInfo.cc | 7 + src/fbs/mgmtd/ChainInfo.h | 14 + src/fbs/mgmtd/ChainRef.h | 49 + src/fbs/mgmtd/ChainSetting.h | 11 + src/fbs/mgmtd/ChainTable.h | 15 + src/fbs/mgmtd/ChainTargetInfo.h | 14 + src/fbs/mgmtd/ChainTargetSetting.h | 13 + src/fbs/mgmtd/ClientSession.cc | 18 + src/fbs/mgmtd/ClientSession.h | 29 + src/fbs/mgmtd/ClientSessionData.h | 17 + src/fbs/mgmtd/ConfigInfo.h | 15 + src/fbs/mgmtd/HeartbeatInfo.h | 94 + src/fbs/mgmtd/LocalTargetInfo.h | 18 + src/fbs/mgmtd/MgmtdLeaseInfo.h | 25 + src/fbs/mgmtd/MgmtdServiceBase.h | 12 + src/fbs/mgmtd/MgmtdServiceClient.h | 7 + src/fbs/mgmtd/MgmtdServiceDef.h | 28 + src/fbs/mgmtd/MgmtdTypes.h | 57 + src/fbs/mgmtd/NodeConversion.cc | 16 + src/fbs/mgmtd/NodeConversion.h | 9 + src/fbs/mgmtd/NodeInfo.cc | 19 + src/fbs/mgmtd/NodeInfo.h | 71 + src/fbs/mgmtd/NodeStatusChange.h | 12 + src/fbs/mgmtd/PersistentNodeInfo.h | 18 + src/fbs/mgmtd/RoutingInfo.cc | 84 + src/fbs/mgmtd/RoutingInfo.h | 49 + src/fbs/mgmtd/Rpc.h | 235 + src/fbs/mgmtd/TargetInfo.h | 19 + src/fbs/migration/CMakeLists.txt | 1 + src/fbs/migration/SerdeService.h | 80 + src/fbs/monitor_collector/CMakeLists.txt | 1 + .../MonitorCollectorService.h | 15 + src/fbs/simple_example/CMakeLists.txt | 1 + src/fbs/simple_example/SerdeService.h | 18 + src/fbs/storage/CMakeLists.txt | 1 + src/fbs/storage/Common.cc | 109 + src/fbs/storage/Common.h | 803 + src/fbs/storage/Service.h | 25 + src/fdb/CMakeLists.txt | 1 + src/fdb/FDB.cc | 283 + src/fdb/FDB.h | 206 + src/fdb/FDBConfig.h | 22 + src/fdb/FDBContext.cc | 104 + src/fdb/FDBContext.h | 27 + src/fdb/FDBKVEngine.h | 45 + src/fdb/FDBRetryStrategy.h | 134 + src/fdb/FDBTransaction.cc | 440 + src/fdb/FDBTransaction.h | 60 + src/fdb/HybridKvEngine.cc | 63 + src/fdb/HybridKvEngine.h | 46 + src/fdb/HybridKvEngineConfig.h | 12 + src/fdb/error_definitions.h | 316 + src/fuse/CMakeLists.txt | 12 + src/fuse/FuseAppConfig.cc | 10 + src/fuse/FuseAppConfig.h | 16 + src/fuse/FuseApplication.cc | 125 + src/fuse/FuseApplication.h | 55 + src/fuse/FuseClients.cc | 440 + src/fuse/FuseClients.h | 243 + src/fuse/FuseConfig.h | 92 + src/fuse/FuseConfigFetcher.cc | 19 + src/fuse/FuseConfigFetcher.h | 10 + src/fuse/FuseLauncherConfig.cc | 10 + src/fuse/FuseLauncherConfig.h | 24 + src/fuse/FuseMainLoop.cc | 107 + src/fuse/FuseMainLoop.h | 11 + src/fuse/FuseOps.cc | 2716 +++ src/fuse/FuseOps.h | 8 + src/fuse/IoRing.cc | 285 + src/fuse/IoRing.h | 279 + src/fuse/IovTable.cc | 337 + src/fuse/IovTable.h | 39 + src/fuse/PioV.cc | 275 + src/fuse/PioV.h | 59 + src/fuse/UserConfig.cc | 174 + src/fuse/UserConfig.h | 64 + src/fuse/hf3fs_fuse.cpp | 83 + src/kv/CMakeLists.txt | 6 + src/kv/KVStore.cc | 27 + src/kv/KVStore.h | 132 + src/kv/LevelDBLogger.cpp | 37 + src/kv/LevelDBLogger.h | 13 + src/kv/LevelDBStore.cc | 194 + src/kv/LevelDBStore.h | 89 + src/kv/MemDBStore.h | 125 + src/kv/RocksDBStore.cc | 220 + src/kv/RocksDBStore.h | 85 + src/lib/CMakeLists.txt | 3 + src/lib/api/CMakeLists.txt | 9 + src/lib/api/UsrbIo.cc | 807 + src/lib/api/UsrbIo.md | 275 + src/lib/api/fuse.h | 58 + src/lib/api/hf3fs.h | 174 + src/lib/api/hf3fs_expected.h | 2031 ++ src/lib/api/hf3fs_usrbio.h | 173 + src/lib/common/CMakeLists.txt | 1 + src/lib/common/PerProcTable.h | 225 + src/lib/common/Shm.cc | 176 + src/lib/common/Shm.h | 102 + src/lib/common/paths.h | 5 + src/lib/py/CMakeLists.txt | 14 + src/lib/py/binding.cc | 496 + src/lib/py/usrbio_binding.cc | 470 + src/lib/rs/hf3fs-usrbio-sys/Cargo.toml | 11 + src/lib/rs/hf3fs-usrbio-sys/README | 1 + src/lib/rs/hf3fs-usrbio-sys/build.rs | 20 + src/lib/rs/hf3fs-usrbio-sys/lib/.dummy | 0 src/lib/rs/hf3fs-usrbio-sys/src/lib.rs | 279 + src/memory/CMakeLists.txt | 6 + src/memory/common/AllocatedMemoryCounter.cc | 160 + src/memory/common/AllocatedMemoryCounter.h | 63 + src/memory/common/CMakeLists.txt | 1 + src/memory/common/GlobalMemoryAllocator.cc | 196 + src/memory/common/GlobalMemoryAllocator.h | 47 + src/memory/common/MemoryAllocatorConfig.h | 11 + src/memory/common/MemoryAllocatorInterface.h | 20 + src/memory/common/OverrideCppNewDelete.h | 19 + src/memory/jemalloc/CMakeLists.txt | 1 + src/memory/jemalloc/JemallocLib.cc | 146 + src/memory/mimalloc/CMakeLists.txt | 1 + src/memory/mimalloc/MimallocLib.cc | 53 + src/meta/CMakeLists.txt | 2 + src/meta/base/Config.h | 133 + src/meta/components/AclCache.h | 79 + src/meta/components/ChainAllocator.h | 137 + src/meta/components/Distributor.cc | 321 + src/meta/components/Distributor.h | 98 + src/meta/components/FileHelper.cc | 246 + src/meta/components/FileHelper.h | 73 + src/meta/components/Forward.h | 172 + src/meta/components/GcManager.cc | 903 + src/meta/components/GcManager.h | 296 + src/meta/components/InodeIdAllocator.cc | 73 + src/meta/components/InodeIdAllocator.h | 134 + src/meta/components/SessionManager.cc | 334 + src/meta/components/SessionManager.h | 145 + src/meta/event/Event.cc | 71 + src/meta/event/Event.h | 74 + src/meta/event/Scan.cc | 285 + src/meta/event/Scan.h | 115 + src/meta/meta.cpp | 8 + src/meta/service/MetaOperator.cc | 439 + src/meta/service/MetaOperator.h | 212 + src/meta/service/MetaSerdeService.h | 45 + src/meta/service/MetaServer.cc | 111 + src/meta/service/MetaServer.h | 96 + src/meta/service/MockMeta.h | 108 + src/meta/store/BatchContext.h | 112 + src/meta/store/DirEntry.cc | 327 + src/meta/store/DirEntry.h | 214 + src/meta/store/FileSession.cc | 280 + src/meta/store/FileSession.h | 81 + src/meta/store/Idempotent.h | 136 + src/meta/store/Inode.cc | 226 + src/meta/store/Inode.h | 84 + src/meta/store/MetaStore.cc | 93 + src/meta/store/MetaStore.h | 158 + src/meta/store/Operation.h | 265 + src/meta/store/PathResolve.cc | 364 + src/meta/store/PathResolve.h | 116 + src/meta/store/Utils.h | 78 + src/meta/store/ops/BatchOperation.cc | 751 + src/meta/store/ops/BatchOperation.h | 177 + src/meta/store/ops/GetRealPath.cc | 104 + src/meta/store/ops/HardLink.cc | 131 + src/meta/store/ops/List.cc | 68 + src/meta/store/ops/LockDirectory.cc | 69 + src/meta/store/ops/Mkdirs.cc | 136 + src/meta/store/ops/Open.cc | 308 + src/meta/store/ops/PruneSession.cc | 74 + src/meta/store/ops/Remove.cc | 200 + src/meta/store/ops/Rename.cc | 369 + src/meta/store/ops/SetAttr.cc | 99 + src/meta/store/ops/SetAttr.h | 182 + src/meta/store/ops/Stat.cc | 154 + src/meta/store/ops/StatFs.cc | 32 + src/meta/store/ops/Symlink.cc | 94 + src/mgmtd/CMakeLists.txt | 3 + src/mgmtd/MgmtdConfigFetcher.cc | 55 + src/mgmtd/MgmtdConfigFetcher.h | 26 + src/mgmtd/MgmtdLauncherConfig.cc | 15 + src/mgmtd/MgmtdLauncherConfig.h | 19 + src/mgmtd/MgmtdServer.cc | 51 + src/mgmtd/MgmtdServer.h | 58 + src/mgmtd/background/MgmtdBackgroundRunner.cc | 87 + src/mgmtd/background/MgmtdBackgroundRunner.h | 48 + src/mgmtd/background/MgmtdChainsUpdater.cc | 80 + src/mgmtd/background/MgmtdChainsUpdater.h | 18 + .../background/MgmtdClientSessionsChecker.cc | 55 + .../background/MgmtdClientSessionsChecker.h | 16 + src/mgmtd/background/MgmtdHeartbeatChecker.cc | 98 + src/mgmtd/background/MgmtdHeartbeatChecker.h | 16 + src/mgmtd/background/MgmtdHeartbeater.cc | 93 + src/mgmtd/background/MgmtdHeartbeater.h | 21 + src/mgmtd/background/MgmtdLeaseExtender.cc | 269 + src/mgmtd/background/MgmtdLeaseExtender.h | 16 + src/mgmtd/background/MgmtdMetricsUpdater.cc | 278 + src/mgmtd/background/MgmtdMetricsUpdater.h | 16 + .../background/MgmtdNewBornChainsChecker.cc | 71 + .../background/MgmtdNewBornChainsChecker.h | 16 + .../MgmtdRoutingInfoVersionUpdater.cc | 44 + .../MgmtdRoutingInfoVersionUpdater.h | 16 + src/mgmtd/background/MgmtdTargetInfoLoader.cc | 120 + src/mgmtd/background/MgmtdTargetInfoLoader.h | 18 + .../background/MgmtdTargetInfoPersister.cc | 82 + .../background/MgmtdTargetInfoPersister.h | 16 + src/mgmtd/mgmtd.cpp | 8 + src/mgmtd/mgmtd.toml | 7 + src/mgmtd/ops/EnableDisableNodeOperation.cc | 90 + src/mgmtd/ops/EnableDisableNodeOperation.h | 30 + src/mgmtd/ops/ExtendClientSessionOperation.cc | 108 + src/mgmtd/ops/ExtendClientSessionOperation.h | 20 + src/mgmtd/ops/GetClientSessionOperation.cc | 32 + src/mgmtd/ops/GetClientSessionOperation.h | 18 + src/mgmtd/ops/GetConfigOperation.cc | 19 + src/mgmtd/ops/GetConfigOperation.h | 20 + src/mgmtd/ops/GetConfigVersionsOperation.cc | 24 + src/mgmtd/ops/GetConfigVersionsOperation.h | 18 + src/mgmtd/ops/GetPrimaryMgmtdOperation.cc | 24 + src/mgmtd/ops/GetPrimaryMgmtdOperation.h | 19 + src/mgmtd/ops/GetRoutingInfoOperation.cc | 22 + src/mgmtd/ops/GetRoutingInfoOperation.h | 20 + src/mgmtd/ops/GetUniversalTagsOperation.cc | 19 + src/mgmtd/ops/GetUniversalTagsOperation.h | 18 + src/mgmtd/ops/HeartbeatOperation.cc | 202 + src/mgmtd/ops/HeartbeatOperation.h | 23 + src/mgmtd/ops/Include.h | 24 + src/mgmtd/ops/ListClientSessionsOperation.cc | 38 + src/mgmtd/ops/ListClientSessionsOperation.h | 18 + src/mgmtd/ops/ListOrphanTargetsOperation.cc | 23 + src/mgmtd/ops/ListOrphanTargetsOperation.h | 18 + src/mgmtd/ops/RegisterNodeOperation.cc | 47 + src/mgmtd/ops/RegisterNodeOperation.h | 20 + .../ops/RotateAsPreferredOrderOperation.cc | 79 + .../ops/RotateAsPreferredOrderOperation.h | 19 + src/mgmtd/ops/RotateLastSrvOperation.cc | 79 + src/mgmtd/ops/RotateLastSrvOperation.h | 18 + src/mgmtd/ops/SetChainTableOperation.cc | 88 + src/mgmtd/ops/SetChainTableOperation.h | 18 + src/mgmtd/ops/SetChainsOperation.cc | 143 + src/mgmtd/ops/SetChainsOperation.h | 18 + src/mgmtd/ops/SetConfigOperation.cc | 61 + src/mgmtd/ops/SetConfigOperation.h | 18 + src/mgmtd/ops/SetNodeTagsOperation.cc | 72 + src/mgmtd/ops/SetNodeTagsOperation.h | 18 + .../ops/SetPreferredTargetOrderOperation.cc | 93 + .../ops/SetPreferredTargetOrderOperation.h | 19 + src/mgmtd/ops/SetUniversalTagsOperation.cc | 53 + src/mgmtd/ops/SetUniversalTagsOperation.h | 18 + src/mgmtd/ops/UnregisterNodeOperation.cc | 60 + src/mgmtd/ops/UnregisterNodeOperation.h | 19 + src/mgmtd/ops/UpdateChainOperation.cc | 123 + src/mgmtd/ops/UpdateChainOperation.h | 18 + src/mgmtd/service/ClientSession.h | 14 + src/mgmtd/service/LeaseInfo.h | 10 + src/mgmtd/service/LocalTargetInfoWithNodeId.h | 21 + src/mgmtd/service/MgmtdConfig.h | 41 + src/mgmtd/service/MgmtdData.cc | 172 + src/mgmtd/service/MgmtdData.h | 55 + src/mgmtd/service/MgmtdOperator.cc | 27 + src/mgmtd/service/MgmtdOperator.h | 34 + src/mgmtd/service/MgmtdService.cc | 12 + src/mgmtd/service/MgmtdService.h | 21 + src/mgmtd/service/MgmtdState.cc | 92 + src/mgmtd/service/MgmtdState.h | 68 + src/mgmtd/service/MockMgmtd.h | 66 + src/mgmtd/service/NodeInfoWrapper.h | 32 + src/mgmtd/service/RoutingInfo.cc | 173 + src/mgmtd/service/RoutingInfo.h | 80 + src/mgmtd/service/TargetInfo.h | 18 + src/mgmtd/service/WithTimestamp.h | 33 + src/mgmtd/service/helpers.cc | 95 + src/mgmtd/service/helpers.h | 96 + src/mgmtd/service/updateChain.cc | 188 + src/mgmtd/service/updateChain.h | 49 + src/mgmtd/store/MgmtdStore.cc | 493 + src/mgmtd/store/MgmtdStore.h | 90 + src/migration/CMakeLists.txt | 2 + src/migration/main.cpp | 7 + src/migration/service/Server.cc | 82 + src/migration/service/Server.h | 66 + src/migration/service/Service.cc | 19 + src/migration/service/Service.h | 23 + src/monitor_collector/CMakeLists.txt | 2 + src/monitor_collector/monitor_collector.cpp | 7 + .../service/MonitorCollectorOperator.cc | 96 + .../service/MonitorCollectorOperator.h | 31 + .../service/MonitorCollectorServer.cc | 24 + .../service/MonitorCollectorServer.h | 36 + .../service/MonitorCollectorService.cc | 14 + .../service/MonitorCollectorService.h | 37 + src/simple_example/CMakeLists.txt | 2 + src/simple_example/README.md | 16 + src/simple_example/main.cpp | 8 + src/simple_example/service/Server.cc | 68 + src/simple_example/service/Server.h | 72 + src/simple_example/service/Service.cc | 21 + src/simple_example/service/Service.h | 21 + src/storage/CMakeLists.txt | 5 + src/storage/aio/AioReadWorker.cc | 96 + src/storage/aio/AioReadWorker.h | 78 + src/storage/aio/AioStatus.cc | 286 + src/storage/aio/AioStatus.h | 73 + src/storage/aio/BatchReadJob.cc | 123 + src/storage/aio/BatchReadJob.h | 145 + src/storage/chunk_engine/.gitignore | 2 + src/storage/chunk_engine/Cargo.toml | 42 + src/storage/chunk_engine/README.md | 62 + .../chunk_engine/benches/bench_allocator.rs | 42 + src/storage/chunk_engine/build.rs | 4 + .../chunk_engine/docs/architecture.drawio.svg | 182 + .../chunk_engine/examples/chunk_viewer.rs | 94 + .../chunk_engine/src/alloc/allocator.rs | 258 + .../src/alloc/allocator_counter.rs | 88 + .../chunk_engine/src/alloc/allocators.rs | 200 + src/storage/chunk_engine/src/alloc/chunk.rs | 312 + .../chunk_engine/src/alloc/chunk_allocator.rs | 304 + .../chunk_engine/src/alloc/group_allocator.rs | 190 + src/storage/chunk_engine/src/alloc/metrics.rs | 27 + src/storage/chunk_engine/src/alloc/mod.rs | 17 + .../chunk_engine/src/alloc/writing_chunk.rs | 124 + src/storage/chunk_engine/src/bin/bench.rs | 90 + src/storage/chunk_engine/src/core/engine.rs | 1705 ++ src/storage/chunk_engine/src/core/mod.rs | 3 + src/storage/chunk_engine/src/cxx.rs | 604 + src/storage/chunk_engine/src/file/cluster.rs | 176 + src/storage/chunk_engine/src/file/clusters.rs | 118 + src/storage/chunk_engine/src/file/fs_type.rs | 33 + src/storage/chunk_engine/src/file/mod.rs | 7 + src/storage/chunk_engine/src/lib.rs | 18 + src/storage/chunk_engine/src/meta/meta_key.rs | 217 + .../chunk_engine/src/meta/meta_merge.rs | 152 + .../chunk_engine/src/meta/meta_store.rs | 878 + src/storage/chunk_engine/src/meta/mod.rs | 9 + src/storage/chunk_engine/src/meta/rocksdb.rs | 314 + .../chunk_engine/src/types/chunk_meta.rs | 84 + .../chunk_engine/src/types/constants.rs | 8 + .../chunk_engine/src/types/group_id.rs | 114 + .../chunk_engine/src/types/group_state.rs | 163 + .../chunk_engine/src/types/merge_state.rs | 89 + src/storage/chunk_engine/src/types/mod.rs | 13 + .../chunk_engine/src/types/position.rs | 117 + src/storage/chunk_engine/src/utils/aligned.rs | 57 + src/storage/chunk_engine/src/utils/bytes.rs | 1 + src/storage/chunk_engine/src/utils/mod.rs | 15 + src/storage/chunk_engine/src/utils/result.rs | 34 + .../chunk_engine/src/utils/shards_map.rs | 153 + .../chunk_engine/src/utils/shards_set.rs | 128 + src/storage/chunk_engine/src/utils/size.rs | 283 + src/storage/chunk_engine/src/utils/worker.rs | 136 + src/storage/service/BufferPool.cc | 183 + src/storage/service/BufferPool.h | 92 + src/storage/service/Components.cc | 263 + src/storage/service/Components.h | 124 + src/storage/service/ReliableForwarding.cc | 282 + src/storage/service/ReliableForwarding.h | 65 + src/storage/service/ReliableUpdate.cc | 158 + src/storage/service/ReliableUpdate.h | 61 + src/storage/service/StorageOperator.cc | 1208 ++ src/storage/service/StorageOperator.h | 161 + src/storage/service/StorageServer.cc | 60 + src/storage/service/StorageServer.h | 59 + src/storage/service/StorageService.cc | 32 + src/storage/service/StorageService.h | 111 + src/storage/service/TargetMap.cc | 418 + src/storage/service/TargetMap.h | 137 + src/storage/storage.cpp | 8 + src/storage/store/ChunkEngine.cc | 112 + src/storage/store/ChunkEngine.h | 267 + src/storage/store/ChunkFileStore.cc | 152 + src/storage/store/ChunkFileStore.h | 65 + src/storage/store/ChunkFileView.cc | 127 + src/storage/store/ChunkFileView.h | 53 + src/storage/store/ChunkMetaStore.cc | 1055 + src/storage/store/ChunkMetaStore.h | 161 + src/storage/store/ChunkMetadata.cc | 14 + src/storage/store/ChunkMetadata.h | 43 + src/storage/store/ChunkReplica.cc | 469 + src/storage/store/ChunkReplica.h | 33 + src/storage/store/ChunkStore.cc | 216 + src/storage/store/ChunkStore.h | 117 + src/storage/store/GlobalFileStore.cc | 77 + src/storage/store/GlobalFileStore.h | 36 + src/storage/store/PhysicalConfig.h | 38 + src/storage/store/StorageTarget.cc | 446 + src/storage/store/StorageTarget.h | 188 + src/storage/store/StorageTargets.cc | 297 + src/storage/store/StorageTargets.h | 104 + src/storage/sync/ResyncWorker.cc | 460 + src/storage/sync/ResyncWorker.h | 84 + src/storage/update/UpdateJob.h | 118 + src/storage/update/UpdateWorker.cc | 46 + src/storage/update/UpdateWorker.h | 48 + src/storage/worker/AllocateWorker.cc | 59 + src/storage/worker/AllocateWorker.h | 46 + src/storage/worker/CheckWorker.cc | 286 + src/storage/worker/CheckWorker.h | 51 + src/storage/worker/DumpWorker.cc | 179 + src/storage/worker/DumpWorker.h | 52 + src/storage/worker/PunchHoleWorker.cc | 96 + src/storage/worker/PunchHoleWorker.h | 39 + src/storage/worker/SyncMetaKvWorker.cc | 79 + src/storage/worker/SyncMetaKvWorker.h | 44 + src/stubs/CMakeLists.txt | 4 + src/stubs/MetaService/CMakeLists.txt | 1 + src/stubs/MetaService/IMetaServiceStub.h | 48 + src/stubs/MetaService/MetaServiceStub.cc | 44 + src/stubs/MetaService/MetaServiceStub.h | 48 + src/stubs/MetaService/MockMetaServiceStub.h | 148 + src/stubs/common/CMakeLists.txt | 1 + src/stubs/common/IStubFactory.h | 16 + src/stubs/common/RealStubFactory.h | 26 + src/stubs/common/Stub.h | 46 + src/stubs/common/StubFactory.h | 70 + src/stubs/core/CMakeLists.txt | 1 + src/stubs/core/CoreServiceStub.cc | 17 + src/stubs/core/CoreServiceStub.h | 21 + src/stubs/core/ICoreServiceStub.h | 17 + src/stubs/mgmtd/CMakeLists.txt | 1 + src/stubs/mgmtd/IMgmtdServiceStub.h | 17 + src/stubs/mgmtd/MgmtdServiceStub.cc | 17 + src/stubs/mgmtd/MgmtdServiceStub.h | 21 + src/tools/CMakeLists.txt | 3 + src/tools/admin.cc | 99 + src/tools/commands/CMakeLists.txt | 1 + src/tools/commands/Commands.h | 8 + src/tools/commands/CreateWithLayout.cc | 29 + src/tools/commands/Layout.cc | 38 + src/tools/commands/Layout.h | 9 + src/tools/commands/SetDirLayout.cc | 14 + tests/CMakeLists.txt | 11 + tests/FakeMgmtdClient.h | 193 + tests/GtestHelpers.h | 51 + tests/analytics/CMakeLists.txt | 1 + tests/analytics/TestSerdeObjectReader.cc | 138 + tests/analytics/TestSerdeObjectVisitor.cc | 115 + tests/analytics/TestSerdeObjectWriter.cc | 40 + tests/analytics/TestSerdeSchemaBuilder.cc | 39 + tests/analytics/TestSerdeStructVisitor.cc | 139 + tests/analytics/TestStructuredTraceLog.cc | 134 + tests/client/CMakeLists.txt | 2 + tests/client/ClientWithConfig.h | 37 + tests/client/ServerWithConfig.h | 88 + tests/client/TestMetaClient.cc | 1741 ++ tests/client/TestMgmtdClient.cc | 615 + tests/client/TestMgmtdCluster.cc | 99 + tests/common/CMakeLists.txt | 1 + tests/common/TestWithTransaction.cc | 274 + tests/common/folly/TestConcurrentHashMap.cc | 58 + tests/common/folly/TestEventBase.cc | 29 + tests/common/folly/TestTransport.cc | 341 + tests/common/folly/TestWaitCallback.cc | 48 + tests/common/kv/TestKeyPrefix.cc | 29 + tests/common/kv/fdb/FDBTestBase.h | 27 + tests/common/kv/fdb/TestFDB.cc | 220 + tests/common/kv/fdb/TestFDBKVEngine.cc | 17 + tests/common/kv/fdb/TestFDBTransaction.cc | 306 + tests/common/kv/mem/TestMemTransaction.cc | 295 + tests/common/logging/TestLogConfig.cc | 215 + tests/common/monitor/TestMonitor.cc | 244 + .../monitor/TestMonitorCollectorClient.cc | 66 + tests/common/monitor/TestTaosClient.cc | 62 + tests/common/net/Echo.h | 32 + tests/common/net/TestEcho.cc | 441 + tests/common/net/TestEventLoop.cc | 58 + tests/common/net/TestIOWorker.cc | 25 + tests/common/net/TestProcessor.cc | 97 + tests/common/net/TestRDMAControl.cc | 51 + tests/common/net/TestWaiter.cc | 62 + tests/common/net/ib/SetupIB.h | 22 + tests/common/net/ib/TestIBDevice.cc | 263 + tests/common/net/ib/TestIBNotInitialized.cc | 105 + tests/common/net/ib/TestIBSocket.cc | 817 + tests/common/net/ib/TestRDMA.cc | 405 + tests/common/net/ib/TestRDMABuf.cc | 230 + tests/common/serde/TestBigEndian.cc | 24 + tests/common/serde/TestMessagePacket.cc | 34 + tests/common/serde/TestSerde.cc | 946 + tests/common/serde/TestSerdeTo.cc | 146 + tests/common/serde/TestService.cc | 425 + tests/common/serde/TestTypeName.cc | 32 + tests/common/serde/TestVisit.cc | 43 + tests/common/utils/TestAddress.cc | 35 + tests/common/utils/TestAtomicValue.cc | 22 + tests/common/utils/TestBoundedQueue.cc | 79 + tests/common/utils/TestCoLockManager.cc | 165 + tests/common/utils/TestConcurrencyLimiter.cc | 44 + tests/common/utils/TestConfig.cc | 522 + tests/common/utils/TestCoroSynchronized.cc | 42 + tests/common/utils/TestCoroutinesPool.cc | 49 + .../common/utils/TestDefaultRetryStrategy.cc | 52 + tests/common/utils/TestDownwardBytes.cc | 121 + tests/common/utils/TestDuration.cc | 76 + .../common/utils/TestDynamicCoroutinesPool.cc | 77 + tests/common/utils/TestFaultInjection.cc | 225 + tests/common/utils/TestFdWrapper.cc | 24 + tests/common/utils/TestFmt.cc | 14 + tests/common/utils/TestFolly.cc | 27 + tests/common/utils/TestHashCombine.cc | 16 + tests/common/utils/TestIdAllocator.cc | 175 + tests/common/utils/TestInt128.cc | 23 + tests/common/utils/TestLibUring.cc | 85 + tests/common/utils/TestLockManager.cc | 136 + tests/common/utils/TestLruCache.cc | 82 + tests/common/utils/TestMPSCQueue.cc | 31 + tests/common/utils/TestMemoryAllocator.cc | 100 + tests/common/utils/TestObjectPool.cc | 71 + .../utils/TestPriorityUnboundedQueue.cc | 47 + .../common/utils/TestReentrantLockManager.cc | 115 + tests/common/utils/TestReleaseVersion.cc | 27 + tests/common/utils/TestRenderConfig.cc | 187 + tests/common/utils/TestRequestContext.cc | 103 + tests/common/utils/TestScnLib.cc | 50 + tests/common/utils/TestSemaphore.cc | 73 + tests/common/utils/TestSerDeser.cc | 130 + tests/common/utils/TestShards.cc | 41 + tests/common/utils/TestShuffle.cc | 149 + tests/common/utils/TestSize.cc | 121 + tests/common/utils/TestStatus.cc | 110 + tests/common/utils/TestStatusCode.cc | 14 + tests/common/utils/TestStrongTypedef.cc | 28 + tests/common/utils/TestSysResource.cc | 57 + tests/common/utils/TestThief.cc | 32 + tests/common/utils/TestToml.cc | 25 + tests/common/utils/TestToml11.cc | 14 + tests/common/utils/TestTracing.cc | 130 + tests/common/utils/TestTypeTraits.cc | 34 + tests/common/utils/TestUnorderedDense.cc | 29 + tests/common/utils/TestUtc.cc | 17 + tests/common/utils/TestUuid.cc | 124 + tests/common/utils/TestVarint32.cc | 47 + .../utils/TestWorkStealingBlockingQueue.cc | 82 + tests/common/utils/TestZstd.cc | 25 + tests/fdb/KvTraits.h | 31 + tests/fdb/SetupFDB.h | 28 + tests/fuse/concurrent_rmrf.py | 83 + tests/fuse/concurrent_rw.py | 79 + tests/fuse/config/admin_cli.toml | 15 + tests/fuse/config/hf3fs_fuse_main.toml | 26 + .../fuse/config/hf3fs_fuse_main_launcher.toml | 9 + tests/fuse/config/meta_bench.toml | 19 + tests/fuse/config/meta_main.toml | 44 + tests/fuse/config/meta_main_launcher.toml | 7 + tests/fuse/config/mgmtd_main.toml | 21 + tests/fuse/config/mgmtd_main_launcher.toml | 7 + tests/fuse/config/pjdfstest.toml | 4 + tests/fuse/config/storage_main.toml | 39 + tests/fuse/config/storage_main_launcher.toml | 7 + tests/fuse/fuse_test_ci.py | 586 + tests/fuse/lock_directory.py | 73 + tests/fuse/random_rw.py | 92 + tests/fuse/read_after_write.py | 53 + tests/fuse/run.sh | 228 + tests/fuse/test_iflags.py | 46 + tests/fuse/test_ioctl.py | 121 + tests/fuse/test_trash.sh | 185 + tests/fuse/test_trash_cleaner.py | 101 + tests/fuse/usrbio.py | 65 + tests/kv/CMakeLists.txt | 1 + tests/kv/TestKVStore.cc | 56 + tests/lib/CMakeLists.txt | 1 + tests/lib/Helper.h | 73 + tests/lib/UnitTestFabric.cc | 894 + tests/lib/UnitTestFabric.h | 303 + tests/main/CMakeLists.txt | 1 + tests/main/TestMain.cc | 219 + tests/meta/CMakeLists.txt | 1 + tests/meta/MetaTestBase.cc | 348 + tests/meta/MetaTestBase.h | 460 + tests/meta/TestCommon.cc | 172 + tests/meta/components/TestAclCache.cc | 80 + tests/meta/components/TestChainAllocator.cc | 123 + tests/meta/components/TestDistributor.cc | 215 + tests/meta/components/TestFileHelper.cc | 138 + tests/meta/components/TestGcManager.cc | 326 + tests/meta/components/TestInodeIdAllocator.cc | 142 + tests/meta/components/TestSessionManager.cc | 297 + tests/meta/components/TestUserToken.cc | 40 + tests/meta/event/TestEventLogger.cc | 97 + tests/meta/event/TestScan.cc | 273 + tests/meta/store/TestAuth.cc | 107 + tests/meta/store/TestDirEntry.cc | 139 + tests/meta/store/TestInode.cc | 244 + tests/meta/store/ops/TestBatch.cc | 184 + tests/meta/store/ops/TestClose.cc | 246 + tests/meta/store/ops/TestCreate.cc | 409 + tests/meta/store/ops/TestHardLink.cc | 106 + tests/meta/store/ops/TestIFlags.cc | 130 + tests/meta/store/ops/TestList.cc | 81 + tests/meta/store/ops/TestMkdirs.cc | 152 + tests/meta/store/ops/TestOpen.cc | 343 + tests/meta/store/ops/TestRealPath.cc | 97 + tests/meta/store/ops/TestRemove.cc | 397 + tests/meta/store/ops/TestRename.cc | 332 + tests/meta/store/ops/TestResolve.cc | 344 + tests/meta/store/ops/TestSetPermission.cc | 145 + tests/meta/store/ops/TestStat.cc | 100 + tests/meta/store/ops/TestSymlink.cc | 98 + tests/meta/store/ops/TestSync.cc | 228 + tests/meta/store/ops/TestTruncate.cc | 160 + tests/meta/store/ops/TestUtimes.cc | 118 + tests/mgmtd/CMakeLists.txt | 3 + tests/mgmtd/MgmtdTestHelper.cpp | 163 + tests/mgmtd/MgmtdTestHelper.h | 37 + tests/mgmtd/TestMgmtdOperator.cc | 686 + tests/mgmtd/TestMgmtdStore.cc | 224 + tests/mgmtd/TestNodeSelector.cc | 61 + tests/mgmtd/TestUpdateChain.cc | 1277 ++ tests/migration/CMakeLists.txt | 1 + tests/migration/TestMigrationService.cc | 92 + tests/scripts/CMakeLists.txt | 6 + tests/scripts/binary_backup.sh | 32 + tests/scripts/fdb_loopback.sh | 71 + tests/storage/CMakeLists.txt | 5 + tests/storage/client/CMakeLists.txt | 1 + tests/storage/client/TestFaultInjection.cc | 111 + tests/storage/client/TestStorageBenchmark.cc | 173 + .../client/TestStorageClientFastFailover.cc | 115 + .../client/TestStorageClientHCStress.cc | 383 + .../client/TestStorageClientInterface.cc | 790 + .../client/TestStorageClientSideError.cc | 401 + .../client/TestTargetSelectionStrategy.cc | 155 + tests/storage/service/CMakeLists.txt | 1 + tests/storage/service/TestDumpMeta.cc | 80 + .../service/TestIncorrectRoutingInfo.cc | 209 + .../service/TestSingleProcessCluster.cc | 679 + tests/storage/service/TestStorageService.cc | 165 + .../service/TestStorageServiceFailStop.cc | 302 + tests/storage/store/CMakeLists.txt | 1 + tests/storage/store/TestBufferPool.cc | 56 + tests/storage/store/TestChunkEngine.cc | 217 + tests/storage/store/TestChunkMetaStore.cc | 108 + tests/storage/store/TestCommonStruct.cc | 84 + tests/storage/store/TestStorageTarget.cc | 531 + tests/storage/store/TestStorageTargets.cc | 58 + tests/storage/sync/CMakeLists.txt | 1 + tests/storage/sync/TestSyncForward.cc | 348 + tests/storage/sync/TestSyncStartAndDone.cc | 80 + tests/stubs/DummyMgmtdServiceStub.h | 22 + third_party/liburing-cmake/CMakeLists.txt | 16 + third_party/liburing-cmake/liburing/compat.h | 17 + .../liburing/io_uring_version.h | 8 + tsan_ignore.txt | 2 + tsan_suppressions.txt | 2 + 1294 files changed, 187287 insertions(+) create mode 100644 .clang-format create mode 100644 .clang-tidy create mode 100644 .clangd create mode 100644 .dockerignore create mode 100644 .github/workflows/build-dev-docker-image.yml create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 CMakeLists.txt create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 benchmarks/CMakeLists.txt create mode 100644 benchmarks/fio_usrbio/Makefile create mode 100644 benchmarks/fio_usrbio/README.md create mode 100644 benchmarks/fio_usrbio/hf3fs_usrbio.cpp create mode 100644 benchmarks/storage_bench/CMakeLists.txt create mode 100644 benchmarks/storage_bench/StorageBench.cc create mode 100644 benchmarks/storage_bench/StorageBench.h create mode 100644 cmake/AddCrate.cmake create mode 100644 cmake/ApacheArrow.cmake create mode 100644 cmake/CLangFormat.cmake create mode 100644 cmake/CLangTidy.cmake create mode 100644 cmake/CTestCustom.cmake create mode 100644 cmake/CodeCoverage.cmake create mode 100644 cmake/CompileFlags.cmake create mode 100644 cmake/DumpConfig.cmake create mode 100644 cmake/GitVersion.cmake create mode 100644 cmake/Jemalloc.cmake create mode 100644 cmake/Sanitizers.cmake create mode 100644 cmake/Target.cmake create mode 100644 configs/admin_cli.toml create mode 100644 configs/hf3fs_client_agent.toml create mode 100644 configs/hf3fs_client_agent_app.toml create mode 100644 configs/hf3fs_client_agent_launcher.toml create mode 100644 configs/hf3fs_fuse_main.toml create mode 100644 configs/hf3fs_fuse_main_app.toml create mode 100644 configs/hf3fs_fuse_main_launcher.toml create mode 100644 configs/meta_main.toml create mode 100644 configs/meta_main_app.toml create mode 100644 configs/meta_main_launcher.toml create mode 100644 configs/mgmtd_main.toml create mode 100644 configs/mgmtd_main_app.toml create mode 100644 configs/mgmtd_main_launcher.toml create mode 100644 configs/monitor_collector_main.toml create mode 100644 configs/storage_main.toml create mode 100644 configs/storage_main_app.toml create mode 100644 configs/storage_main_launcher.toml create mode 100644 deploy/README.md create mode 100644 deploy/data_placement/.gitignore create mode 100644 deploy/data_placement/README.md create mode 100644 deploy/data_placement/requirements.txt create mode 100644 deploy/data_placement/src/__init__.py create mode 100644 deploy/data_placement/src/model/data_placement.py create mode 100644 deploy/data_placement/src/model/data_placement_job.py create mode 100644 deploy/data_placement/src/setup/__init__.py create mode 100644 deploy/data_placement/src/setup/gen_chain_table.py create mode 100644 deploy/data_placement/test/test_model.py create mode 100644 deploy/data_placement/test/test_plan.py create mode 100644 deploy/data_placement/test/test_setup.py create mode 100644 deploy/sql/3fs-monitor.sql create mode 100644 deploy/systemd/hf3fs_fuse_main.service create mode 100644 deploy/systemd/meta_main.service create mode 100644 deploy/systemd/mgmtd_main.service create mode 100644 deploy/systemd/monitor_collector_main.service create mode 100644 deploy/systemd/storage_main.service create mode 100644 dockerfile/dev.centos9.dockerfile create mode 100644 dockerfile/dev.dockerfile create mode 100644 dockerfile/dev.opencloudos9.dockerfile create mode 100644 dockerfile/dev.ubuntu2004.dockerfile create mode 100644 docs/README.md create mode 100644 docs/design_notes.md create mode 100644 docs/images/gray_sort_client.png create mode 100644 docs/images/gray_sort_server.png create mode 100644 docs/images/kvcache_gc_iops.png create mode 100644 docs/images/kvcache_read_throughput.png create mode 100644 docs/images/peak_throughput.jpg create mode 100644 docs/metrics.md create mode 100644 hf3fs/__init__.py create mode 100644 hf3fs/fuse.py create mode 100644 hf3fs_fuse/__init__.py create mode 100644 hf3fs_fuse/fuse.py create mode 100644 hf3fs_fuse/fuse_demo.py create mode 100644 hf3fs_fuse/io.py create mode 100644 hf3fs_utils/README.md create mode 100644 hf3fs_utils/__init__.py create mode 100644 hf3fs_utils/cli.py create mode 100644 hf3fs_utils/fs.py create mode 100644 hf3fs_utils/hf3fs_cli create mode 100644 hf3fs_utils/trash.py create mode 100644 licenses/argparse/LICENSE create mode 100644 licenses/arrow/LICENSE.txt create mode 100644 licenses/boost/LICENSE_1_0.txt create mode 100644 licenses/foundationdb/LICENSE create mode 100644 licenses/leveldb/LICENSE create mode 100644 licenses/linenoise/LICENSE create mode 100644 licenses/magic_enum/LICENSE create mode 100644 licenses/nameof/LICENSE create mode 100644 licenses/rapidcsv/LICENSE create mode 100644 licenses/robin-hood-hashing/LICENSE create mode 100644 licenses/smhasher/LICENSE create mode 100644 licenses/tomlplusplus/LICENSE create mode 100644 licenses/utf8.h/LICENSE create mode 100755 patches/apply.sh create mode 100644 patches/folly.patch create mode 100644 patches/rocksdb.patch create mode 100644 patches/rocksdb.patch.2 create mode 100644 setup.py create mode 100644 setup_hf3fs_utils.py create mode 100644 specs/.config/dotnet-tools.json create mode 100644 specs/.gitignore create mode 100644 specs/DataStorage/DataStorage.csproj create mode 100644 specs/DataStorage/DataStorage.pproj create mode 100644 specs/DataStorage/PSpec/SystemSpec.p create mode 100644 specs/DataStorage/PSrc/Common.p create mode 100644 specs/DataStorage/PSrc/MgmtClient.p create mode 100644 specs/DataStorage/PSrc/MgmtService.p create mode 100644 specs/DataStorage/PSrc/StorageClient.p create mode 100644 specs/DataStorage/PSrc/StorageModules.p create mode 100644 specs/DataStorage/PSrc/StorageService.p create mode 100644 specs/DataStorage/PTst/TestDriver.p create mode 100644 specs/DataStorage/PTst/TestScript.p create mode 100644 specs/RDMASocket/PSpec/SystemSpec.p create mode 100644 specs/RDMASocket/PSrc/RDMAModules.p create mode 100644 specs/RDMASocket/PSrc/RDMASocket.p create mode 100644 specs/RDMASocket/PTst/TestDriver.p create mode 100644 specs/RDMASocket/PTst/TestScript.p create mode 100644 specs/RDMASocket/RDMASocket.csproj create mode 100644 specs/RDMASocket/RDMASocket.pproj create mode 100644 specs/README.md create mode 100644 specs/RunTests.ps1 create mode 100644 specs/Timer/LICENSE.txt create mode 100644 specs/Timer/PSrc/Timer.p create mode 100644 specs/Timer/PSrc/TimerModules.p create mode 100644 specs/Timer/README.md create mode 100644 specs/Timer/Timer.pproj create mode 100644 src/CMakeLists.txt create mode 100644 src/analytics/CMakeLists.txt create mode 100644 src/analytics/Common.h create mode 100644 src/analytics/SerdeObjectReader.h create mode 100644 src/analytics/SerdeObjectVisitor.h create mode 100644 src/analytics/SerdeObjectWriter.h create mode 100644 src/analytics/SerdeSchemaBuilder.h create mode 100644 src/analytics/SerdeStructVisitor.h create mode 100644 src/analytics/StructuredTraceLog.h create mode 100644 src/client/CMakeLists.txt create mode 100644 src/client/bin/CMakeLists.txt create mode 100644 src/client/bin/admin_cli.cc create mode 100644 src/client/cli/CMakeLists.txt create mode 100644 src/client/cli/admin/AdminEnv.h create mode 100644 src/client/cli/admin/AdminUserCtrl.cc create mode 100644 src/client/cli/admin/AdminUserCtrl.h create mode 100644 src/client/cli/admin/Bench.cc create mode 100644 src/client/cli/admin/Bench.h create mode 100644 src/client/cli/admin/CMakeLists.txt create mode 100644 src/client/cli/admin/Chdir.cc create mode 100644 src/client/cli/admin/Chdir.h create mode 100644 src/client/cli/admin/Checksum.cc create mode 100644 src/client/cli/admin/Checksum.h create mode 100644 src/client/cli/admin/Create.cc create mode 100644 src/client/cli/admin/Create.h create mode 100644 src/client/cli/admin/CreateRange.cc create mode 100644 src/client/cli/admin/CreateRange.h create mode 100644 src/client/cli/admin/CreateTarget.cc create mode 100644 src/client/cli/admin/CreateTarget.h create mode 100644 src/client/cli/admin/CreateTargets.cc create mode 100644 src/client/cli/admin/CreateTargets.h create mode 100644 src/client/cli/admin/DecodeUserToken.cc create mode 100644 src/client/cli/admin/DecodeUserToken.h create mode 100644 src/client/cli/admin/DropUserCache.cc create mode 100644 src/client/cli/admin/DropUserCache.h create mode 100644 src/client/cli/admin/DumpChainTable.cc create mode 100644 src/client/cli/admin/DumpChainTable.h create mode 100644 src/client/cli/admin/DumpChains.cc create mode 100644 src/client/cli/admin/DumpChains.h create mode 100644 src/client/cli/admin/DumpChunkMeta.cc create mode 100644 src/client/cli/admin/DumpChunkMeta.h create mode 100644 src/client/cli/admin/DumpDirEntries.cc create mode 100644 src/client/cli/admin/DumpDirEntries.h create mode 100644 src/client/cli/admin/DumpInodes.cc create mode 100644 src/client/cli/admin/DumpInodes.h create mode 100644 src/client/cli/admin/DumpSession.cc create mode 100644 src/client/cli/admin/DumpSession.h create mode 100644 src/client/cli/admin/FileWrapper.cc create mode 100644 src/client/cli/admin/FileWrapper.h create mode 100644 src/client/cli/admin/FillZero.cc create mode 100644 src/client/cli/admin/FillZero.h create mode 100644 src/client/cli/admin/FindOrphanedChunks.cc create mode 100644 src/client/cli/admin/FindOrphanedChunks.h create mode 100644 src/client/cli/admin/GetConfig.cc create mode 100644 src/client/cli/admin/GetConfig.h create mode 100644 src/client/cli/admin/GetLastConfigUpdateRecord.cc create mode 100644 src/client/cli/admin/GetLastConfigUpdateRecord.h create mode 100644 src/client/cli/admin/GetRealPath.cc create mode 100644 src/client/cli/admin/GetRealPath.h create mode 100644 src/client/cli/admin/HotUpdateConfig.cc create mode 100644 src/client/cli/admin/HotUpdateConfig.h create mode 100644 src/client/cli/admin/InitCluster.cc create mode 100644 src/client/cli/admin/InitCluster.h create mode 100644 src/client/cli/admin/Layout.h create mode 100644 src/client/cli/admin/List.cc create mode 100644 src/client/cli/admin/List.h create mode 100644 src/client/cli/admin/ListChainTables.cc create mode 100644 src/client/cli/admin/ListChainTables.h create mode 100644 src/client/cli/admin/ListChains.cc create mode 100644 src/client/cli/admin/ListChains.h create mode 100644 src/client/cli/admin/ListClients.cc create mode 100644 src/client/cli/admin/ListClients.h create mode 100644 src/client/cli/admin/ListGc.cc create mode 100644 src/client/cli/admin/ListGc.h create mode 100644 src/client/cli/admin/ListNodes.cc create mode 100644 src/client/cli/admin/ListNodes.h create mode 100644 src/client/cli/admin/ListTargets.cc create mode 100644 src/client/cli/admin/ListTargets.h create mode 100644 src/client/cli/admin/Mkdir.cc create mode 100644 src/client/cli/admin/Mkdir.h create mode 100644 src/client/cli/admin/OfflineTarget.cc create mode 100644 src/client/cli/admin/OfflineTarget.h create mode 100644 src/client/cli/admin/OpenRange.cc create mode 100644 src/client/cli/admin/OpenRange.h create mode 100644 src/client/cli/admin/ParseTargetMeta.cc create mode 100644 src/client/cli/admin/ParseTargetMeta.h create mode 100644 src/client/cli/admin/PruneSession.cc create mode 100644 src/client/cli/admin/PruneSession.h create mode 100644 src/client/cli/admin/QueryChunk.cc create mode 100644 src/client/cli/admin/QueryChunk.h create mode 100644 src/client/cli/admin/ReadBench.cc create mode 100644 src/client/cli/admin/ReadBench.h create mode 100644 src/client/cli/admin/ReadFile.cc create mode 100644 src/client/cli/admin/ReadFile.h create mode 100644 src/client/cli/admin/RecursiveChown.cc create mode 100644 src/client/cli/admin/RecursiveChown.h create mode 100644 src/client/cli/admin/RefreshRoutingInfo.cc create mode 100644 src/client/cli/admin/RefreshRoutingInfo.h create mode 100644 src/client/cli/admin/RegisterNode.cc create mode 100644 src/client/cli/admin/RegisterNode.h create mode 100644 src/client/cli/admin/RemoteCall.cc create mode 100644 src/client/cli/admin/RemoteCall.h create mode 100644 src/client/cli/admin/Remove.cc create mode 100644 src/client/cli/admin/Remove.h create mode 100644 src/client/cli/admin/RemoveChunks.cc create mode 100644 src/client/cli/admin/RemoveChunks.h create mode 100644 src/client/cli/admin/RemoveRange.cc create mode 100644 src/client/cli/admin/RemoveRange.h create mode 100644 src/client/cli/admin/RemoveTarget.cc create mode 100644 src/client/cli/admin/RemoveTarget.h create mode 100644 src/client/cli/admin/Rename.cc create mode 100644 src/client/cli/admin/Rename.h create mode 100644 src/client/cli/admin/RenderConfig.cc create mode 100644 src/client/cli/admin/RenderConfig.h create mode 100644 src/client/cli/admin/RotateAsPreferredOrder.cc create mode 100644 src/client/cli/admin/RotateAsPreferredOrder.h create mode 100644 src/client/cli/admin/RotateLastSrv.cc create mode 100644 src/client/cli/admin/RotateLastSrv.h create mode 100644 src/client/cli/admin/ScanTree.cc create mode 100644 src/client/cli/admin/ScanTree.h create mode 100644 src/client/cli/admin/SetConfig.cc create mode 100644 src/client/cli/admin/SetConfig.h create mode 100644 src/client/cli/admin/SetLayout.cc create mode 100644 src/client/cli/admin/SetLayout.h create mode 100644 src/client/cli/admin/SetNodeTags.cc create mode 100644 src/client/cli/admin/SetNodeTags.h create mode 100644 src/client/cli/admin/SetPermission.cc create mode 100644 src/client/cli/admin/SetPermission.h create mode 100644 src/client/cli/admin/SetPreferredTargetOrder.cc create mode 100644 src/client/cli/admin/SetPreferredTargetOrder.h create mode 100644 src/client/cli/admin/ShutdownAllChains.cc create mode 100644 src/client/cli/admin/ShutdownAllChains.h create mode 100644 src/client/cli/admin/Stat.cc create mode 100644 src/client/cli/admin/Stat.h create mode 100644 src/client/cli/admin/Symlink.cc create mode 100644 src/client/cli/admin/Symlink.h create mode 100644 src/client/cli/admin/UnregisterNode.cc create mode 100644 src/client/cli/admin/UnregisterNode.h create mode 100644 src/client/cli/admin/UpdateChain.cc create mode 100644 src/client/cli/admin/UpdateChain.h create mode 100644 src/client/cli/admin/UploadChainTable.cc create mode 100644 src/client/cli/admin/UploadChainTable.h create mode 100644 src/client/cli/admin/UploadChains.cc create mode 100644 src/client/cli/admin/UploadChains.h create mode 100644 src/client/cli/admin/Utils.cc create mode 100644 src/client/cli/admin/Utils.h create mode 100644 src/client/cli/admin/VerifyConfig.cc create mode 100644 src/client/cli/admin/VerifyConfig.h create mode 100644 src/client/cli/admin/WriteFile.cc create mode 100644 src/client/cli/admin/WriteFile.h create mode 100644 src/client/cli/admin/registerAdminCommands.cc create mode 100644 src/client/cli/admin/registerAdminCommands.h create mode 100644 src/client/cli/common/CMakeLists.txt create mode 100644 src/client/cli/common/Dispatcher.cc create mode 100644 src/client/cli/common/Dispatcher.h create mode 100644 src/client/cli/common/IEnv.h create mode 100644 src/client/cli/common/Parser.cc create mode 100644 src/client/cli/common/Parser.h create mode 100644 src/client/cli/common/Printer.cc create mode 100644 src/client/cli/common/Printer.h create mode 100644 src/client/cli/common/Utils.h create mode 100644 src/client/core/CMakeLists.txt create mode 100644 src/client/core/CoreClient.h create mode 100644 src/client/meta/CMakeLists.txt create mode 100644 src/client/meta/MetaClient.cc create mode 100644 src/client/meta/MetaClient.h create mode 100644 src/client/meta/ServerSelectionStrategy.cc create mode 100644 src/client/meta/ServerSelectionStrategy.h create mode 100644 src/client/mgmtd/CMakeLists.txt create mode 100644 src/client/mgmtd/CommonMgmtdClient.h create mode 100644 src/client/mgmtd/ICommonMgmtdClient.h create mode 100644 src/client/mgmtd/IMgmtdClientForAdmin.h create mode 100644 src/client/mgmtd/IMgmtdClientForClient.h create mode 100644 src/client/mgmtd/IMgmtdClientForServer.h create mode 100644 src/client/mgmtd/MgmtdClient.cc create mode 100644 src/client/mgmtd/MgmtdClient.h create mode 100644 src/client/mgmtd/MgmtdClientForAdmin.h create mode 100644 src/client/mgmtd/MgmtdClientForClient.h create mode 100644 src/client/mgmtd/MgmtdClientForServer.h create mode 100644 src/client/mgmtd/RoutingInfo.cc create mode 100644 src/client/mgmtd/RoutingInfo.h create mode 100644 src/client/mgmtd/ServiceInfo.h create mode 100644 src/client/storage/CMakeLists.txt create mode 100644 src/client/storage/StorageClient.cc create mode 100644 src/client/storage/StorageClient.h create mode 100644 src/client/storage/StorageClientBlobImpl.h create mode 100644 src/client/storage/StorageClientImpl.cc create mode 100644 src/client/storage/StorageClientImpl.h create mode 100644 src/client/storage/StorageClientInMem.cc create mode 100644 src/client/storage/StorageClientInMem.h create mode 100644 src/client/storage/StorageMessenger.cc create mode 100644 src/client/storage/StorageMessenger.h create mode 100644 src/client/storage/TargetSelection.cc create mode 100644 src/client/storage/TargetSelection.h create mode 100644 src/client/storage/UpdateChannelAllocator.cc create mode 100644 src/client/storage/UpdateChannelAllocator.h create mode 100644 src/client/trash_cleaner/Cargo.toml create mode 100644 src/client/trash_cleaner/README.md create mode 100644 src/client/trash_cleaner/src/main.rs create mode 100644 src/common/CMakeLists.txt create mode 100644 src/common/app/AppInfo.cc create mode 100644 src/common/app/AppInfo.h create mode 100644 src/common/app/ApplicationBase.cc create mode 100644 src/common/app/ApplicationBase.h create mode 100644 src/common/app/ClientId.h create mode 100644 src/common/app/ConfigManager.cc create mode 100644 src/common/app/ConfigManager.h create mode 100644 src/common/app/ConfigStatus.h create mode 100644 src/common/app/ConfigUpdateRecord.h create mode 100644 src/common/app/NodeId.h create mode 100644 src/common/app/OnePhaseApplication.h create mode 100644 src/common/app/Thread.cc create mode 100644 src/common/app/Thread.h create mode 100644 src/common/app/TwoPhaseApplication.h create mode 100644 src/common/app/Utils.cc create mode 100644 src/common/app/Utils.h create mode 100644 src/common/app/gflags.cc create mode 100644 src/common/kv/IKVEngine.h create mode 100644 src/common/kv/ITransaction.cc create mode 100644 src/common/kv/ITransaction.h create mode 100644 src/common/kv/KeyPrefix-def.h create mode 100644 src/common/kv/KeyPrefix.h create mode 100644 src/common/kv/TransactionRetry.h create mode 100644 src/common/kv/WithTransaction.h create mode 100644 src/common/kv/mem/MemKV.h create mode 100644 src/common/kv/mem/MemKVEngine.h create mode 100644 src/common/kv/mem/MemTransaction.h create mode 100644 src/common/logging/AsyncFileWriter.cc create mode 100644 src/common/logging/AsyncFileWriter.h create mode 100644 src/common/logging/FileHandlerFactory.cc create mode 100644 src/common/logging/FileHandlerFactory.h create mode 100644 src/common/logging/FileHelper.cc create mode 100644 src/common/logging/FileHelper.h create mode 100644 src/common/logging/FileWriterFactory.cc create mode 100644 src/common/logging/FileWriterFactory.h create mode 100644 src/common/logging/IWritableFile.h create mode 100644 src/common/logging/ImmediateFileWriter.cc create mode 100644 src/common/logging/ImmediateFileWriter.h create mode 100644 src/common/logging/LogConfig.cc create mode 100644 src/common/logging/LogConfig.h create mode 100644 src/common/logging/LogFormatter.cc create mode 100644 src/common/logging/LogFormatter.h create mode 100644 src/common/logging/LogHelper.h create mode 100644 src/common/logging/LogInit.cc create mode 100644 src/common/logging/LogInit.h create mode 100644 src/common/logging/RotatingFile.cc create mode 100644 src/common/logging/RotatingFile.h create mode 100644 src/common/logging/SingleFile.cc create mode 100644 src/common/logging/SingleFile.h create mode 100644 src/common/monitor/ClickHouseClient.cc create mode 100644 src/common/monitor/ClickHouseClient.h create mode 100644 src/common/monitor/DigestBuilder.cc create mode 100644 src/common/monitor/DigestBuilder.h create mode 100644 src/common/monitor/LogReporter.cc create mode 100644 src/common/monitor/LogReporter.h create mode 100644 src/common/monitor/Monitor.cc create mode 100644 src/common/monitor/Monitor.h create mode 100644 src/common/monitor/MonitorCollectorClient.cc create mode 100644 src/common/monitor/MonitorCollectorClient.h create mode 100644 src/common/monitor/Recorder.cc create mode 100644 src/common/monitor/Recorder.h create mode 100644 src/common/monitor/Reporter.h create mode 100644 src/common/monitor/Sample.h create mode 100644 src/common/monitor/ScopedMetricsWriter.h create mode 100644 src/common/monitor/TaosClient.cc create mode 100644 src/common/monitor/TaosClient.h create mode 100644 src/common/net/Allocator.h create mode 100644 src/common/net/Client.h create mode 100644 src/common/net/EventLoop.cc create mode 100644 src/common/net/EventLoop.h create mode 100644 src/common/net/IOWorker.cc create mode 100644 src/common/net/IOWorker.h create mode 100644 src/common/net/IfAddrs.h create mode 100644 src/common/net/Listener.cc create mode 100644 src/common/net/Listener.h create mode 100644 src/common/net/MessageHeader.cc create mode 100644 src/common/net/MessageHeader.h create mode 100644 src/common/net/Network.h create mode 100644 src/common/net/PeerInfo.h create mode 100644 src/common/net/Processor.cc create mode 100644 src/common/net/Processor.h create mode 100644 src/common/net/RDMAControl.cc create mode 100644 src/common/net/RDMAControl.h create mode 100644 src/common/net/RequestOptions.h create mode 100644 src/common/net/Server.cc create mode 100644 src/common/net/Server.h create mode 100644 src/common/net/ServiceGroup.cc create mode 100644 src/common/net/ServiceGroup.h create mode 100644 src/common/net/Socket.h create mode 100644 src/common/net/ThreadPoolGroup.cc create mode 100644 src/common/net/ThreadPoolGroup.h create mode 100644 src/common/net/Transport.cc create mode 100644 src/common/net/Transport.h create mode 100644 src/common/net/TransportPool.cc create mode 100644 src/common/net/TransportPool.h create mode 100644 src/common/net/Waiter.cc create mode 100644 src/common/net/Waiter.h create mode 100644 src/common/net/WriteItem.cc create mode 100644 src/common/net/WriteItem.h create mode 100644 src/common/net/ib/IBConnect.cc create mode 100644 src/common/net/ib/IBConnect.h create mode 100644 src/common/net/ib/IBConnectService.h create mode 100644 src/common/net/ib/IBDevice.cc create mode 100644 src/common/net/ib/IBDevice.h create mode 100644 src/common/net/ib/IBSocket.cc create mode 100644 src/common/net/ib/IBSocket.h create mode 100644 src/common/net/ib/RDMABuf.cc create mode 100644 src/common/net/ib/RDMABuf.h create mode 100644 src/common/net/sync/Client.h create mode 100644 src/common/net/sync/ConnectionPool.cc create mode 100644 src/common/net/sync/ConnectionPool.h create mode 100644 src/common/net/tcp/TcpSocket.cc create mode 100644 src/common/net/tcp/TcpSocket.h create mode 100644 src/common/serde/BigEndian.h create mode 100644 src/common/serde/CallContext.cc create mode 100644 src/common/serde/CallContext.h create mode 100644 src/common/serde/ClientContext.cc create mode 100644 src/common/serde/ClientContext.h create mode 100644 src/common/serde/ClientMockContext.h create mode 100644 src/common/serde/Echo.h create mode 100644 src/common/serde/MessagePacket.h create mode 100644 src/common/serde/Serde.cc create mode 100644 src/common/serde/Serde.h create mode 100644 src/common/serde/SerdeComparisons.h create mode 100644 src/common/serde/SerdeHelper.h create mode 100644 src/common/serde/Service.h create mode 100644 src/common/serde/Services.h create mode 100644 src/common/serde/TypeName.h create mode 100644 src/common/serde/Visit.h create mode 100644 src/common/utils/Address.h create mode 100644 src/common/utils/ArgParse.h create mode 100644 src/common/utils/AtomicSharedPtrTable.h create mode 100644 src/common/utils/AtomicValue.h create mode 100644 src/common/utils/BackgroundRunner.cc create mode 100644 src/common/utils/BackgroundRunner.h create mode 100644 src/common/utils/BoostFileSystemWrappers.cc create mode 100644 src/common/utils/BoostFileSystemWrappers.h create mode 100644 src/common/utils/BoundedQueue.h create mode 100644 src/common/utils/CPUExecutorGroup.cc create mode 100644 src/common/utils/CPUExecutorGroup.h create mode 100644 src/common/utils/CoLockManager.h create mode 100644 src/common/utils/ConcurrencyLimiter.h create mode 100644 src/common/utils/ConfigBase.cc create mode 100644 src/common/utils/ConfigBase.h create mode 100644 src/common/utils/ConstructLog.h create mode 100644 src/common/utils/Conversion.h create mode 100644 src/common/utils/CoroSynchronized.h create mode 100644 src/common/utils/Coroutine.h create mode 100644 src/common/utils/CoroutinesPool.h create mode 100644 src/common/utils/CountDownLatch.h create mode 100644 src/common/utils/DefaultRetryStrategy.h create mode 100644 src/common/utils/DestructionGuard.h create mode 100644 src/common/utils/DownwardBytes.h create mode 100644 src/common/utils/Duration.cc create mode 100644 src/common/utils/Duration.h create mode 100644 src/common/utils/DynamicCoroutinesPool.cc create mode 100644 src/common/utils/DynamicCoroutinesPool.h create mode 100644 src/common/utils/ExecutorStatsReporter.cc create mode 100644 src/common/utils/ExecutorStatsReporter.h create mode 100644 src/common/utils/ExponentialBackoffRetry.h create mode 100644 src/common/utils/FairSharedMutex.h create mode 100644 src/common/utils/FaultInjection.h create mode 100644 src/common/utils/FdWrapper.h create mode 100644 src/common/utils/FileUtils.cc create mode 100644 src/common/utils/FileUtils.h create mode 100644 src/common/utils/HandleException.h create mode 100644 src/common/utils/IdAllocator.h create mode 100644 src/common/utils/Int128.h create mode 100644 src/common/utils/Linenoise.c create mode 100644 src/common/utils/Linenoise.h create mode 100644 src/common/utils/LockManager.h create mode 100644 src/common/utils/LogCommands.h create mode 100644 src/common/utils/LruCache.h create mode 100644 src/common/utils/MPSCQueue.h create mode 100644 src/common/utils/MagicEnum.hpp create mode 100644 src/common/utils/MurmurHash3.cc create mode 100644 src/common/utils/MurmurHash3.h create mode 100644 src/common/utils/NameWrapper.h create mode 100644 src/common/utils/Nameof.hpp create mode 100644 src/common/utils/ObjectPool.h create mode 100644 src/common/utils/OptionalUtils.h create mode 100644 src/common/utils/Path.cc create mode 100644 src/common/utils/Path.h create mode 100644 src/common/utils/PriorityCoroutinePool.h create mode 100644 src/common/utils/PriorityUnboundedQueue.h create mode 100644 src/common/utils/RandomUtils.h create mode 100644 src/common/utils/RapidCsv.h create mode 100644 src/common/utils/ReentrantLockManager.cc create mode 100644 src/common/utils/ReentrantLockManager.h create mode 100644 src/common/utils/Reflection.h create mode 100644 src/common/utils/RenderConfig.cc create mode 100644 src/common/utils/RenderConfig.h create mode 100644 src/common/utils/RequestInfo.h create mode 100644 src/common/utils/Result.h create mode 100644 src/common/utils/RobinHood.h create mode 100644 src/common/utils/RobinHoodUtils.h create mode 100644 src/common/utils/Selector.h create mode 100644 src/common/utils/Semaphore.h create mode 100644 src/common/utils/SemaphoreGuard.h create mode 100644 src/common/utils/SerDeser.h create mode 100644 src/common/utils/Shards.h create mode 100644 src/common/utils/Shuffle.h create mode 100644 src/common/utils/SimpleRingBuffer.h create mode 100644 src/common/utils/SimpleSemaphore.cc create mode 100644 src/common/utils/SimpleSemaphore.h create mode 100644 src/common/utils/Size.cc create mode 100644 src/common/utils/Size.h create mode 100644 src/common/utils/Status.h create mode 100644 src/common/utils/StatusCode.cc create mode 100644 src/common/utils/StatusCode.h create mode 100644 src/common/utils/StatusCodeConversion.cc create mode 100644 src/common/utils/StatusCodeConversion.h create mode 100644 src/common/utils/StatusCodeDetails.h create mode 100644 src/common/utils/String.h create mode 100644 src/common/utils/StringUtils.cc create mode 100644 src/common/utils/StringUtils.h create mode 100644 src/common/utils/StrongType.h create mode 100644 src/common/utils/SysResource.cc create mode 100644 src/common/utils/SysResource.h create mode 100644 src/common/utils/SysvShm.cc create mode 100644 src/common/utils/SysvShm.h create mode 100644 src/common/utils/Thief.h create mode 100644 src/common/utils/Toml.cc create mode 100644 src/common/utils/Toml.hpp create mode 100644 src/common/utils/Tracing.h create mode 100644 src/common/utils/TracingEvent.cc create mode 100644 src/common/utils/TracingEvent.h create mode 100644 src/common/utils/TracingEventDetails.h create mode 100644 src/common/utils/Transform.h create mode 100644 src/common/utils/TypeTraits.h create mode 100644 src/common/utils/UnorderedDense.h create mode 100644 src/common/utils/UtcTime.cc create mode 100644 src/common/utils/UtcTime.h create mode 100644 src/common/utils/UtcTimeSerde.h create mode 100644 src/common/utils/Utf8.h create mode 100644 src/common/utils/Uuid.cc create mode 100644 src/common/utils/Uuid.h create mode 100644 src/common/utils/Varint32.h create mode 100644 src/common/utils/Varint64.h create mode 100644 src/common/utils/VersionInfo.cc.in create mode 100644 src/common/utils/VersionInfo.h create mode 100644 src/common/utils/WorkStealingBlockingQueue.h create mode 100644 src/common/utils/ZSTD.h create mode 100644 src/common/utils/coding.cc create mode 100644 src/common/utils/coding.h create mode 100644 src/common/utils/suicide.cc create mode 100644 src/common/utils/suicide.h create mode 100644 src/core/CMakeLists.txt create mode 100644 src/core/README.md create mode 100644 src/core/app/CMakeLists.txt create mode 100644 src/core/app/LauncherUtils.cc create mode 100644 src/core/app/LauncherUtils.h create mode 100644 src/core/app/MgmtdClientFetcher.cc create mode 100644 src/core/app/MgmtdClientFetcher.h create mode 100644 src/core/app/ServerAppConfig.cc create mode 100644 src/core/app/ServerAppConfig.h create mode 100644 src/core/app/ServerEnv.cc create mode 100644 src/core/app/ServerEnv.h create mode 100644 src/core/app/ServerLauncher.cc create mode 100644 src/core/app/ServerLauncher.h create mode 100644 src/core/app/ServerLauncherConfig.cc create mode 100644 src/core/app/ServerLauncherConfig.h create mode 100644 src/core/app/ServerMgmtdClientFetcher.cc create mode 100644 src/core/app/ServerMgmtdClientFetcher.h create mode 100644 src/core/service/CMakeLists.txt create mode 100644 src/core/service/CoreService.cc create mode 100644 src/core/service/CoreService.h create mode 100644 src/core/service/ops/EchoOperation.h create mode 100644 src/core/service/ops/GetConfigOperation.h create mode 100644 src/core/service/ops/GetLastConfigUpdateRecordOperation.h create mode 100644 src/core/service/ops/HotUpdateConfigOperation.h create mode 100644 src/core/service/ops/Include.h create mode 100644 src/core/service/ops/RenderConfigOperation.h create mode 100644 src/core/service/ops/ShutdownOperation.h create mode 100644 src/core/user/CMakeLists.txt create mode 100644 src/core/user/UserCache.h create mode 100644 src/core/user/UserStore.cc create mode 100644 src/core/user/UserStore.h create mode 100644 src/core/user/UserStoreEx.cc create mode 100644 src/core/user/UserStoreEx.h create mode 100644 src/core/user/UserToken.cc create mode 100644 src/core/user/UserToken.h create mode 100644 src/core/utils/ServiceOperation.h create mode 100644 src/core/utils/runOp.h create mode 100644 src/fbs/CMakeLists.txt create mode 100644 src/fbs/core/CMakeLists.txt create mode 100644 src/fbs/core/service/CMakeLists.txt create mode 100644 src/fbs/core/service/CoreServiceBase.h create mode 100644 src/fbs/core/service/CoreServiceClient.h create mode 100644 src/fbs/core/service/CoreServiceDef.h create mode 100644 src/fbs/core/service/Rpc.h create mode 100644 src/fbs/core/user/CMakeLists.txt create mode 100644 src/fbs/core/user/User.cc create mode 100644 src/fbs/core/user/User.h create mode 100644 src/fbs/lib/Schema.h create mode 100644 src/fbs/lib/Service.h create mode 100644 src/fbs/macros/IStub.h create mode 100644 src/fbs/macros/ISyncStub.h create mode 100644 src/fbs/macros/SerdeDef.h create mode 100644 src/fbs/macros/Stub.h create mode 100644 src/fbs/macros/SyncStub.h create mode 100644 src/fbs/macros/Undef.h create mode 100644 src/fbs/meta/CMakeLists.txt create mode 100644 src/fbs/meta/Common.h create mode 100644 src/fbs/meta/FileOperation.cc create mode 100644 src/fbs/meta/FileOperation.h create mode 100644 src/fbs/meta/MockService.h create mode 100644 src/fbs/meta/Schema.cc create mode 100644 src/fbs/meta/Schema.h create mode 100644 src/fbs/meta/Service.h create mode 100644 src/fbs/meta/Utils.h create mode 100644 src/fbs/mgmtd/CMakeLists.txt create mode 100644 src/fbs/mgmtd/ChainInfo.cc create mode 100644 src/fbs/mgmtd/ChainInfo.h create mode 100644 src/fbs/mgmtd/ChainRef.h create mode 100644 src/fbs/mgmtd/ChainSetting.h create mode 100644 src/fbs/mgmtd/ChainTable.h create mode 100644 src/fbs/mgmtd/ChainTargetInfo.h create mode 100644 src/fbs/mgmtd/ChainTargetSetting.h create mode 100644 src/fbs/mgmtd/ClientSession.cc create mode 100644 src/fbs/mgmtd/ClientSession.h create mode 100644 src/fbs/mgmtd/ClientSessionData.h create mode 100644 src/fbs/mgmtd/ConfigInfo.h create mode 100644 src/fbs/mgmtd/HeartbeatInfo.h create mode 100644 src/fbs/mgmtd/LocalTargetInfo.h create mode 100644 src/fbs/mgmtd/MgmtdLeaseInfo.h create mode 100644 src/fbs/mgmtd/MgmtdServiceBase.h create mode 100644 src/fbs/mgmtd/MgmtdServiceClient.h create mode 100644 src/fbs/mgmtd/MgmtdServiceDef.h create mode 100644 src/fbs/mgmtd/MgmtdTypes.h create mode 100644 src/fbs/mgmtd/NodeConversion.cc create mode 100644 src/fbs/mgmtd/NodeConversion.h create mode 100644 src/fbs/mgmtd/NodeInfo.cc create mode 100644 src/fbs/mgmtd/NodeInfo.h create mode 100644 src/fbs/mgmtd/NodeStatusChange.h create mode 100644 src/fbs/mgmtd/PersistentNodeInfo.h create mode 100644 src/fbs/mgmtd/RoutingInfo.cc create mode 100644 src/fbs/mgmtd/RoutingInfo.h create mode 100644 src/fbs/mgmtd/Rpc.h create mode 100644 src/fbs/mgmtd/TargetInfo.h create mode 100644 src/fbs/migration/CMakeLists.txt create mode 100644 src/fbs/migration/SerdeService.h create mode 100644 src/fbs/monitor_collector/CMakeLists.txt create mode 100644 src/fbs/monitor_collector/MonitorCollectorService.h create mode 100644 src/fbs/simple_example/CMakeLists.txt create mode 100644 src/fbs/simple_example/SerdeService.h create mode 100644 src/fbs/storage/CMakeLists.txt create mode 100644 src/fbs/storage/Common.cc create mode 100644 src/fbs/storage/Common.h create mode 100644 src/fbs/storage/Service.h create mode 100644 src/fdb/CMakeLists.txt create mode 100644 src/fdb/FDB.cc create mode 100644 src/fdb/FDB.h create mode 100644 src/fdb/FDBConfig.h create mode 100644 src/fdb/FDBContext.cc create mode 100644 src/fdb/FDBContext.h create mode 100644 src/fdb/FDBKVEngine.h create mode 100644 src/fdb/FDBRetryStrategy.h create mode 100644 src/fdb/FDBTransaction.cc create mode 100644 src/fdb/FDBTransaction.h create mode 100644 src/fdb/HybridKvEngine.cc create mode 100644 src/fdb/HybridKvEngine.h create mode 100644 src/fdb/HybridKvEngineConfig.h create mode 100644 src/fdb/error_definitions.h create mode 100644 src/fuse/CMakeLists.txt create mode 100644 src/fuse/FuseAppConfig.cc create mode 100644 src/fuse/FuseAppConfig.h create mode 100644 src/fuse/FuseApplication.cc create mode 100644 src/fuse/FuseApplication.h create mode 100644 src/fuse/FuseClients.cc create mode 100644 src/fuse/FuseClients.h create mode 100644 src/fuse/FuseConfig.h create mode 100644 src/fuse/FuseConfigFetcher.cc create mode 100644 src/fuse/FuseConfigFetcher.h create mode 100644 src/fuse/FuseLauncherConfig.cc create mode 100644 src/fuse/FuseLauncherConfig.h create mode 100644 src/fuse/FuseMainLoop.cc create mode 100644 src/fuse/FuseMainLoop.h create mode 100644 src/fuse/FuseOps.cc create mode 100644 src/fuse/FuseOps.h create mode 100644 src/fuse/IoRing.cc create mode 100644 src/fuse/IoRing.h create mode 100644 src/fuse/IovTable.cc create mode 100644 src/fuse/IovTable.h create mode 100644 src/fuse/PioV.cc create mode 100644 src/fuse/PioV.h create mode 100644 src/fuse/UserConfig.cc create mode 100644 src/fuse/UserConfig.h create mode 100644 src/fuse/hf3fs_fuse.cpp create mode 100644 src/kv/CMakeLists.txt create mode 100644 src/kv/KVStore.cc create mode 100644 src/kv/KVStore.h create mode 100644 src/kv/LevelDBLogger.cpp create mode 100644 src/kv/LevelDBLogger.h create mode 100644 src/kv/LevelDBStore.cc create mode 100644 src/kv/LevelDBStore.h create mode 100644 src/kv/MemDBStore.h create mode 100644 src/kv/RocksDBStore.cc create mode 100644 src/kv/RocksDBStore.h create mode 100644 src/lib/CMakeLists.txt create mode 100644 src/lib/api/CMakeLists.txt create mode 100644 src/lib/api/UsrbIo.cc create mode 100644 src/lib/api/UsrbIo.md create mode 100644 src/lib/api/fuse.h create mode 100644 src/lib/api/hf3fs.h create mode 100644 src/lib/api/hf3fs_expected.h create mode 100644 src/lib/api/hf3fs_usrbio.h create mode 100644 src/lib/common/CMakeLists.txt create mode 100644 src/lib/common/PerProcTable.h create mode 100644 src/lib/common/Shm.cc create mode 100644 src/lib/common/Shm.h create mode 100644 src/lib/common/paths.h create mode 100644 src/lib/py/CMakeLists.txt create mode 100644 src/lib/py/binding.cc create mode 100644 src/lib/py/usrbio_binding.cc create mode 100644 src/lib/rs/hf3fs-usrbio-sys/Cargo.toml create mode 100644 src/lib/rs/hf3fs-usrbio-sys/README create mode 100644 src/lib/rs/hf3fs-usrbio-sys/build.rs create mode 100644 src/lib/rs/hf3fs-usrbio-sys/lib/.dummy create mode 100644 src/lib/rs/hf3fs-usrbio-sys/src/lib.rs create mode 100644 src/memory/CMakeLists.txt create mode 100644 src/memory/common/AllocatedMemoryCounter.cc create mode 100644 src/memory/common/AllocatedMemoryCounter.h create mode 100644 src/memory/common/CMakeLists.txt create mode 100644 src/memory/common/GlobalMemoryAllocator.cc create mode 100644 src/memory/common/GlobalMemoryAllocator.h create mode 100644 src/memory/common/MemoryAllocatorConfig.h create mode 100644 src/memory/common/MemoryAllocatorInterface.h create mode 100644 src/memory/common/OverrideCppNewDelete.h create mode 100644 src/memory/jemalloc/CMakeLists.txt create mode 100644 src/memory/jemalloc/JemallocLib.cc create mode 100644 src/memory/mimalloc/CMakeLists.txt create mode 100644 src/memory/mimalloc/MimallocLib.cc create mode 100644 src/meta/CMakeLists.txt create mode 100644 src/meta/base/Config.h create mode 100644 src/meta/components/AclCache.h create mode 100644 src/meta/components/ChainAllocator.h create mode 100644 src/meta/components/Distributor.cc create mode 100644 src/meta/components/Distributor.h create mode 100644 src/meta/components/FileHelper.cc create mode 100644 src/meta/components/FileHelper.h create mode 100644 src/meta/components/Forward.h create mode 100644 src/meta/components/GcManager.cc create mode 100644 src/meta/components/GcManager.h create mode 100644 src/meta/components/InodeIdAllocator.cc create mode 100644 src/meta/components/InodeIdAllocator.h create mode 100644 src/meta/components/SessionManager.cc create mode 100644 src/meta/components/SessionManager.h create mode 100644 src/meta/event/Event.cc create mode 100644 src/meta/event/Event.h create mode 100644 src/meta/event/Scan.cc create mode 100644 src/meta/event/Scan.h create mode 100644 src/meta/meta.cpp create mode 100644 src/meta/service/MetaOperator.cc create mode 100644 src/meta/service/MetaOperator.h create mode 100644 src/meta/service/MetaSerdeService.h create mode 100644 src/meta/service/MetaServer.cc create mode 100644 src/meta/service/MetaServer.h create mode 100644 src/meta/service/MockMeta.h create mode 100644 src/meta/store/BatchContext.h create mode 100644 src/meta/store/DirEntry.cc create mode 100644 src/meta/store/DirEntry.h create mode 100644 src/meta/store/FileSession.cc create mode 100644 src/meta/store/FileSession.h create mode 100644 src/meta/store/Idempotent.h create mode 100644 src/meta/store/Inode.cc create mode 100644 src/meta/store/Inode.h create mode 100644 src/meta/store/MetaStore.cc create mode 100644 src/meta/store/MetaStore.h create mode 100644 src/meta/store/Operation.h create mode 100644 src/meta/store/PathResolve.cc create mode 100644 src/meta/store/PathResolve.h create mode 100644 src/meta/store/Utils.h create mode 100644 src/meta/store/ops/BatchOperation.cc create mode 100644 src/meta/store/ops/BatchOperation.h create mode 100644 src/meta/store/ops/GetRealPath.cc create mode 100644 src/meta/store/ops/HardLink.cc create mode 100644 src/meta/store/ops/List.cc create mode 100644 src/meta/store/ops/LockDirectory.cc create mode 100644 src/meta/store/ops/Mkdirs.cc create mode 100644 src/meta/store/ops/Open.cc create mode 100644 src/meta/store/ops/PruneSession.cc create mode 100644 src/meta/store/ops/Remove.cc create mode 100644 src/meta/store/ops/Rename.cc create mode 100644 src/meta/store/ops/SetAttr.cc create mode 100644 src/meta/store/ops/SetAttr.h create mode 100644 src/meta/store/ops/Stat.cc create mode 100644 src/meta/store/ops/StatFs.cc create mode 100644 src/meta/store/ops/Symlink.cc create mode 100644 src/mgmtd/CMakeLists.txt create mode 100644 src/mgmtd/MgmtdConfigFetcher.cc create mode 100644 src/mgmtd/MgmtdConfigFetcher.h create mode 100644 src/mgmtd/MgmtdLauncherConfig.cc create mode 100644 src/mgmtd/MgmtdLauncherConfig.h create mode 100644 src/mgmtd/MgmtdServer.cc create mode 100644 src/mgmtd/MgmtdServer.h create mode 100644 src/mgmtd/background/MgmtdBackgroundRunner.cc create mode 100644 src/mgmtd/background/MgmtdBackgroundRunner.h create mode 100644 src/mgmtd/background/MgmtdChainsUpdater.cc create mode 100644 src/mgmtd/background/MgmtdChainsUpdater.h create mode 100644 src/mgmtd/background/MgmtdClientSessionsChecker.cc create mode 100644 src/mgmtd/background/MgmtdClientSessionsChecker.h create mode 100644 src/mgmtd/background/MgmtdHeartbeatChecker.cc create mode 100644 src/mgmtd/background/MgmtdHeartbeatChecker.h create mode 100644 src/mgmtd/background/MgmtdHeartbeater.cc create mode 100644 src/mgmtd/background/MgmtdHeartbeater.h create mode 100644 src/mgmtd/background/MgmtdLeaseExtender.cc create mode 100644 src/mgmtd/background/MgmtdLeaseExtender.h create mode 100644 src/mgmtd/background/MgmtdMetricsUpdater.cc create mode 100644 src/mgmtd/background/MgmtdMetricsUpdater.h create mode 100644 src/mgmtd/background/MgmtdNewBornChainsChecker.cc create mode 100644 src/mgmtd/background/MgmtdNewBornChainsChecker.h create mode 100644 src/mgmtd/background/MgmtdRoutingInfoVersionUpdater.cc create mode 100644 src/mgmtd/background/MgmtdRoutingInfoVersionUpdater.h create mode 100644 src/mgmtd/background/MgmtdTargetInfoLoader.cc create mode 100644 src/mgmtd/background/MgmtdTargetInfoLoader.h create mode 100644 src/mgmtd/background/MgmtdTargetInfoPersister.cc create mode 100644 src/mgmtd/background/MgmtdTargetInfoPersister.h create mode 100644 src/mgmtd/mgmtd.cpp create mode 100644 src/mgmtd/mgmtd.toml create mode 100644 src/mgmtd/ops/EnableDisableNodeOperation.cc create mode 100644 src/mgmtd/ops/EnableDisableNodeOperation.h create mode 100644 src/mgmtd/ops/ExtendClientSessionOperation.cc create mode 100644 src/mgmtd/ops/ExtendClientSessionOperation.h create mode 100644 src/mgmtd/ops/GetClientSessionOperation.cc create mode 100644 src/mgmtd/ops/GetClientSessionOperation.h create mode 100644 src/mgmtd/ops/GetConfigOperation.cc create mode 100644 src/mgmtd/ops/GetConfigOperation.h create mode 100644 src/mgmtd/ops/GetConfigVersionsOperation.cc create mode 100644 src/mgmtd/ops/GetConfigVersionsOperation.h create mode 100644 src/mgmtd/ops/GetPrimaryMgmtdOperation.cc create mode 100644 src/mgmtd/ops/GetPrimaryMgmtdOperation.h create mode 100644 src/mgmtd/ops/GetRoutingInfoOperation.cc create mode 100644 src/mgmtd/ops/GetRoutingInfoOperation.h create mode 100644 src/mgmtd/ops/GetUniversalTagsOperation.cc create mode 100644 src/mgmtd/ops/GetUniversalTagsOperation.h create mode 100644 src/mgmtd/ops/HeartbeatOperation.cc create mode 100644 src/mgmtd/ops/HeartbeatOperation.h create mode 100644 src/mgmtd/ops/Include.h create mode 100644 src/mgmtd/ops/ListClientSessionsOperation.cc create mode 100644 src/mgmtd/ops/ListClientSessionsOperation.h create mode 100644 src/mgmtd/ops/ListOrphanTargetsOperation.cc create mode 100644 src/mgmtd/ops/ListOrphanTargetsOperation.h create mode 100644 src/mgmtd/ops/RegisterNodeOperation.cc create mode 100644 src/mgmtd/ops/RegisterNodeOperation.h create mode 100644 src/mgmtd/ops/RotateAsPreferredOrderOperation.cc create mode 100644 src/mgmtd/ops/RotateAsPreferredOrderOperation.h create mode 100644 src/mgmtd/ops/RotateLastSrvOperation.cc create mode 100644 src/mgmtd/ops/RotateLastSrvOperation.h create mode 100644 src/mgmtd/ops/SetChainTableOperation.cc create mode 100644 src/mgmtd/ops/SetChainTableOperation.h create mode 100644 src/mgmtd/ops/SetChainsOperation.cc create mode 100644 src/mgmtd/ops/SetChainsOperation.h create mode 100644 src/mgmtd/ops/SetConfigOperation.cc create mode 100644 src/mgmtd/ops/SetConfigOperation.h create mode 100644 src/mgmtd/ops/SetNodeTagsOperation.cc create mode 100644 src/mgmtd/ops/SetNodeTagsOperation.h create mode 100644 src/mgmtd/ops/SetPreferredTargetOrderOperation.cc create mode 100644 src/mgmtd/ops/SetPreferredTargetOrderOperation.h create mode 100644 src/mgmtd/ops/SetUniversalTagsOperation.cc create mode 100644 src/mgmtd/ops/SetUniversalTagsOperation.h create mode 100644 src/mgmtd/ops/UnregisterNodeOperation.cc create mode 100644 src/mgmtd/ops/UnregisterNodeOperation.h create mode 100644 src/mgmtd/ops/UpdateChainOperation.cc create mode 100644 src/mgmtd/ops/UpdateChainOperation.h create mode 100644 src/mgmtd/service/ClientSession.h create mode 100644 src/mgmtd/service/LeaseInfo.h create mode 100644 src/mgmtd/service/LocalTargetInfoWithNodeId.h create mode 100644 src/mgmtd/service/MgmtdConfig.h create mode 100644 src/mgmtd/service/MgmtdData.cc create mode 100644 src/mgmtd/service/MgmtdData.h create mode 100644 src/mgmtd/service/MgmtdOperator.cc create mode 100644 src/mgmtd/service/MgmtdOperator.h create mode 100644 src/mgmtd/service/MgmtdService.cc create mode 100644 src/mgmtd/service/MgmtdService.h create mode 100644 src/mgmtd/service/MgmtdState.cc create mode 100644 src/mgmtd/service/MgmtdState.h create mode 100644 src/mgmtd/service/MockMgmtd.h create mode 100644 src/mgmtd/service/NodeInfoWrapper.h create mode 100644 src/mgmtd/service/RoutingInfo.cc create mode 100644 src/mgmtd/service/RoutingInfo.h create mode 100644 src/mgmtd/service/TargetInfo.h create mode 100644 src/mgmtd/service/WithTimestamp.h create mode 100644 src/mgmtd/service/helpers.cc create mode 100644 src/mgmtd/service/helpers.h create mode 100644 src/mgmtd/service/updateChain.cc create mode 100644 src/mgmtd/service/updateChain.h create mode 100644 src/mgmtd/store/MgmtdStore.cc create mode 100644 src/mgmtd/store/MgmtdStore.h create mode 100644 src/migration/CMakeLists.txt create mode 100644 src/migration/main.cpp create mode 100644 src/migration/service/Server.cc create mode 100644 src/migration/service/Server.h create mode 100644 src/migration/service/Service.cc create mode 100644 src/migration/service/Service.h create mode 100644 src/monitor_collector/CMakeLists.txt create mode 100644 src/monitor_collector/monitor_collector.cpp create mode 100644 src/monitor_collector/service/MonitorCollectorOperator.cc create mode 100644 src/monitor_collector/service/MonitorCollectorOperator.h create mode 100644 src/monitor_collector/service/MonitorCollectorServer.cc create mode 100644 src/monitor_collector/service/MonitorCollectorServer.h create mode 100644 src/monitor_collector/service/MonitorCollectorService.cc create mode 100644 src/monitor_collector/service/MonitorCollectorService.h create mode 100644 src/simple_example/CMakeLists.txt create mode 100644 src/simple_example/README.md create mode 100644 src/simple_example/main.cpp create mode 100644 src/simple_example/service/Server.cc create mode 100644 src/simple_example/service/Server.h create mode 100644 src/simple_example/service/Service.cc create mode 100644 src/simple_example/service/Service.h create mode 100644 src/storage/CMakeLists.txt create mode 100644 src/storage/aio/AioReadWorker.cc create mode 100644 src/storage/aio/AioReadWorker.h create mode 100644 src/storage/aio/AioStatus.cc create mode 100644 src/storage/aio/AioStatus.h create mode 100644 src/storage/aio/BatchReadJob.cc create mode 100644 src/storage/aio/BatchReadJob.h create mode 100644 src/storage/chunk_engine/.gitignore create mode 100644 src/storage/chunk_engine/Cargo.toml create mode 100644 src/storage/chunk_engine/README.md create mode 100644 src/storage/chunk_engine/benches/bench_allocator.rs create mode 100644 src/storage/chunk_engine/build.rs create mode 100644 src/storage/chunk_engine/docs/architecture.drawio.svg create mode 100644 src/storage/chunk_engine/examples/chunk_viewer.rs create mode 100644 src/storage/chunk_engine/src/alloc/allocator.rs create mode 100644 src/storage/chunk_engine/src/alloc/allocator_counter.rs create mode 100644 src/storage/chunk_engine/src/alloc/allocators.rs create mode 100644 src/storage/chunk_engine/src/alloc/chunk.rs create mode 100644 src/storage/chunk_engine/src/alloc/chunk_allocator.rs create mode 100644 src/storage/chunk_engine/src/alloc/group_allocator.rs create mode 100644 src/storage/chunk_engine/src/alloc/metrics.rs create mode 100644 src/storage/chunk_engine/src/alloc/mod.rs create mode 100644 src/storage/chunk_engine/src/alloc/writing_chunk.rs create mode 100644 src/storage/chunk_engine/src/bin/bench.rs create mode 100644 src/storage/chunk_engine/src/core/engine.rs create mode 100644 src/storage/chunk_engine/src/core/mod.rs create mode 100644 src/storage/chunk_engine/src/cxx.rs create mode 100644 src/storage/chunk_engine/src/file/cluster.rs create mode 100644 src/storage/chunk_engine/src/file/clusters.rs create mode 100644 src/storage/chunk_engine/src/file/fs_type.rs create mode 100644 src/storage/chunk_engine/src/file/mod.rs create mode 100644 src/storage/chunk_engine/src/lib.rs create mode 100644 src/storage/chunk_engine/src/meta/meta_key.rs create mode 100644 src/storage/chunk_engine/src/meta/meta_merge.rs create mode 100644 src/storage/chunk_engine/src/meta/meta_store.rs create mode 100644 src/storage/chunk_engine/src/meta/mod.rs create mode 100644 src/storage/chunk_engine/src/meta/rocksdb.rs create mode 100644 src/storage/chunk_engine/src/types/chunk_meta.rs create mode 100644 src/storage/chunk_engine/src/types/constants.rs create mode 100644 src/storage/chunk_engine/src/types/group_id.rs create mode 100644 src/storage/chunk_engine/src/types/group_state.rs create mode 100644 src/storage/chunk_engine/src/types/merge_state.rs create mode 100644 src/storage/chunk_engine/src/types/mod.rs create mode 100644 src/storage/chunk_engine/src/types/position.rs create mode 100644 src/storage/chunk_engine/src/utils/aligned.rs create mode 100644 src/storage/chunk_engine/src/utils/bytes.rs create mode 100644 src/storage/chunk_engine/src/utils/mod.rs create mode 100644 src/storage/chunk_engine/src/utils/result.rs create mode 100644 src/storage/chunk_engine/src/utils/shards_map.rs create mode 100644 src/storage/chunk_engine/src/utils/shards_set.rs create mode 100644 src/storage/chunk_engine/src/utils/size.rs create mode 100644 src/storage/chunk_engine/src/utils/worker.rs create mode 100644 src/storage/service/BufferPool.cc create mode 100644 src/storage/service/BufferPool.h create mode 100644 src/storage/service/Components.cc create mode 100644 src/storage/service/Components.h create mode 100644 src/storage/service/ReliableForwarding.cc create mode 100644 src/storage/service/ReliableForwarding.h create mode 100644 src/storage/service/ReliableUpdate.cc create mode 100644 src/storage/service/ReliableUpdate.h create mode 100644 src/storage/service/StorageOperator.cc create mode 100644 src/storage/service/StorageOperator.h create mode 100644 src/storage/service/StorageServer.cc create mode 100644 src/storage/service/StorageServer.h create mode 100644 src/storage/service/StorageService.cc create mode 100644 src/storage/service/StorageService.h create mode 100644 src/storage/service/TargetMap.cc create mode 100644 src/storage/service/TargetMap.h create mode 100644 src/storage/storage.cpp create mode 100644 src/storage/store/ChunkEngine.cc create mode 100644 src/storage/store/ChunkEngine.h create mode 100644 src/storage/store/ChunkFileStore.cc create mode 100644 src/storage/store/ChunkFileStore.h create mode 100644 src/storage/store/ChunkFileView.cc create mode 100644 src/storage/store/ChunkFileView.h create mode 100644 src/storage/store/ChunkMetaStore.cc create mode 100644 src/storage/store/ChunkMetaStore.h create mode 100644 src/storage/store/ChunkMetadata.cc create mode 100644 src/storage/store/ChunkMetadata.h create mode 100644 src/storage/store/ChunkReplica.cc create mode 100644 src/storage/store/ChunkReplica.h create mode 100644 src/storage/store/ChunkStore.cc create mode 100644 src/storage/store/ChunkStore.h create mode 100644 src/storage/store/GlobalFileStore.cc create mode 100644 src/storage/store/GlobalFileStore.h create mode 100644 src/storage/store/PhysicalConfig.h create mode 100644 src/storage/store/StorageTarget.cc create mode 100644 src/storage/store/StorageTarget.h create mode 100644 src/storage/store/StorageTargets.cc create mode 100644 src/storage/store/StorageTargets.h create mode 100644 src/storage/sync/ResyncWorker.cc create mode 100644 src/storage/sync/ResyncWorker.h create mode 100644 src/storage/update/UpdateJob.h create mode 100644 src/storage/update/UpdateWorker.cc create mode 100644 src/storage/update/UpdateWorker.h create mode 100644 src/storage/worker/AllocateWorker.cc create mode 100644 src/storage/worker/AllocateWorker.h create mode 100644 src/storage/worker/CheckWorker.cc create mode 100644 src/storage/worker/CheckWorker.h create mode 100644 src/storage/worker/DumpWorker.cc create mode 100644 src/storage/worker/DumpWorker.h create mode 100644 src/storage/worker/PunchHoleWorker.cc create mode 100644 src/storage/worker/PunchHoleWorker.h create mode 100644 src/storage/worker/SyncMetaKvWorker.cc create mode 100644 src/storage/worker/SyncMetaKvWorker.h create mode 100644 src/stubs/CMakeLists.txt create mode 100644 src/stubs/MetaService/CMakeLists.txt create mode 100644 src/stubs/MetaService/IMetaServiceStub.h create mode 100644 src/stubs/MetaService/MetaServiceStub.cc create mode 100644 src/stubs/MetaService/MetaServiceStub.h create mode 100644 src/stubs/MetaService/MockMetaServiceStub.h create mode 100644 src/stubs/common/CMakeLists.txt create mode 100644 src/stubs/common/IStubFactory.h create mode 100644 src/stubs/common/RealStubFactory.h create mode 100644 src/stubs/common/Stub.h create mode 100644 src/stubs/common/StubFactory.h create mode 100644 src/stubs/core/CMakeLists.txt create mode 100644 src/stubs/core/CoreServiceStub.cc create mode 100644 src/stubs/core/CoreServiceStub.h create mode 100644 src/stubs/core/ICoreServiceStub.h create mode 100644 src/stubs/mgmtd/CMakeLists.txt create mode 100644 src/stubs/mgmtd/IMgmtdServiceStub.h create mode 100644 src/stubs/mgmtd/MgmtdServiceStub.cc create mode 100644 src/stubs/mgmtd/MgmtdServiceStub.h create mode 100644 src/tools/CMakeLists.txt create mode 100644 src/tools/admin.cc create mode 100644 src/tools/commands/CMakeLists.txt create mode 100644 src/tools/commands/Commands.h create mode 100644 src/tools/commands/CreateWithLayout.cc create mode 100644 src/tools/commands/Layout.cc create mode 100644 src/tools/commands/Layout.h create mode 100644 src/tools/commands/SetDirLayout.cc create mode 100644 tests/CMakeLists.txt create mode 100644 tests/FakeMgmtdClient.h create mode 100644 tests/GtestHelpers.h create mode 100644 tests/analytics/CMakeLists.txt create mode 100644 tests/analytics/TestSerdeObjectReader.cc create mode 100644 tests/analytics/TestSerdeObjectVisitor.cc create mode 100644 tests/analytics/TestSerdeObjectWriter.cc create mode 100644 tests/analytics/TestSerdeSchemaBuilder.cc create mode 100644 tests/analytics/TestSerdeStructVisitor.cc create mode 100644 tests/analytics/TestStructuredTraceLog.cc create mode 100644 tests/client/CMakeLists.txt create mode 100644 tests/client/ClientWithConfig.h create mode 100644 tests/client/ServerWithConfig.h create mode 100644 tests/client/TestMetaClient.cc create mode 100644 tests/client/TestMgmtdClient.cc create mode 100644 tests/client/TestMgmtdCluster.cc create mode 100644 tests/common/CMakeLists.txt create mode 100644 tests/common/TestWithTransaction.cc create mode 100644 tests/common/folly/TestConcurrentHashMap.cc create mode 100644 tests/common/folly/TestEventBase.cc create mode 100644 tests/common/folly/TestTransport.cc create mode 100644 tests/common/folly/TestWaitCallback.cc create mode 100644 tests/common/kv/TestKeyPrefix.cc create mode 100644 tests/common/kv/fdb/FDBTestBase.h create mode 100644 tests/common/kv/fdb/TestFDB.cc create mode 100644 tests/common/kv/fdb/TestFDBKVEngine.cc create mode 100644 tests/common/kv/fdb/TestFDBTransaction.cc create mode 100644 tests/common/kv/mem/TestMemTransaction.cc create mode 100644 tests/common/logging/TestLogConfig.cc create mode 100644 tests/common/monitor/TestMonitor.cc create mode 100644 tests/common/monitor/TestMonitorCollectorClient.cc create mode 100644 tests/common/monitor/TestTaosClient.cc create mode 100644 tests/common/net/Echo.h create mode 100644 tests/common/net/TestEcho.cc create mode 100644 tests/common/net/TestEventLoop.cc create mode 100644 tests/common/net/TestIOWorker.cc create mode 100644 tests/common/net/TestProcessor.cc create mode 100644 tests/common/net/TestRDMAControl.cc create mode 100644 tests/common/net/TestWaiter.cc create mode 100644 tests/common/net/ib/SetupIB.h create mode 100644 tests/common/net/ib/TestIBDevice.cc create mode 100644 tests/common/net/ib/TestIBNotInitialized.cc create mode 100644 tests/common/net/ib/TestIBSocket.cc create mode 100644 tests/common/net/ib/TestRDMA.cc create mode 100644 tests/common/net/ib/TestRDMABuf.cc create mode 100644 tests/common/serde/TestBigEndian.cc create mode 100644 tests/common/serde/TestMessagePacket.cc create mode 100644 tests/common/serde/TestSerde.cc create mode 100644 tests/common/serde/TestSerdeTo.cc create mode 100644 tests/common/serde/TestService.cc create mode 100644 tests/common/serde/TestTypeName.cc create mode 100644 tests/common/serde/TestVisit.cc create mode 100644 tests/common/utils/TestAddress.cc create mode 100644 tests/common/utils/TestAtomicValue.cc create mode 100644 tests/common/utils/TestBoundedQueue.cc create mode 100644 tests/common/utils/TestCoLockManager.cc create mode 100644 tests/common/utils/TestConcurrencyLimiter.cc create mode 100644 tests/common/utils/TestConfig.cc create mode 100644 tests/common/utils/TestCoroSynchronized.cc create mode 100644 tests/common/utils/TestCoroutinesPool.cc create mode 100644 tests/common/utils/TestDefaultRetryStrategy.cc create mode 100644 tests/common/utils/TestDownwardBytes.cc create mode 100644 tests/common/utils/TestDuration.cc create mode 100644 tests/common/utils/TestDynamicCoroutinesPool.cc create mode 100644 tests/common/utils/TestFaultInjection.cc create mode 100644 tests/common/utils/TestFdWrapper.cc create mode 100644 tests/common/utils/TestFmt.cc create mode 100644 tests/common/utils/TestFolly.cc create mode 100644 tests/common/utils/TestHashCombine.cc create mode 100644 tests/common/utils/TestIdAllocator.cc create mode 100644 tests/common/utils/TestInt128.cc create mode 100644 tests/common/utils/TestLibUring.cc create mode 100644 tests/common/utils/TestLockManager.cc create mode 100644 tests/common/utils/TestLruCache.cc create mode 100644 tests/common/utils/TestMPSCQueue.cc create mode 100644 tests/common/utils/TestMemoryAllocator.cc create mode 100644 tests/common/utils/TestObjectPool.cc create mode 100644 tests/common/utils/TestPriorityUnboundedQueue.cc create mode 100644 tests/common/utils/TestReentrantLockManager.cc create mode 100644 tests/common/utils/TestReleaseVersion.cc create mode 100644 tests/common/utils/TestRenderConfig.cc create mode 100644 tests/common/utils/TestRequestContext.cc create mode 100644 tests/common/utils/TestScnLib.cc create mode 100644 tests/common/utils/TestSemaphore.cc create mode 100644 tests/common/utils/TestSerDeser.cc create mode 100644 tests/common/utils/TestShards.cc create mode 100644 tests/common/utils/TestShuffle.cc create mode 100644 tests/common/utils/TestSize.cc create mode 100644 tests/common/utils/TestStatus.cc create mode 100644 tests/common/utils/TestStatusCode.cc create mode 100644 tests/common/utils/TestStrongTypedef.cc create mode 100644 tests/common/utils/TestSysResource.cc create mode 100644 tests/common/utils/TestThief.cc create mode 100644 tests/common/utils/TestToml.cc create mode 100644 tests/common/utils/TestToml11.cc create mode 100644 tests/common/utils/TestTracing.cc create mode 100644 tests/common/utils/TestTypeTraits.cc create mode 100644 tests/common/utils/TestUnorderedDense.cc create mode 100644 tests/common/utils/TestUtc.cc create mode 100644 tests/common/utils/TestUuid.cc create mode 100644 tests/common/utils/TestVarint32.cc create mode 100644 tests/common/utils/TestWorkStealingBlockingQueue.cc create mode 100644 tests/common/utils/TestZstd.cc create mode 100644 tests/fdb/KvTraits.h create mode 100644 tests/fdb/SetupFDB.h create mode 100644 tests/fuse/concurrent_rmrf.py create mode 100644 tests/fuse/concurrent_rw.py create mode 100644 tests/fuse/config/admin_cli.toml create mode 100644 tests/fuse/config/hf3fs_fuse_main.toml create mode 100644 tests/fuse/config/hf3fs_fuse_main_launcher.toml create mode 100644 tests/fuse/config/meta_bench.toml create mode 100644 tests/fuse/config/meta_main.toml create mode 100644 tests/fuse/config/meta_main_launcher.toml create mode 100644 tests/fuse/config/mgmtd_main.toml create mode 100644 tests/fuse/config/mgmtd_main_launcher.toml create mode 100644 tests/fuse/config/pjdfstest.toml create mode 100644 tests/fuse/config/storage_main.toml create mode 100644 tests/fuse/config/storage_main_launcher.toml create mode 100644 tests/fuse/fuse_test_ci.py create mode 100644 tests/fuse/lock_directory.py create mode 100644 tests/fuse/random_rw.py create mode 100644 tests/fuse/read_after_write.py create mode 100644 tests/fuse/run.sh create mode 100644 tests/fuse/test_iflags.py create mode 100644 tests/fuse/test_ioctl.py create mode 100644 tests/fuse/test_trash.sh create mode 100644 tests/fuse/test_trash_cleaner.py create mode 100644 tests/fuse/usrbio.py create mode 100644 tests/kv/CMakeLists.txt create mode 100644 tests/kv/TestKVStore.cc create mode 100644 tests/lib/CMakeLists.txt create mode 100644 tests/lib/Helper.h create mode 100644 tests/lib/UnitTestFabric.cc create mode 100644 tests/lib/UnitTestFabric.h create mode 100644 tests/main/CMakeLists.txt create mode 100644 tests/main/TestMain.cc create mode 100644 tests/meta/CMakeLists.txt create mode 100644 tests/meta/MetaTestBase.cc create mode 100644 tests/meta/MetaTestBase.h create mode 100644 tests/meta/TestCommon.cc create mode 100644 tests/meta/components/TestAclCache.cc create mode 100644 tests/meta/components/TestChainAllocator.cc create mode 100644 tests/meta/components/TestDistributor.cc create mode 100644 tests/meta/components/TestFileHelper.cc create mode 100644 tests/meta/components/TestGcManager.cc create mode 100644 tests/meta/components/TestInodeIdAllocator.cc create mode 100644 tests/meta/components/TestSessionManager.cc create mode 100644 tests/meta/components/TestUserToken.cc create mode 100644 tests/meta/event/TestEventLogger.cc create mode 100644 tests/meta/event/TestScan.cc create mode 100644 tests/meta/store/TestAuth.cc create mode 100644 tests/meta/store/TestDirEntry.cc create mode 100644 tests/meta/store/TestInode.cc create mode 100644 tests/meta/store/ops/TestBatch.cc create mode 100644 tests/meta/store/ops/TestClose.cc create mode 100644 tests/meta/store/ops/TestCreate.cc create mode 100644 tests/meta/store/ops/TestHardLink.cc create mode 100644 tests/meta/store/ops/TestIFlags.cc create mode 100644 tests/meta/store/ops/TestList.cc create mode 100644 tests/meta/store/ops/TestMkdirs.cc create mode 100644 tests/meta/store/ops/TestOpen.cc create mode 100644 tests/meta/store/ops/TestRealPath.cc create mode 100644 tests/meta/store/ops/TestRemove.cc create mode 100644 tests/meta/store/ops/TestRename.cc create mode 100644 tests/meta/store/ops/TestResolve.cc create mode 100644 tests/meta/store/ops/TestSetPermission.cc create mode 100644 tests/meta/store/ops/TestStat.cc create mode 100644 tests/meta/store/ops/TestSymlink.cc create mode 100644 tests/meta/store/ops/TestSync.cc create mode 100644 tests/meta/store/ops/TestTruncate.cc create mode 100644 tests/meta/store/ops/TestUtimes.cc create mode 100644 tests/mgmtd/CMakeLists.txt create mode 100644 tests/mgmtd/MgmtdTestHelper.cpp create mode 100644 tests/mgmtd/MgmtdTestHelper.h create mode 100644 tests/mgmtd/TestMgmtdOperator.cc create mode 100644 tests/mgmtd/TestMgmtdStore.cc create mode 100644 tests/mgmtd/TestNodeSelector.cc create mode 100644 tests/mgmtd/TestUpdateChain.cc create mode 100644 tests/migration/CMakeLists.txt create mode 100644 tests/migration/TestMigrationService.cc create mode 100644 tests/scripts/CMakeLists.txt create mode 100644 tests/scripts/binary_backup.sh create mode 100755 tests/scripts/fdb_loopback.sh create mode 100644 tests/storage/CMakeLists.txt create mode 100644 tests/storage/client/CMakeLists.txt create mode 100644 tests/storage/client/TestFaultInjection.cc create mode 100644 tests/storage/client/TestStorageBenchmark.cc create mode 100644 tests/storage/client/TestStorageClientFastFailover.cc create mode 100644 tests/storage/client/TestStorageClientHCStress.cc create mode 100644 tests/storage/client/TestStorageClientInterface.cc create mode 100644 tests/storage/client/TestStorageClientSideError.cc create mode 100644 tests/storage/client/TestTargetSelectionStrategy.cc create mode 100644 tests/storage/service/CMakeLists.txt create mode 100644 tests/storage/service/TestDumpMeta.cc create mode 100644 tests/storage/service/TestIncorrectRoutingInfo.cc create mode 100644 tests/storage/service/TestSingleProcessCluster.cc create mode 100644 tests/storage/service/TestStorageService.cc create mode 100644 tests/storage/service/TestStorageServiceFailStop.cc create mode 100644 tests/storage/store/CMakeLists.txt create mode 100644 tests/storage/store/TestBufferPool.cc create mode 100644 tests/storage/store/TestChunkEngine.cc create mode 100644 tests/storage/store/TestChunkMetaStore.cc create mode 100644 tests/storage/store/TestCommonStruct.cc create mode 100644 tests/storage/store/TestStorageTarget.cc create mode 100644 tests/storage/store/TestStorageTargets.cc create mode 100644 tests/storage/sync/CMakeLists.txt create mode 100644 tests/storage/sync/TestSyncForward.cc create mode 100644 tests/storage/sync/TestSyncStartAndDone.cc create mode 100644 tests/stubs/DummyMgmtdServiceStub.h create mode 100644 third_party/liburing-cmake/CMakeLists.txt create mode 100644 third_party/liburing-cmake/liburing/compat.h create mode 100644 third_party/liburing-cmake/liburing/io_uring_version.h create mode 100644 tsan_ignore.txt create mode 100644 tsan_suppressions.txt diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..7db8d67 --- /dev/null +++ b/.clang-format @@ -0,0 +1,29 @@ +BasedOnStyle: Google +Language: Cpp +Standard: c++20 +AlignAfterOpenBracket: Align +AlignEscapedNewlines: Left +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AlwaysBreakAfterReturnType: None +AlwaysBreakTemplateDeclarations: true +BinPackArguments: false +BinPackParameters: false +BitFieldColonSpacing: Both +BreakConstructorInitializers: BeforeColon +BreakInheritanceList: BeforeColon +IndentWidth: 2 +PointerAlignment: Right +DerivePointerAlignment: false +ColumnLimit: 120 +PackConstructorInitializers: Never +SpaceAfterTemplateKeyword: true + +IncludeCategories: + - Regex: 'Flat_generated\.h("|>)' + Priority: 1000 + SortPriority: 1000 + - Regex: '"fbs/macros/' + Priority: 1001 + SortPriority: 1001 \ No newline at end of file diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..452364d --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,117 @@ +Checks: > + -*, + bugprone-undelegated-constructor, + bugprone-argument-comment, + bugprone-bad-signal-to-kill-thread, + bugprone-bool-pointer-implicit-conversion, + bugprone-copy-constructor-init, + bugprone-dangling-handle, + bugprone-forward-declaration-namespace, + bugprone-fold-init-type, + bugprone-inaccurate-erase, + bugprone-incorrect-roundings, + bugprone-infinite-loop, + bugprone-integer-division, + bugprone-macro-repeated-side-effects, + bugprone-misplaced-operator-in-strlen-in-alloc, + bugprone-misplaced-pointer-arithmetic-in-alloc, + bugprone-misplaced-widening-cast, + bugprone-move-forwarding-reference, + bugprone-multiple-statement-macro, + bugprone-parent-virtual-call, + bugprone-posix-return, + bugprone-reserved-identifier, + bugprone-signed-char-misuse, + bugprone-sizeof-container, + bugprone-sizeof-expression, + bugprone-string-constructor, + bugprone-string-integer-assignment, + bugprone-string-literal-with-embedded-nul, + bugprone-suspicious-enum-usage, + bugprone-suspicious-include, + bugprone-suspicious-memset-usage, + bugprone-suspicious-missing-comma, + bugprone-suspicious-string-compare, + bugprone-swapped-arguments, + bugprone-terminating-continue, + bugprone-throw-keyword-missing, + bugprone-too-small-loop-variable, + bugprone-undefined-memory-manipulation, + bugprone-unhandled-self-assignment, + bugprone-unused-raii, + bugprone-unused-return-value, + bugprone-use-after-move, + bugprone-virtual-near-miss, + # bugprone-macro-parentheses, + # bugprone-narrowing-conversions, + # bugprone-exception-escape, + + performance-faster-string-find, + performance-for-range-copy, + performance-implicit-conversion-in-loop, + performance-inefficient-algorithm, + performance-inefficient-vector-operation, + performance-move-constructor-init, + performance-no-automatic-move, + performance-trivially-destructible, + performance-unnecessary-copy-initialization, + performance-move-const-arg, + + modernize-avoid-bind, + modernize-loop-convert, + modernize-make-shared, + modernize-make-unique, + modernize-raw-string-literal, + modernize-redundant-void-arg, + modernize-replace-auto-ptr, + modernize-replace-random-shuffle, + modernize-use-auto, + modernize-use-bool-literals, + modernize-use-nullptr, + modernize-use-using, + modernize-use-override, + modernize-use-equals-default, + modernize-use-equals-delete, + + misc-throw-by-value-catch-by-reference, + misc-misplaced-const, + misc-unconventional-assign-operator, + misc-redundant-expression, + misc-static-assert, + misc-unconventional-assign-operator, + misc-uniqueptr-reset-release, + misc-unused-alias-decls, + misc-unused-parameters, + misc-unused-using-decls, + + readability-avoid-const-params-in-decls + readability-const-return-type, + readability-container-size-empty, + readability-delete-null-pointer, + readability-deleted-default, + readability-misplaced-array-index, + readability-non-const-parameter, + readability-redundant-control-flow, + readability-redundant-function-ptr-dereference, + readability-redundant-smartptr-get, + readability-redundant-string-cstr, + readability-redundant-string-init, + readability-static-definition-in-anonymous-namespace, + readability-string-compare, + readability-uniqueptr-delete-release, + readability-simplify-subscript-expr, + readability-simplify-boolean-expr, + readability-inconsistent-declaration-parameter-name, + # readability-qualified-auto, + + cert-flp30-c, + cert-mem57-cpp, + cert-oop58-cpp, + google-build-explicit-make-pair, + google-runtime-operator, + hicpp-exception-baseclass, + cppcoreguidelines-virtual-class-destructor, +WarningsAsErrors: "" +CheckOptions: + - key: performance-move-const-arg.CheckTriviallyCopyableMove + value: false \ No newline at end of file diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..ca1f2dc --- /dev/null +++ b/.clangd @@ -0,0 +1,3 @@ +CompileFlags: + Add: -fcoroutines-ts + Remove: [-fcoroutines, -DNO_INTELLISENSE] diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1ce142c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +clang +build +deploy/*/Dockerfile diff --git a/.github/workflows/build-dev-docker-image.yml b/.github/workflows/build-dev-docker-image.yml new file mode 100644 index 0000000..2a391a4 --- /dev/null +++ b/.github/workflows/build-dev-docker-image.yml @@ -0,0 +1,52 @@ +name: Build development Docker image + +on: + workflow_dispatch: + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }}-dev + +jobs: + push_to_registry: + runs-on: ubuntu-latest + + permissions: + packages: write + contents: read + attestations: write + id-token: write + + steps: + - name: Check out the repository + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Build and push Docker image + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: . + file: ./dockerfile/dev.dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v2 + with: + subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}} + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..a48852d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,30 @@ +name: Build + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + runs-on: self-hosted # or `ubuntu-22.04` + + steps: + - uses: actions/checkout@v4 + + - name: Prepare + run: | + sudo apt install -y cmake libuv1-dev liblz4-dev liblzma-dev libdouble-conversion-dev libdwarf-dev libunwind-dev + sudo apt install -y libaio-dev libgflags-dev libgoogle-glog-dev libgtest-dev libgmock-dev clang-format-14 clang-14 clang-tidy-14 lld-14 + sudo apt install -y libgoogle-perftools-dev google-perftools libssl-dev gcc-12 g++-12 libboost-all-dev meson rustc cargo + wget https://github.com/apple/foundationdb/releases/download/7.1.61/foundationdb-clients_7.1.61-1_amd64.deb && sudo dpkg -i foundationdb-clients_7.1.61-1_amd64.deb + git clone https://github.com/libfuse/libfuse.git libfuse -b fuse-3.16.2 --depth 1 && mkdir libfuse/build && cd libfuse/build && meson setup .. && ninja && sudo ninja install && cd ../.. && rm -rf libfuse + git submodule update --init --recursive + ./patches/apply.sh + + - name: Build + run: | + cargo build --release + cmake -S . -B build -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_C_COMPILER=clang-14 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DSHUFFLE_METHOD=g++11 + cmake --build build -j 32 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f8b92c --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +/.cache +/.vscode +/build +/debug +/release +/clang +/clangdbg +/packages +*.o +*.a +*.so +*.log +compile_commands.json +*_generated.h +*~ +__pycache__ +/target diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..aea7ad4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,42 @@ +[submodule "third_party/googletest"] + path = third_party/googletest + url = https://github.com/google/googletest.git +[submodule "third_party/folly"] + path = third_party/folly + url = https://github.com/facebook/folly.git +[submodule "third_party/leveldb"] + path = third_party/leveldb + url = https://github.com/google/leveldb.git +[submodule "third_party/rocksdb"] + path = third_party/rocksdb + url = https://github.com/facebook/rocksdb.git +[submodule "third_party/scnlib"] + path = third_party/scnlib + url = https://github.com/eliaskosunen/scnlib.git +[submodule "third_party/pybind11"] + path = third_party/pybind11 + url = https://github.com/pybind/pybind11.git +[submodule "third_party/clickhouse-cpp"] + path = third_party/clickhouse-cpp + url = https://github.com/ClickHouse/clickhouse-cpp.git +[submodule "third_party/fmt"] + path = third_party/fmt + url = https://github.com/fmtlib/fmt.git +[submodule "third_party/toml11"] + path = third_party/toml11 + url = https://github.com/ToruNiina/toml11.git +[submodule "third_party/jemalloc"] + path = third_party/jemalloc + url = https://github.com/jemalloc/jemalloc.git +[submodule "third_party/mimalloc"] + path = third_party/mimalloc + url = https://github.com/microsoft/mimalloc.git +[submodule "third_party/zstd"] + path = third_party/zstd + url = https://github.com/facebook/zstd.git +[submodule "third_party/liburing"] + path = third_party/liburing + url = https://github.com/axboe/liburing.git +[submodule "third_party/gtest-parallel"] + path = third_party/gtest-parallel + url = https://github.com/google/gtest-parallel.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..33064fa --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,208 @@ +cmake_minimum_required(VERSION 3.12) +project(3FS VERSION 0.1.5 LANGUAGES C CXX) + +set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel" CACHE STRING "" FORCE) +if (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None") + set (CMAKE_BUILD_TYPE "RelWithDebInfo") + message (STATUS "CMAKE_BUILD_TYPE is not set, set to default = ${CMAKE_BUILD_TYPE}") +endif () +message (STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") + +string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC) + +if(CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG" ) + option(ENABLE_ASSERTIONS "Enable assertions" ON) +else() + option(ENABLE_ASSERTIONS "Enable assertions" OFF) +endif() +message (STATUS "ENABLE_ASSERTIONS: ${ENABLE_ASSERTIONS}") + +if(ENABLE_ASSERTIONS) + add_definitions(-D_DEBUG) + # On non-Debug builds cmake automatically defines NDEBUG, so we explicitly undefine it: + if(NOT CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG") + # NOTE: use `add_compile_options` rather than `add_definitions` since + # `add_definitions` does not support generator expressions. + add_compile_options($<$,$>:-UNDEBUG>) + endif() +endif() + +set(SHUFFLE_METHODS "g++10" "g++11" "stdshuffle") +set(SHUFFLE_METHOD "" CACHE STRING "Choose the shuffle method (REQUIRED)") +set_property(CACHE SHUFFLE_METHOD PROPERTY STRINGS ${SHUFFLE_METHODS}) + +if("${SHUFFLE_METHOD}" STREQUAL "") + message(FATAL_ERROR + "\n [ERROR]: SHUFFLE_METHOD is not set!\n" + " You must specify it using: cmake -DSHUFFLE_METHOD=\n" + " Valid options are: ${SHUFFLE_METHODS}" + ) +elseif(NOT SHUFFLE_METHOD IN_LIST SHUFFLE_METHODS) + message(FATAL_ERROR + "\n [ERROR]: Invalid SHUFFLE_METHOD: '${SHUFFLE_METHOD}'\n" + " Valid options are: ${SHUFFLE_METHODS}" + ) +endif() + +message(STATUS "Use Shuffle Method: ${SHUFFLE_METHOD}") +if(SHUFFLE_METHOD STREQUAL "stdshuffle") + add_compile_definitions(USE_STD_SHUFFLE) +elseif(SHUFFLE_METHOD STREQUAL "g++10") + add_compile_definitions(USE_GCC10_SHUFFLE) +elseif(SHUFFLE_METHOD STREQUAL "g++11") + add_compile_definitions(USE_GCC11_SHUFFLE) +endif() + +option(OVERRIDE_CXX_NEW_DELETE "Override C++ new/delete operator" OFF) +option(SAVE_ALLOCATE_SIZE "Use more memory to save allocate size" OFF) + +option(ENABLE_FUSE_APPLICATION "" ON) + +if (DEFINED SANITIZER AND SANITIZER) + set(OVERRIDE_CXX_NEW_DELETE OFF) +endif() +message (STATUS "OVERRIDE_CXX_NEW_DELETE: ${OVERRIDE_CXX_NEW_DELETE}") + +if (OVERRIDE_CXX_NEW_DELETE) + add_definitions(-DOVERRIDE_CXX_NEW_DELETE) + if (SAVE_ALLOCATE_SIZE) + add_definitions(-DSAVE_ALLOCATE_SIZE) + endif() +endif() +message (STATUS "SAVE_ALLOCATE_SIZE: ${SAVE_ALLOCATE_SIZE}") + +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED OFF) +set(CMAKE_C_EXTENSIONS ON) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines-ts") + set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -latomic") + add_link_options(-fuse-ld=lld) + # Do not build with libc++ (LLVM's implementation of the C++ standard library) in fdb + set(USE_LIBCXX OFF) +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines") +endif() + +# Remove project root from the __FILE__ macro variable +add_compile_options(-fmacro-prefix-map=${CMAKE_SOURCE_DIR}=.) + +if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") + add_compile_options(-msse4.2 -mavx2) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") + # ARM architecture detected: + # Clang on ARM uses built-in runtime library (compiler-rt) to provide symbols like '__muloti4'. + # Without explicitly specifying '-rtlib=compiler-rt', linking may fail due to missing '__muloti4'. + # '-unwindlib=libgcc' ensures proper exception unwinding compatibility. + add_compile_options(-march=armv8-a+crc) + message(STATUS "ARM architecture detected, linking with compiler-rt and libgcc.") + add_link_options("-rtlib=compiler-rt" "-unwindlib=libgcc") +endif() +add_compile_definitions(ROCKSDB_NAMESPACE=rocksdb_internal) +include(cmake/Sanitizers.cmake) +include(cmake/CompileFlags.cmake) + +# folly can't work normally under -Werror +store_compile_flags() +add_subdirectory("third_party/fmt" EXCLUDE_FROM_ALL) +restore_compile_flags() +set(ZSTD_BUILD_STATIC ON) +add_subdirectory("third_party/zstd/build/cmake" EXCLUDE_FROM_ALL) +set(zstd_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/third_party/zstd/lib") +set(ZSTD_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/third_party/zstd/lib") +set(zstd_FOUND ON) +set(ZSTD_FOUND ON) +set(zstd_LIBRARIES "${PROJECT_BINARY_DIR}/third_party/zstd/build/cmake/lib/libzstd.a") +set(ZSTD_LIBRARY "${PROJECT_BINARY_DIR}/third_party/zstd/build/cmake/lib/libzstd.a") +restore_compile_flags() +add_subdirectory("third_party/googletest" EXCLUDE_FROM_ALL) +restore_compile_flags() +set(FOLLY_NO_EXCEPTION_TRACER ON) +add_subdirectory("third_party/folly" EXCLUDE_FROM_ALL) +restore_compile_flags() +set(LEVELDB_BUILD_TESTS OFF CACHE BOOL "Disable LevelDB tests") +set(LEVELDB_BUILD_BENCHMARKS OFF CACHE BOOL "Disable LevelDB benchmarks") +set(LEVELDB_INSTALL OFF CACHE BOOL "Disable LevelDB install") +add_subdirectory("third_party/leveldb" EXCLUDE_FROM_ALL) +restore_compile_flags() +set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) +set(WITH_LZ4 ON) +set(WITH_ZSTD ON) +set(USE_RTTI ON) +set(WITH_TESTS OFF) +set(WITH_BENCHMARK_TOOLS OFF) +set(WITH_TOOLS OFF) +set(WITH_ALL_TESTS OFF) + +add_subdirectory("third_party/rocksdb" EXCLUDE_FROM_ALL) +restore_compile_flags() +set(SCN_TESTS OFF) +set(SCN_EXAMPLES OFF) +set(SCN_BENCHMARKS OFF) +set(SCN_DOCS OFF) +set(SCN_INSTALL OFF) +set(SCN_PEDANTIC OFF) +add_subdirectory("third_party/scnlib" EXCLUDE_FROM_ALL) +restore_compile_flags() +add_subdirectory("third_party/pybind11" EXCLUDE_FROM_ALL) +restore_compile_flags() +add_subdirectory("third_party/toml11" EXCLUDE_FROM_ALL) +restore_compile_flags() +set (MI_OVERRIDE OFF) +add_subdirectory("third_party/mimalloc" EXCLUDE_FROM_ALL) +restore_compile_flags() +add_subdirectory("third_party/clickhouse-cpp" EXCLUDE_FROM_ALL) +TARGET_INCLUDE_DIRECTORIES(clickhouse-cpp-lib + PUBLIC ${PROJECT_SOURCE_DIR}/third_party/clickhouse-cpp +) +TARGET_INCLUDE_DIRECTORIES(clickhouse-cpp-lib-static + PUBLIC ${PROJECT_SOURCE_DIR}/third_party/clickhouse-cpp +) +TARGET_INCLUDE_DIRECTORIES (absl-lib + PUBLIC ${PROJECT_SOURCE_DIR}/third_party/clickhouse-cpp/contrib +) +restore_compile_flags() +add_subdirectory("third_party/liburing-cmake" EXCLUDE_FROM_ALL) +restore_compile_flags() + +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -Wpedantic") + +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS}") +set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 ${DEBUG_INFO_FLAGS} ${CMAKE_CXX_FLAGS_ADD}") +set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${DEBUG_INFO_FLAGS} -fno-inline ${CMAKE_CXX_FLAGS_ADD}") + +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS} ${CMAKE_C_FLAGS_ADD}") +set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3 ${DEBUG_INFO_FLAGS} ${CMAKE_C_FLAGS_ADD}") +set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 ${DEBUG_INFO_FLAGS} -fno-inline ${CMAKE_C_FLAGS_ADD}") + +set (CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${COMPILER_FLAGS} ${CMAKE_ASM_FLAGS_ADD}") +set (CMAKE_ASM_FLAGS_RELWITHDEBINFO "${CMAKE_ASM_FLAGS_RELWITHDEBINFO} -O3 ${DEBUG_INFO_FLAGS} ${CMAKE_ASM_FLAGS_ADD}") +set (CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -O0 ${DEBUG_INFO_FLAGS} -fno-inline ${CMAKE_ASM_FLAGS_ADD}") + +set(Boost_USE_STATIC_LIBS ON) +set(FDB_VERSION 7.1.5-ibe) + +find_package(Threads REQUIRED) +find_package(Boost REQUIRED COMPONENTS filesystem system program_options) +find_library(LIBUV_LIBRARY NAMES libuv1) +enable_testing() + +include(cmake/CodeCoverage.cmake) +include(cmake/CLangFormat.cmake) +include(cmake/CLangTidy.cmake) +include(cmake/Target.cmake) +include(cmake/DumpConfig.cmake) +include(cmake/Jemalloc.cmake) +include(cmake/ApacheArrow.cmake) +include(cmake/AddCrate.cmake) +configure_file(cmake/CTestCustom.cmake ${CMAKE_BINARY_DIR} @ONLY) + +add_subdirectory(src) +add_subdirectory(tests) +add_subdirectory(benchmarks) diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..7cd109d --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2139 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" + +[[package]] +name = "atomic-wait" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55b94919229f2c42292fd71ffa4b75e83193bffdd77b1e858cd55fd2d0b0ea8" +dependencies = [ + "libc", + "windows-sys 0.42.0", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.100", +] + +[[package]] +name = "bindgen" +version = "0.71.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.1", + "shlex", + "syn 2.0.100", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets", +] + +[[package]] +name = "chunk_engine" +version = "0.1.11" +dependencies = [ + "anyhow", + "byteorder", + "clap 4.5.22", + "crc32c", + "criterion", + "cxx", + "cxx-build", + "dashmap", + "derse", + "lazy_static", + "libc", + "lockmap", + "rand", + "rocksdb", + "rolling-file", + "serde", + "static_assertions", + "tempfile", + "tinyvec", + "toml", + "tracing", + "tracing-appender", + "tracing-subscriber", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "4.5.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69371e34337c4c984bbe322360c2547210bf632eb2814bbe78a6e87a2935bd2b" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e24c1b4099818523236a8ca881d2b45db98dadfb4625cf6608c12069fcbbde1" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim 0.11.1", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "clap_lex" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "crc32c" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap 4.5.22", + "criterion-plot", + "is-terminal", + "itertools 0.10.5", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "cxx" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e1ec88093d2abd9cf1b09ffd979136b8e922bf31cad966a8fe0d73233112ef" +dependencies = [ + "cc", + "cxxbridge-cmd", + "cxxbridge-flags", + "cxxbridge-macro", + "foldhash", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afa390d956ee7ccb41aeed7ed7856ab3ffb4fc587e7216be7e0f83e949b4e6c" +dependencies = [ + "cc", + "codespan-reporting", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.100", +] + +[[package]] +name = "cxxbridge-cmd" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c23bfff654d6227cbc83de8e059d2f8678ede5fc3a6c5a35d5c379983cc61e6" +dependencies = [ + "clap 4.5.22", + "codespan-reporting", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c01b36e22051bc6928a78583f1621abaaf7621561c2ada1b00f7878fbe2caa" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e14013136fac689345d17b9a6df55977251f11d333c0a571e8d963b55e1f95" +dependencies = [ + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.100", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derse" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcfe91e406c110568015f9cd5934396bcfdf745c3c265c00a6e5c381f0fcde5" +dependencies = [ + "derse-derive", + "thiserror", + "tinyvec", +] + +[[package]] +name = "derse-derive" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effbaf2997637f96a3b52502d1b4d8ca7a7f4a55a5206ef6d4d71712fa2368be" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fastrand" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" + +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hf3fs-usrbio-sys" +version = "0.1.0" +dependencies = [ + "bindgen 0.71.1", + "shared_memory", + "uuid", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "indexmap" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "is-terminal" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +dependencies = [ + "hermit-abi 0.4.0", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.167" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets", +] + +[[package]] +name = "librocksdb-sys" +version = "0.16.0+8.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce3d60bc059831dc1c83903fb45c103f75db65c5a7bf22272764d9cc683e348c" +dependencies = [ + "bindgen 0.69.5", + "bzip2-sys", + "cc", + "glob", + "libc", + "libz-sys", + "lz4-sys", + "zstd-sys", +] + +[[package]] +name = "libz-sys" +version = "1.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" +dependencies = [ + "cc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard 1.2.0", +] + +[[package]] +name = "lockmap" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aaaea9efca9e51113b978e9c485d2d16603693b8c82fff6ebe585ebe253f451" +dependencies = [ + "atomic-wait", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nix" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "oorandom" +version = "11.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" +dependencies = [ + "proc-macro2", + "syn 2.0.100", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rocksdb" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd13e55d6d7b8cd0ea569161127567cd587676c99f4472f779a0279aa60a7a7" +dependencies = [ + "libc", + "librocksdb-sys", +] + +[[package]] +name = "rolling-file" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8395b4f860856b740f20a296ea2cd4d823e81a2658cf05ef61be22916026a906" +dependencies = [ + "chrono", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scratch" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_json" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shared_memory" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8593196da75d9dc4f69349682bd4c2099f8cde114257d1ef7ef1b33d1aba54" +dependencies = [ + "cfg-if", + "libc", + "nix 0.23.2", + "rand", + "win-sys", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "structopt" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" +dependencies = [ + "clap 2.34.0", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck 0.3.3", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "chrono", + "nu-ansi-term", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "trash_cleaner" +version = "0.1.0" +dependencies = [ + "chrono", + "libc", + "nix 0.29.0", + "scopeguard 0.3.3", + "serde", + "serde_json", + "structopt", + "tempfile", + "tracing", + "tracing-appender", + "tracing-subscriber", +] + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +dependencies = [ + "getrandom 0.3.1", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" + +[[package]] +name = "web-sys" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a98bc3c33f0fe7e59ad7cd041b89034fa82a7c2d4365ca538dda6cdaf513863c" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "win-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b7b128a98c1cfa201b09eb49ba285887deb3cbe7466a98850eb1adabb452be5" +dependencies = [ + "windows", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" +dependencies = [ + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..253b670 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,22 @@ +[workspace] +members = [ + "src/client/trash_cleaner", + "src/storage/chunk_engine", + "src/lib/rs/hf3fs-usrbio-sys" +] +default-members = [ + "src/client/trash_cleaner", + "src/storage/chunk_engine", +] +resolver = "2" + +[workspace.package] +authors = ["dev "] +edition = "2021" +license = "MIT" +rust-version = "1.85.0" # MSRV + +[profile.release-cmake] +debug = true +inherits = "release" +lto = true diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5c48bdc --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 DeepSeek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..18d8993 --- /dev/null +++ b/README.md @@ -0,0 +1,129 @@ +# Fire-Flyer File System + +[![Build](https://github.com/deepseek-ai/3fs/actions/workflows/build.yml/badge.svg)](https://github.com/deepseek-ai/3fs/actions/workflows/build.yml) +[![License](https://img.shields.io/badge/LICENSE-MIT-blue.svg)](LICENSE) + +The Fire-Flyer File System (3FS) is a high-performance distributed file system designed to address the challenges of AI training and inference workloads. It leverages modern SSDs and RDMA networks to provide a shared storage layer that simplifies development of distributed applications. Key features and benefits of 3FS include: + +- Performance and Usability + - **Disaggregated Architecture** Combines the throughput of thousands of SSDs and the network bandwidth of hundreds of storage nodes, enabling applications to access storage resource in a locality-oblivious manner. + - **Strong Consistency** Implements Chain Replication with Apportioned Queries (CRAQ) for strong consistency, making application code simple and easy to reason about. + - **File Interfaces** Develops stateless metadata services backed by a transactional key-value store (e.g., FoundationDB). The file interface is well known and used everywhere. There is no need to learn a new storage API. + +- Diverse Workloads + - **Data Preparation** Organizes outputs of data analytics pipelines into hierarchical directory structures and manages a large volume of intermediate outputs efficiently. + - **Dataloaders** Eliminates the need for prefetching or shuffling datasets by enabling random access to training samples across compute nodes. + - **Checkpointing** Supports high-throughput parallel checkpointing for large-scale training. + - **KVCache for Inference** Provides a cost-effective alternative to DRAM-based caching, offering high throughput and significantly larger capacity. + +## Documentation + +* [Design Notes](docs/design_notes.md) +* [Setup Guide](deploy/README.md) +* [USRBIO API Reference](src/lib/api/UsrbIo.md) +* [P Specifications](./specs/README.md) + +## Performance + +### 1. Peak throughput + +The following figure demonstrates the throughput of read stress test on a large 3FS cluster. This cluster consists of 180 storage nodes, each equipped with 2×200Gbps InfiniBand NICs and sixteen 14TiB NVMe SSDs. Approximately 500+ client nodes were used for the read stress test, with each client node configured with 1x200Gbps InfiniBand NIC. The final aggregate read throughput reached approximately 6.6 TiB/s with background traffic from training jobs. + +![Large block read throughput under stress test on a 180-node cluster](docs/images/peak_throughput.jpg) + +To benchmark 3FS, please use our [fio engine for USRBIO](benchmarks/fio_usrbio/README.md). + +### 2. GraySort + +We evaluated [smallpond](https://github.com/deepseek-ai/smallpond) using the GraySort benchmark, which measures sort performance on large-scale datasets. Our implementation adopts a two-phase approach: (1) partitioning data via shuffle using the prefix bits of keys, and (2) in-partition sorting. Both phases read/write data from/to 3FS. + +The test cluster comprised 25 storage nodes (2 NUMA domains/node, 1 storage service/NUMA, 2×400Gbps NICs/node) and 50 compute nodes (2 NUMA domains, 192 physical cores, 2.2 TiB RAM, and 1×200 Gbps NIC/node). Sorting 110.5 TiB of data across 8,192 partitions completed in 30 minutes and 14 seconds, achieving an average throughput of *3.66 TiB/min*. + +![](docs/images/gray_sort_server.png) +![](docs/images/gray_sort_client.png) + +### 3. KVCache + +KVCache is a technique used to optimize the LLM inference process. It avoids redundant computations by caching the key and value vectors of previous tokens in the decoder layers. +The top figure demonstrates the read throughput of all KVCache clients (1×400Gbps NIC/node), highlighting both peak and average values, with peak throughput reaching up to 40 GiB/s. The bottom figure presents the IOPS of removing ops from garbage collection (GC) during the same time period. + +![KVCache Read Throughput](./docs/images/kvcache_read_throughput.png) +![KVCache GC IOPS](./docs/images/kvcache_gc_iops.png) + +## Check out source code + +Clone 3FS repository from GitHub: + + git clone https://github.com/deepseek-ai/3fs + +When `deepseek-ai/3fs` has been cloned to a local file system, run the +following commands to check out the submodules: + +```bash +cd 3fs +git submodule update --init --recursive +./patches/apply.sh +``` + +## Install dependencies + +Install dependencies: + +```bash +# for Ubuntu 20.04. +apt install cmake libuv1-dev liblz4-dev liblzma-dev libdouble-conversion-dev libdwarf-dev libunwind-dev \ + libaio-dev libgflags-dev libgoogle-glog-dev libgtest-dev libgmock-dev clang-format-14 clang-14 clang-tidy-14 lld-14 \ + libgoogle-perftools-dev google-perftools libssl-dev libclang-rt-14-dev gcc-10 g++-10 libboost1.71-all-dev build-essential + +# for Ubuntu 22.04. +apt install cmake libuv1-dev liblz4-dev liblzma-dev libdouble-conversion-dev libdwarf-dev libunwind-dev \ + libaio-dev libgflags-dev libgoogle-glog-dev libgtest-dev libgmock-dev clang-format-14 clang-14 clang-tidy-14 lld-14 \ + libgoogle-perftools-dev google-perftools libssl-dev gcc-12 g++-12 libboost-all-dev build-essential + +# for openEuler 2403sp1 +yum install cmake libuv-devel lz4-devel xz-devel double-conversion-devel libdwarf-devel libunwind-devel \ + libaio-devel gflags-devel glog-devel gtest-devel gmock-devel clang-tools-extra clang lld \ + gperftools-devel gperftools openssl-devel gcc gcc-c++ boost-devel + +# for OpenCloudOS 9 and TencentOS 4 +dnf install epol-release wget git meson cmake perl lld gcc gcc-c++ autoconf lz4 lz4-devel xz xz-devel \ + double-conversion-devel libdwarf-devel libunwind-devel libaio-devel gflags-devel glog-devel \ + libuv-devel gmock-devel gperftools gperftools-devel openssl-devel boost-static boost-devel mono-devel \ + libevent-devel libibverbs-devel numactl-devel python3-devel +``` + +Install other build prerequisites: + +- [`libfuse`](https://github.com/libfuse/libfuse/releases/tag/fuse-3.16.1) 3.16.1 or newer version +- [FoundationDB](https://apple.github.io/foundationdb/getting-started-linux.html) 7.1 or newer version +- [Rust](https://www.rust-lang.org/tools/install) toolchain: minimal 1.75.0, recommended 1.85.0 or newer version (latest stable version) + +## Build 3FS + +Build 3FS in `build` folder: + +```bash +# Replace with 'g++10' or 'g++11' based on your environment +cmake -S . -B build \ + -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_C_COMPILER=clang-14 \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DSHUFFLE_METHOD= +cmake --build build -j 32 +``` + +Due to the historical use of `std::shuffle`, binaries compiled with different compiler versions (e.g., `g++10` vs. `g++11 +`) may be incompatible ([issue](https://github.com/deepseek-ai/3FS/issues/368)). To resolve this, you must explicitly specify `-DSHUFFLE_METHOD` during compilation to lock in a consistent shuffle algorithm: + +- Existing Clusters: Use the method corresponding to the compiler version previously used to deploy the cluster (`g++10` or `g++11`). +- New Clusters: You can choose either `g++10` or `g++11`. However, once the cluster is deployed, you must stay with the same configuration for all future builds to maintain compatibility. + +### Build 3FS use Docker +- For TencentOS-4: `docker pull docker.io/tencentos/tencentos4-deepseek3fs-build:latest` +- For OpenCloudOS-9: `docker pull docker.io/opencloudos/opencloudos9-deepseek3fs-build:latest` + +## Run a test cluster + +Follow instructions in [setup guide](deploy/README.md) to run a test cluster. + +## Report Issues + +Please visit https://github.com/deepseek-ai/3fs/issues to report issues. diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..78fc24d --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`deepseek-ai/3FS` +- 原始仓库:https://github.com/deepseek-ai/3FS +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt new file mode 100644 index 0000000..15b8240 --- /dev/null +++ b/benchmarks/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(storage_bench) diff --git a/benchmarks/fio_usrbio/Makefile b/benchmarks/fio_usrbio/Makefile new file mode 100644 index 0000000..be028de --- /dev/null +++ b/benchmarks/fio_usrbio/Makefile @@ -0,0 +1,23 @@ +HF3FS_INCLUDE_DIR ?= /usr/include +HF3FS_LIB_DIR ?= /usr/lib +FIO_SRC_DIR ?= /usr/include + +PLUGIN_NAME = hf3fs_usrbio +SO_NAME = ${PLUGIN_NAME}.so +SRC = ${PLUGIN_NAME}.cpp +OBJ = ${PLUGIN_NAME}.o + +CXX = g++ +CXXFLAGS = -fPIC -fpermissive -O3 -D_GNU_SOURCE -shared -rdynamic -I${HF3FS_INCLUDE_DIR} -I${FIO_SRC_DIR} -include config-host.h +LDFLAGS = -L${HF3FS_LIB_DIR} -lhf3fs_api_shared -Wl,-rpath=${HF3FS_LIB_DIR} + +.PHONY: all clean + +all: ${SO_NAME} + +${SO_NAME}: ${SRC} + ${CXX} ${CXXFLAGS} $^ -o $@ ${LDFLAGS} + +clean: + rm -rf ${OBJ} ${SO_NAME} + diff --git a/benchmarks/fio_usrbio/README.md b/benchmarks/fio_usrbio/README.md new file mode 100644 index 0000000..56a251d --- /dev/null +++ b/benchmarks/fio_usrbio/README.md @@ -0,0 +1,40 @@ +# FIO engine for 3FS USRBIO + +This repository contains the [fio] external plugin used for benchmarking [3FS] USRBIO. + +## Build + +First, build 3FS and fio. + +Configure the following variables: +- `HF3FS_LIB_DIR`: directory contains `libhf3fs_api_shared.so`, the default path in 3FS repo is `3FS/build/src/lib/api`. +- `HF3FS_INCLUDE_DIR`: directory contains `hf3fs_usrbio.h`, the default path in 3FS repo is `3FS/src/lib/api`. +- `FIO_SRC_DIR`: directory contains `config-host.h`. After building fio, this header will be in the root of the fio repo. + +Then run: +``` +make HF3FS_LIB_DIR=${HF3FS_LIB_DIR} HF3FS_INCLUDE_DIR=${HF3FS_INCLUDE_DIR} FIO_SRC_DIR=${FIO_SRC_DIR} +``` + +You will get the external plugin as `hf3fs_usrbio.so`. + +## Usage + +To use this plugin, set the `ioengine` args in fio as `external:hf3fs_usrbio.so`. Please refer to [fio documentation] for further explanation. + +Since multiple 3FS instances might be mounted, you need to specify the 3FS instance during benchmarking. This can be done by adding the `mountpoint` arguments (in the `.fio`): +``` +mountpoint=/hf3fs/mount/point +``` + +To benchmark batched small I/Os, please set these four parameters to `batch_size` simultaneously: +``` +iodepth=1024 +iodepth_batch_submit=1024 +iodepth_batch_complete_min=1024 +iodepth_batch_complete_max=1024 +``` + +[fio]: https://github.com/axboe/fio +[3FS]: https://github.com/deepseek-ai/3FS +[fio documentation]: https://fio.readthedocs.io/en/latest/fio_doc.html diff --git a/benchmarks/fio_usrbio/hf3fs_usrbio.cpp b/benchmarks/fio_usrbio/hf3fs_usrbio.cpp new file mode 100644 index 0000000..9f83c93 --- /dev/null +++ b/benchmarks/fio_usrbio/hf3fs_usrbio.cpp @@ -0,0 +1,286 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "hf3fs_usrbio.h" +#include +#include +#include +#include + +extern "C" { +#include "fio.h" +#include "optgroup.h" +} + +struct hf3fs_usrbio_options { + int dummy; + char *mountpoint; + int ior_depth; + int ior_timeout; +}; + +static struct fio_option options[] = { + { + .name = "mountpoint", + .lname = "hf3fs mount point", + .type = FIO_OPT_STR_STORE, + .off1 = offsetof(struct hf3fs_usrbio_options, mountpoint), + .help = "Mount point (e.g. /hf3fs/mount/point)", + .def = "", + .category = FIO_OPT_C_ENGINE, + .group = FIO_OPT_G_NETIO, + }, + { + .name = "ior_depth", + .lname = "hf3fs ior depth", + .type = FIO_OPT_INT, + .off1 = offsetof(struct hf3fs_usrbio_options, ior_depth), + .help = "Ior depth", + .def = "0", + .category = FIO_OPT_C_ENGINE, + .group = FIO_OPT_G_NETIO, + }, + { + .name = "ior_timeout", + .lname = "hf3fs ior timeout (in ms)", + .type = FIO_OPT_INT, + .off1 = offsetof(struct hf3fs_usrbio_options, ior_timeout), + .help = "Ior timeout", + .def = "1", + .category = FIO_OPT_C_ENGINE, + .group = FIO_OPT_G_NETIO, + }, + { + .name = NULL, + }, +}; + +#define LAST_POS(f) ((f)->engine_pos) + +struct hf3fs_usrbio_data { + struct hf3fs_iov iov; + struct hf3fs_ior ior_r; + struct hf3fs_ior ior_w; + std::vector io_us; + int queued; + int events; + enum fio_ddir last_ddir; +}; + +static int hf3fs_usrbio_init(struct thread_data *td) { + td->io_ops_data = static_cast(new hf3fs_usrbio_data); + struct hf3fs_usrbio_options *options = td->eo; + + auto &ior_r = static_cast(td->io_ops_data)->ior_r; + auto res = hf3fs_iorcreate3(&ior_r, options->mountpoint, td->o.iodepth, true, options->ior_depth, 0, options->ior_timeout, -1); + if (res < 0) { + return res; + } + + auto &ior_w = static_cast(td->io_ops_data)->ior_w; + res = hf3fs_iorcreate(&ior_w, options->mountpoint, td->o.iodepth, false, options->ior_depth, -1); + if (res < 0) { + return res; + } + + auto *data = static_cast(td->io_ops_data); + data->io_us.resize(td->o.iodepth); + data->queued = 0; + data->events = 0; + + return 0; +} + +static int fio_io_end(struct thread_data *td, struct io_u *io_u, int ret) { + if (io_u->file && ret >= 0 && ddir_rw(io_u->ddir)) { + LAST_POS(io_u->file) = io_u->offset + ret; + } + + if (ret != (int) io_u->xfer_buflen) { + if (ret >= 0) { + io_u->resid = io_u->xfer_buflen - ret; + io_u->error = 0; + return FIO_Q_COMPLETED; + } else { + io_u->error = errno; + } + } + + if (io_u->error) { + io_u_log_error(td, io_u); + td_verror(td, io_u->error, "xfer"); + } + + return FIO_Q_COMPLETED; +} + +static enum fio_q_status hf3fs_usrbio_queue(struct thread_data *td, struct io_u *io_u) { + auto &vec = static_cast(td->io_ops_data)->io_us; + auto *sd = static_cast(td->io_ops_data); + + if (io_u->ddir != sd->last_ddir) { + if (sd->queued != 0) { + return FIO_Q_BUSY; + } else { + vec[sd->queued++] = io_u; + sd->last_ddir = io_u->ddir; + return FIO_Q_QUEUED; + } + } else { + if (sd->queued == td->o.iodepth) { + return FIO_Q_BUSY; + } + vec[sd->queued++] = io_u; + return FIO_Q_QUEUED; + } +} + +static int hf3fs_usrbio_commit(struct thread_data *td) { + auto &vec = static_cast(td->io_ops_data)->io_us; + auto *sd = static_cast(td->io_ops_data); + auto &ior_r = static_cast(td->io_ops_data)->ior_r; + auto &ior_w = static_cast(td->io_ops_data)->ior_w; + auto &iov = static_cast(td->io_ops_data)->iov; + + if (sd->queued == 0) { + return 0; + } + + io_u_mark_submit(td, sd->queued); + + int res = 0; + bool read = (sd->last_ddir == DDIR_READ); + auto &ior = read ? ior_r : ior_w; + for (int i = 0; i < sd->queued; i++) { + res = hf3fs_prep_io(&ior, &iov, read, vec[i]->xfer_buf, vec[i]->file->fd, vec[i]->offset, vec[i]->xfer_buflen, nullptr); + if (res < 0) { + std::cout << "prep " << res << " " << vec[i]->file->fd << std::endl; + return res; + } + } + res = hf3fs_submit_ios(&ior); + if (res < 0) { + std::cout << "submit " << res << std::endl; + return res; + } + + std::vector cqe(sd->queued); + res = hf3fs_wait_for_ios(&ior, cqe.data(), sd->queued, sd->queued, nullptr); + if (res < 0) { + std::cout << "wait " << res << std::endl; + return res; + } + + for (int i = 0; i < sd->queued; i++) { + if (cqe[i].result < 0) { + std::cout << "cqe error " << res << std::endl; + return res; + } + } + + sd->events = sd->queued; + sd->queued = 0; + + return 0; +} + +static int hf3fs_usrbio_getevents(struct thread_data *td, unsigned int min, unsigned int max, const struct timespec fio_unused *t) { + auto &vec = static_cast(td->io_ops_data)->io_us; + auto *sd = static_cast(td->io_ops_data); + int ret = 0; + if (min) { + ret = sd->events; + sd->events = 0; + } + return ret; +} + +static struct io_u *hf3fs_usrbio_event(struct thread_data *td, int event) { + auto &vec = static_cast(td->io_ops_data)->io_us; + return vec[event]; +} + +static void hf3fs_usrbio_cleanup(struct thread_data *td) { + delete static_cast(td->io_ops_data); +} + +static int hf3fs_usrbio_open(struct thread_data *td, struct fio_file *f) { + int flags = 0; + if (td_write(td)) { + if (!read_only) { + flags = O_RDWR; + } + } else if (td_read(td)) { + if (!read_only) { + flags = O_RDWR; + } else { + flags = O_RDONLY; + } + } + + f->fd = open(f->file_name, flags); + hf3fs_reg_fd(f->fd, 0); + td->o.open_files++; + return 0; +} + +static int hf3fs_usrbio_close(struct thread_data *td, struct fio_file *f) { + hf3fs_dereg_fd(f->fd); + close(f->fd); + f->fd = -1; + return 0; +} + +static int hf3fs_usrbio_alloc(struct thread_data *td, size_t total_mem) { + struct hf3fs_usrbio_options *options = td->eo; + + auto &iov = static_cast(td->io_ops_data)->iov; + auto res = hf3fs_iovcreate(&iov, options->mountpoint, total_mem, 0, -1); + if (res < 0) { + return res; + } + + td->orig_buffer = iov.base; + return 0; +} + +static void hf3fs_usrbio_free(struct thread_data *td) { + auto &iov = static_cast(td->io_ops_data)->iov; + hf3fs_iovdestroy(&iov); +} + +static int hf3fs_invalidate(struct thread_data *td, struct fio_file *f) { + return 0; +} + +extern "C" { + +static struct ioengine_ops ioengine; +void get_ioengine(struct ioengine_ops **ioengine_ptr) { + *ioengine_ptr = &ioengine; + + ioengine.name = "hf3fs_usrbio", + ioengine.version = FIO_IOOPS_VERSION; + ioengine.flags = FIO_NODISKUTIL; + ioengine.init = hf3fs_usrbio_init; + ioengine.queue = hf3fs_usrbio_queue; + ioengine.commit = hf3fs_usrbio_commit; + ioengine.getevents = hf3fs_usrbio_getevents; + ioengine.event = hf3fs_usrbio_event; + ioengine.cleanup = hf3fs_usrbio_cleanup; + ioengine.open_file = hf3fs_usrbio_open; + ioengine.close_file = hf3fs_usrbio_close; + ioengine.invalidate = hf3fs_invalidate; + ioengine.get_file_size = generic_get_file_size; + ioengine.iomem_alloc = hf3fs_usrbio_alloc; + ioengine.iomem_free = hf3fs_usrbio_free; + ioengine.option_struct_size = sizeof(struct hf3fs_usrbio_options); + ioengine.options = options; +} + +} diff --git a/benchmarks/storage_bench/CMakeLists.txt b/benchmarks/storage_bench/CMakeLists.txt new file mode 100644 index 0000000..e43fa9f --- /dev/null +++ b/benchmarks/storage_bench/CMakeLists.txt @@ -0,0 +1 @@ +target_add_bin(storage_bench "StorageBench.cc" test-fabric-lib storage-client storage memory-common follybenchmark gmock fdb mgmtd) diff --git a/benchmarks/storage_bench/StorageBench.cc b/benchmarks/storage_bench/StorageBench.cc new file mode 100644 index 0000000..9085158 --- /dev/null +++ b/benchmarks/storage_bench/StorageBench.cc @@ -0,0 +1,291 @@ +#include "StorageBench.h" + +#include + +#include "common/monitor/Monitor.h" +#include "memory/common/OverrideCppNewDelete.h" + +DEFINE_bool(benchmarkNetwork, false, "Run in network benchmark mode"); +DEFINE_bool(benchmarkStorage, false, "Run in storage benchmark mode"); +DEFINE_bool(ignoreIOError, false, "Ignore all IO errors"); +DEFINE_bool(injectRandomServerError, false, "Inject random server errors"); +DEFINE_bool(injectRandomClientError, false, "Inject random client errors"); +DEFINE_bool(retryPermanentError, false, "Retry requests with permanent errors"); +DEFINE_bool(verifyReadData, false, "Check if the read data are correct"); +DEFINE_bool(verifyReadChecksum, false, "Verify the checksum of read IOs"); +DEFINE_bool(verifyWriteChecksum, true, "Verify the checksum of write IOs"); +DEFINE_bool(randomShuffleChunkIds, false, "Random shuffle generated chunk IDs"); +DEFINE_bool(generateTestData, true, "Generate test data for read test"); +DEFINE_bool(sparseChunkIds, false, "Generate sparse chunk IDs"); +DEFINE_bool(truncateChunks, false, "Truncate chunks"); +DEFINE_bool(cleanupChunks, false, "Clean up (remove) chunks after benchmark"); +DEFINE_bool(cleanupChunksBeforeBench, false, "Clean up (remove) chunks before benchmark"); +DEFINE_bool(serverMode, false, "Run in server mode"); +DEFINE_bool(clientMode, false, "Run in client mode"); +DEFINE_bool(clusterMode, false, "Run in cluster mode (get routing info from mgmtd)"); +DEFINE_bool(printMetrics, false, "Enable printing metrics in logs"); +DEFINE_bool(reportMetrics, false, "Enable reporting metrics to ClickHouse"); +DEFINE_uint32(metaStoreType, 0, "Metadata store type (0=LevelDB, 1=RocksDB, 2=MemDB)"); +DEFINE_uint32(chunkSizeKB, 512, "Chunk size (KB)"); +DEFINE_uint32(chainTableId, 0, "Chain table id"); +DEFINE_uint32(chainTableVersion, 0, "Chain table version"); +DEFINE_string(chainIds, "", "List of chain ids"); +DEFINE_string(storageNodeIds, "", "List of storage node ids"); +DEFINE_uint32(numChains, 1, "Number of chains"); +DEFINE_uint32(numReplicas, 1, "Number of replicas"); +DEFINE_uint32(numStorageNodes, 1, "Number of storage nodes"); +DEFINE_uint32(numChunks, 1, "Number of chunks"); +DEFINE_uint32(readSize, 4096, "Read IO size"); +DEFINE_uint32(writeSize, 131072, "Write IO size"); +DEFINE_uint32(memoryAlignment, 1, "Alignment size of each IO buffer"); +DEFINE_uint32(readOffAlignment, 0, "Alignment size of each read IO offset"); +DEFINE_uint32(batchSize, 1, "Read/write batch size"); +DEFINE_uint32(readBatchSize, 0, "Read batch size"); +DEFINE_uint32(writeBatchSize, 0, "Write batch size"); +DEFINE_uint32(removeBatchSize, 0, "Remove batch size"); +DEFINE_uint32(numReadSecs, 0, "Read test duration"); +DEFINE_uint32(numWriteSecs, 0, "Write test duration"); +DEFINE_uint32(numCoroutines, 1, "Number of coroutines"); +DEFINE_uint32(numTestThreads, 1, "Number of test threads"); +DEFINE_uint32(randSeed, 0, "Random seed for chunk id generation"); +DEFINE_uint32(chunkIdPrefix, 0xFFFF, "The most significant 2 bytes of chunk ids"); +DEFINE_uint32(serviceLevel, 0, "Service level"); +DEFINE_uint32(listenPort, 0, "Listen port"); +DEFINE_uint32(clientTimeoutMS, 30000, "Client timeout (milliseconds)"); +DEFINE_string(dataPaths, folly::fs::temp_directory_path().string(), "Comma or space separated list of paths"); +DEFINE_string(clientConfig, "", "Path of client config"); +DEFINE_string(serverConfig, "", "Path of server config"); +DEFINE_string(statsFilePath, "./perfstats.csv", "Path of performance stats file"); +DEFINE_string(ibvDevices, "mlx5_0,mlx5_1", "Comma or space separated list of ibv devices"); +DEFINE_string(ibnetZones, "", "Comma or space separated list of IB network zones"); +DEFINE_string(clusterId, "stage", "Cluster id used to connect to mgmtd"); +DEFINE_string(mgmtdEndpoints, + "", + "Comma or space separated list of mgmtd endpoints, " + "e.g. 'RDMA://10.1.1.1:1234,RDMA://10.1.1.2:1234'"); +DEFINE_string(storageEndpoints, + "", + "Comma or space separated list of storage ids and endpoints, " + "e.g. '1@RDMA://10.1.1.1:1234,2@RDMA://10.1.1.2:1234'"); +DEFINE_string(monitorEndpoint, "", "Monitor endpoint"); +DEFINE_uint32(defaultPKeyIndex, 1, "IB default pkey index"); + +namespace hf3fs::storage::benchmark { + +using namespace hf3fs::storage::client; + +std::vector stringToIntVec(const std::string &str) { + std::vector vec; + std::vector substrs; + boost::split(substrs, str, boost::is_any_of(", ")); + + for (auto s : substrs) { + boost::trim(s); + if (s.empty()) continue; + + uint32_t n = std::stoul(s); + vec.push_back(n); + } + + return vec; +} + +bool runBenchmarks() { + std::vector dataPathStrs; + boost::split(dataPathStrs, FLAGS_dataPaths, boost::is_any_of(", ")); + + std::vector dataPaths; + dataPaths.reserve(dataPathStrs.size()); + + for (auto str : dataPathStrs) { + boost::trim(str); + if (str.empty()) continue; + + dataPaths.emplace_back(str); + } + + std::vector endpointRawStrs; + boost::split(endpointRawStrs, FLAGS_storageEndpoints, boost::is_any_of(", ")); + + std::map storageEndpoints; + + for (auto str : endpointRawStrs) { + boost::trim(str); + if (str.empty()) continue; + + std::vector nodeEndpointStrs; + boost::split(nodeEndpointStrs, str, boost::is_any_of("@")); + + if (nodeEndpointStrs.size() != 2) { + XLOGF(ERR, "Wrong node endpoint string: {}", str); + return false; + } + + auto nodeIdStr = nodeEndpointStrs[0]; + auto endpointStr = nodeEndpointStrs[1]; + + auto nodeId = (NodeId)std::stoul(nodeIdStr); + auto endpoint = net::Address::fromString(endpointStr); + storageEndpoints[nodeId] = endpoint; + XLOGF(WARN, "Add storage endpoint: {} @ {}", nodeId, endpoint); + } + + if (FLAGS_clientMode && storageEndpoints.empty()) { + XLOGF(ERR, "No storage endpoint specified for client mode"); + return false; + } + + if (FLAGS_readSize > FLAGS_chunkSizeKB * 1024) { + XLOGF(ERR, "Read size {} is greater than chunk size {}", FLAGS_readSize, FLAGS_chunkSizeKB * 1024); + return false; + } + + auto metaStoreType = static_cast(FLAGS_metaStoreType); + + test::SystemSetupConfig setupConfig = { + FLAGS_chunkSizeKB * 1024 /*chunkSize*/, + FLAGS_numChains /*numChains*/, + FLAGS_numReplicas /*numReplicas*/, + FLAGS_numStorageNodes /*numStorageNodes*/, + dataPaths /*dataPaths*/, + FLAGS_clientConfig, + FLAGS_serverConfig, + storageEndpoints, + FLAGS_serviceLevel, + FLAGS_listenPort, + StorageClient::ImplementationType::RPC /*clientImplType*/, + metaStoreType, + true /*useFakeMgmtdClient*/, + !FLAGS_clientMode /*startStorageServer*/, + false, + }; + + std::vector ibvDevices; + boost::split(ibvDevices, FLAGS_ibvDevices, boost::is_any_of(", ")); + + std::vector ibnetZones; + boost::split(ibnetZones, FLAGS_ibnetZones, boost::is_any_of(", ")); + + endpointRawStrs.clear(); + boost::split(endpointRawStrs, FLAGS_mgmtdEndpoints, boost::is_any_of(", ")); + + std::vector mgmtdEndpoints; + + for (auto str : endpointRawStrs) { + boost::trim(str); + if (str.empty()) continue; + + auto endpoint = net::Address::fromString(str); + mgmtdEndpoints.push_back(endpoint); + XLOGF(WARN, "Add mgmtd endpoint: {}", endpoint); + } + + StorageBench::Options benchOptions{FLAGS_numChunks, + FLAGS_readSize, + FLAGS_writeSize, + FLAGS_batchSize, + FLAGS_numReadSecs, + FLAGS_numWriteSecs, + FLAGS_clientTimeoutMS, + FLAGS_numCoroutines, + FLAGS_numTestThreads, + FLAGS_randSeed, + (uint16_t)FLAGS_chunkIdPrefix, + FLAGS_benchmarkNetwork, + FLAGS_benchmarkStorage, + FLAGS_ignoreIOError, + FLAGS_injectRandomServerError, + FLAGS_injectRandomClientError, + FLAGS_retryPermanentError, + FLAGS_verifyReadData, + FLAGS_verifyReadChecksum, + FLAGS_verifyWriteChecksum, + FLAGS_randomShuffleChunkIds, + FLAGS_generateTestData, + FLAGS_sparseChunkIds, + FLAGS_statsFilePath, + ibvDevices, + ibnetZones, + mgmtdEndpoints, + FLAGS_clusterId, + FLAGS_chainTableId, + FLAGS_chainTableVersion, + stringToIntVec(FLAGS_chainIds), + stringToIntVec(FLAGS_storageNodeIds), + FLAGS_memoryAlignment, + FLAGS_readOffAlignment, + FLAGS_defaultPKeyIndex, + FLAGS_readBatchSize, + FLAGS_writeBatchSize, + FLAGS_removeBatchSize}; + + StorageBench bench(setupConfig, benchOptions); + + if (FLAGS_clusterMode) { + if (!bench.connect()) { + XLOGF(WARN, "Failed to connect to cluster"); + return false; + } + } else { + if (!bench.setup()) { + XLOGF(WARN, "Failed to set up benchmark"); + return false; + } + } + + bench.generateChunkIds(); + + if (FLAGS_cleanupChunksBeforeBench) { + bench.cleanup(); + } + + bool runOK = true; + + if (FLAGS_serverMode) { + XLOGF(WARN, "Waiting..."); + while (true) { + ::sleep(1); + } + } else { + runOK = bench.run(); + } + + if (FLAGS_truncateChunks) { + bench.truncate(); + } + + if (FLAGS_cleanupChunks) { + bench.cleanup(); + } + + bench.teardown(); + + return runOK; +} + +} // namespace hf3fs::storage::benchmark + +int main(int argc, char **argv) { + folly::init(&argc, &argv, true); + hf3fs::monitor::Monitor::Config monitorConfig; + + if (FLAGS_printMetrics || FLAGS_reportMetrics) { + if (FLAGS_printMetrics) { + monitorConfig.reporters(0).set_type("log"); + } else if (FLAGS_reportMetrics) { + monitorConfig.reporters(0).set_type("monitor_collector"); + monitorConfig.reporters(0).monitor_collector().set_remote_ip(FLAGS_monitorEndpoint); + monitorConfig.set_reporters_length(1); + } + + auto monitorResult = hf3fs::monitor::Monitor::start(monitorConfig); + XLOGF_IF(FATAL, !monitorResult, "Failed to start monitor: {}", monitorResult.error()); + } + + bool ok = hf3fs::storage::benchmark::runBenchmarks(); + + hf3fs::monitor::Monitor::stop(); + hf3fs::memory::shutdown(); + + return ok ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/benchmarks/storage_bench/StorageBench.h b/benchmarks/storage_bench/StorageBench.h new file mode 100644 index 0000000..b4f4c69 --- /dev/null +++ b/benchmarks/storage_bench/StorageBench.h @@ -0,0 +1,906 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/logging/LogInit.h" +#include "common/net/ib/IBDevice.h" +#include "common/utils/Duration.h" +#include "common/utils/SysResource.h" +#include "tests/lib/UnitTestFabric.h" + +namespace hf3fs::storage::benchmark { + +using namespace hf3fs::storage::client; + +class StorageBench : public test::UnitTestFabric { + public: + struct Options { + const size_t numChunks; + const size_t readSize; + const size_t writeSize; + const size_t batchSize; + const uint64_t numReadSecs; + const uint64_t numWriteSecs; + const uint64_t clientTimeoutMS; + const size_t numCoroutines; + const size_t numTestThreads; + const uint32_t randSeed = 0; + const uint16_t chunkIdPrefix = 0xFFFF; + const bool benchmarkNetwork = false; + const bool benchmarkStorage = false; + const bool ignoreIOError = false; + const bool injectRandomServerError = false; + const bool injectRandomClientError = false; + const bool retryPermanentError = false; + const bool verifyReadData = false; + const bool verifyReadChecksum = false; + const bool verifyWriteChecksum = true; + const bool randomShuffleChunkIds = true; + const bool generateTestData = true; + const bool sparseChunkIds = true; + const std::string statsFilePath = "./perfstats.csv"; + const std::vector ibvDevices = {}; + const std::vector ibnetZones = {}; + const std::vector mgmtdEndpoints = {}; + const std::string clusterId = kClusterId; + const uint32_t chainTableId = 0; + const uint32_t chainTableVersion = 0; + const std::vector chainIds = {}; + const std::vector storageNodeIds = {}; + const size_t memoryAlignment = 1; + const size_t readOffAlignment = 0; + const size_t defaultPKeyIndex = 1; + size_t readBatchSize = 0; + size_t writeBatchSize = 0; + size_t removeBatchSize = 0; + }; + + private: + static constexpr uint32_t kTDigestMaxSize = 1000; + + struct ChunkInfo { + ChainId chainId; + ChunkId chunkId; + size_t size; + }; + + Options benchOptions_; + std::vector writeLatencyDigests_; + std::vector readLatencyDigests_; + folly::CPUThreadPoolExecutor testExecutor_; + std::atomic_uint64_t numWriteBytes_; + std::atomic_uint64_t numReadBytes_; + folly::Random::DefaultGenerator randGen_; + std::vector> chunkInfos_; + std::vector numCreatedChunks_; + size_t totalNumChunks_; + double totalChunkGiB_; + + public: + StorageBench(const test::SystemSetupConfig &setupConfig, const Options &options) + : UnitTestFabric(setupConfig), + benchOptions_(options), + writeLatencyDigests_(benchOptions_.numCoroutines, folly::TDigest(kTDigestMaxSize)), + readLatencyDigests_(benchOptions_.numCoroutines, folly::TDigest(kTDigestMaxSize)), + testExecutor_(benchOptions_.numTestThreads), + numWriteBytes_(0), + numReadBytes_(0), + randGen_(folly::Random::create()), + chunkInfos_(benchOptions_.numCoroutines), + numCreatedChunks_(benchOptions_.numCoroutines) { + if (benchOptions_.readBatchSize == 0) benchOptions_.readBatchSize = benchOptions_.batchSize; + if (benchOptions_.writeBatchSize == 0) benchOptions_.writeBatchSize = benchOptions_.batchSize; + if (benchOptions_.removeBatchSize == 0) benchOptions_.removeBatchSize = benchOptions_.batchSize; + } + + void generateChunkIds() { + static_assert(sizeof(benchOptions_.chunkIdPrefix) == 2); + uint64_t chunkIdPrefix64 = ((uint64_t)benchOptions_.chunkIdPrefix) << (UINT64_WIDTH - UINT16_WIDTH); + std::sort(chainIds_.begin(), chainIds_.end()); + static thread_local std::mt19937 generator; + randGen_.seed(benchOptions_.randSeed); + + XLOGF(WARN, + "Generating {} chunk ids with prefix {:08X} and random seed {}...", + totalNumChunks_, + chunkIdPrefix64, + benchOptions_.randSeed); + + for (auto &chunkInfos : chunkInfos_) { + uint64_t instancePrefix = chunkIdPrefix64 | folly::Random::rand64(randGen_); + XLOGF(DBG3, "Random chunk id prefix {:08X}", instancePrefix); + + chunkInfos.reserve(chainIds_.size() * benchOptions_.numChunks); + + for (auto chainId : chainIds_) { + for (size_t chunkIndex = 0; chunkIndex < benchOptions_.numChunks; chunkIndex++) { + if (benchOptions_.sparseChunkIds) { + uint64_t chunkIdHigh = chunkIdPrefix64 | (folly::Random::rand64(randGen_) & 0x000000FFFFFFFFFF); + uint64_t chunkIdLow = (folly::Random::rand64(randGen_) << UINT32_WIDTH) + chunkIndex; + chunkInfos.push_back({chainId, ChunkId(chunkIdHigh, chunkIdLow), 0}); + } else { + chunkInfos.push_back({chainId, ChunkId(instancePrefix, chunkIndex), 0}); + } + } + } + + if (benchOptions_.randomShuffleChunkIds) std::shuffle(chunkInfos.begin(), chunkInfos.end(), generator); + } + } + + bool connect() { + XLOGF(INFO, "Start to connect..."); + + if (!setupIBSock()) { + return false; + } + + mgmtdClientConfig_.set_mgmtd_server_addresses(benchOptions_.mgmtdEndpoints); + mgmtdClientConfig_.set_enable_auto_refresh(true); + mgmtdClientConfig_.set_enable_auto_heartbeat(false); + mgmtdClientConfig_.set_enable_auto_extend_client_session(true); + mgmtdClientConfig_.set_auto_refresh_interval(3_s); + mgmtdClientConfig_.set_auto_heartbeat_interval(3_s); + mgmtdClientConfig_.set_auto_extend_client_session_interval(3_s); + mgmtdClientConfig_.set_accept_incomplete_routing_info_during_mgmtd_bootstrapping(false); + + if (!client_.start()) { + XLOGF(ERR, "Failed to start net client for mgmtd client"); + return false; + } + + XLOGF(INFO, "Creating mgmtd client..."); + + auto stubFactory = std::make_unique>( + stubs::ClientContextCreator{[this](net::Address addr) { return client_.serdeCtx(addr); }}); + auto mgmtdClient = std::make_unique(benchOptions_.clusterId, + std::move(stubFactory), + mgmtdClientConfig_); + + auto physicalHostnameRes = SysResource::hostname(/*physicalMachineName=*/true); + if (!physicalHostnameRes) { + XLOGF(ERR, "getHostname(true) failed: {}", physicalHostnameRes.error()); + return false; + } + + auto containerHostnameRes = SysResource::hostname(/*physicalMachineName=*/false); + if (!containerHostnameRes) { + XLOGF(ERR, "getHostname(false) failed: {}", containerHostnameRes.error()); + return false; + } + + mgmtdClient->setClientSessionPayload({clientId_.uuid.toHexString(), + flat::NodeType::CLIENT, + flat::ClientSessionData::create( + /*universalId=*/*physicalHostnameRes, + /*description=*/fmt::format("StorageBench: {}", *containerHostnameRes), + /*serviceGroups=*/std::vector{}, + flat::ReleaseVersion::fromVersionInfo()), + flat::UserInfo{}}); + folly::coro::blockingWait(mgmtdClient->start(&client_.tpg().bgThreadPool().randomPick())); + mgmtdForClient_ = std::move(mgmtdClient); + + // get routing info + + for (size_t retry = 0; retry < 15; retry++) { + auto routingInfo = mgmtdForClient_->getRoutingInfo(); + + if (routingInfo == nullptr || routingInfo->raw()->chains.empty()) { + XLOGF(WARN, "Empty routing info, #{} retry...", retry + 1); + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + } else { + for (const auto &[tableId, tableVersions] : routingInfo->raw()->chainTables) { + if (tableId == benchOptions_.chainTableId) { + if (tableVersions.empty()) { + XLOGF(WARN, "No version found for chain table with id {}", tableId); + return false; + } + + XLOGF(INFO, "Found {} version(s) of chain table {}", tableVersions.size(), benchOptions_.chainTableId); + + flat::ChainTable chainTable; + + if (benchOptions_.chainTableVersion > 0) { + flat::ChainTableVersion tableVersion(benchOptions_.chainTableVersion); + auto tableIter = tableVersions.find(tableVersion); + + if (tableIter == tableVersions.end()) { + XLOGF(WARN, "Version {} not found in chain table with id {}", tableVersion, tableId); + return false; + } + + chainTable = tableIter->second; + XLOGF(INFO, + "Found version {} of chain table {}: {}", + benchOptions_.chainTableVersion, + benchOptions_.chainTableId, + chainTable.chainTableVersion); + } else { + const auto iter = --tableVersions.cend(); + const auto &latestTable = iter->second; + chainTable = latestTable; + XLOGF(INFO, + "Found latest version of chain table {}: {}", + benchOptions_.chainTableId, + chainTable.chainTableVersion); + } + + XLOGF(WARN, + "Selected chain table: {}@{} [{}] {} chains", + chainTable.chainTableId, + chainTable.chainTableVersion, + chainTable.desc, + chainTable.chains.size()); + + if (!benchOptions_.storageNodeIds.empty()) { + for (const auto &chainId : chainTable.chains) { + const auto chainInfo = routingInfo->raw()->getChain(chainId); + for (const auto &target : chainInfo->targets) { + const auto targetInfo = routingInfo->raw()->getTarget(target.targetId); + auto nodeIter = std::find(benchOptions_.storageNodeIds.begin(), + benchOptions_.storageNodeIds.end(), + *targetInfo->nodeId); + if (nodeIter != benchOptions_.storageNodeIds.end()) { + chainIds_.push_back(chainId); + break; + } + } + } + } else if (!benchOptions_.chainIds.empty()) { + for (const auto &chainId : chainTable.chains) { + auto chainIter = std::find(benchOptions_.chainIds.begin(), benchOptions_.chainIds.end(), chainId); + if (chainIter != benchOptions_.chainIds.end()) { + chainIds_.push_back(chainId); + } + } + } else { + chainIds_ = chainTable.chains; + } + + break; + } + } + + if (!chainIds_.empty()) break; + } + } + + if (chainIds_.empty()) { + XLOGF(ERR, "Failed to get chain table with id {}", benchOptions_.chainTableId); + return false; + } else { + XLOGF(WARN, "Selected {} replication chains for benchmark", chainIds_.size()); + } + + // create storage client + + if (setupConfig_.client_config().empty()) { + XLOGF(ERR, "Storage client config not specified"); + return false; + } + + auto configRes = clientConfig_.atomicallyUpdate(setupConfig_.client_config(), false /*isHotUpdate*/); + if (!configRes) { + XLOGF(ERR, "Cannot load client config from {}, error: {}", setupConfig_.client_config(), configRes.error()); + return false; + } + + totalNumChunks_ = chainIds_.size() * benchOptions_.numCoroutines * benchOptions_.numChunks; + totalChunkGiB_ = (double)totalNumChunks_ * setupConfig_.chunk_size() / 1_GB; + clientConfig_.retry().set_max_retry_time(Duration(std::chrono::milliseconds(benchOptions_.clientTimeoutMS))); + clientConfig_.net_client().io_worker().ibsocket().set_sl(setupConfig_.service_level()); + + XLOGF(INFO, "Creating storage client..."); + storageClient_ = client::StorageClient::create(clientId_, clientConfig_, *mgmtdForClient_); + + return true; + } + + bool setupIBSock() { + XLOGF(WARN, "Setting up IB socket..."); + + std::vector subnets; + + for (const auto &ibnetZoneStr : benchOptions_.ibnetZones) { + std::vector ibnetZoneSubnet; + boost::split(ibnetZoneSubnet, ibnetZoneStr, boost::is_any_of(":")); + + if (ibnetZoneSubnet.size() != 2) { + XLOGF(CRITICAL, "Invalid IB zone subnet: {}", ibnetZoneStr); + return false; + } + + auto zone = boost::trim_copy(ibnetZoneSubnet[0]); + auto subnet = boost::trim_copy(ibnetZoneSubnet[1]); + + if (zone.empty() || subnet.empty()) { + XLOGF(CRITICAL, "Invalid IB zone subnet: {}", ibnetZoneStr); + return false; + } + + subnets.emplace_back(); + subnets.back().set_network_zones({zone}); + subnets.back().set_subnet(*net::IBConfig::Network::from(subnet)); + XLOGF(WARN, "Add IB network zone: {} -- {}", zone, subnet); + } + + net::IBConfig ibConfig; + ibConfig.set_subnets(subnets); + ibConfig.set_allow_unknown_zone(false); + ibConfig.set_default_network_zone("$HF3FS_NETWORK_ZONE"); + ibConfig.set_device_filter(benchOptions_.ibvDevices); + ibConfig.set_default_pkey_index(benchOptions_.defaultPKeyIndex); + + auto ibResult = net::IBManager::start(ibConfig); + if (ibResult.hasError()) { + XLOGF(CRITICAL, "Cannot initialize IB device: {}", ibResult.error()); + return false; + } + + return true; + } + + bool setup() { + XLOGF(WARN, "Setting up benchmark..."); + + if (!setupIBSock()) { + return false; + } + + bool ok = setUpStorageSystem(); + + totalNumChunks_ = chainIds_.size() * benchOptions_.numCoroutines * benchOptions_.numChunks; + totalChunkGiB_ = (double)totalNumChunks_ * setupConfig_.chunk_size() / 1_GB; + clientConfig_.retry().set_max_retry_time(Duration(std::chrono::milliseconds(benchOptions_.clientTimeoutMS))); + + return ok; + } + + void teardown() { + tearDownStorageSystem(); + net::IBManager::stop(); + } + + void printThroughput(hf3fs::SteadyClock::duration elapsedMicro, double totalGiB) { + auto elapsedMilli = std::chrono::duration_cast(elapsedMicro); + double throughput = totalGiB / (elapsedMilli.count() / 1000.0); + XLOGF(WARN, "Average throughput: {:.3f}GiB/s, total {:.3f} GiB", throughput, totalGiB); + } + + void printLatencyDigest(const folly::TDigest &digest) { + XLOGF(WARN, "latency summary ({} samples)", digest.count()); + XLOGF(WARN, "min: {:10.1f}us", digest.min()); + XLOGF(WARN, "max: {:10.1f}us", digest.max()); + XLOGF(WARN, "avg: {:10.1f}us", digest.mean()); + for (double p : {0.1, 0.2, 0.5, 0.9, 0.95, 0.99}) { + XLOGF(WARN, "{}%: {:10.1f}us", p * 100.0, digest.estimateQuantile(p)); + } + } + + void dumpPerfStats(const std::string &testName, + const folly::TDigest &digest, + hf3fs::SteadyClock::duration elapsedTime, + double totalGiB, + bool readIO) { + if (benchOptions_.statsFilePath.empty()) return; + + boost::filesystem::path outFilePath(benchOptions_.statsFilePath); + + if (!boost::filesystem::exists(outFilePath) || boost::filesystem::is_empty(outFilePath)) { + XLOGF(INFO, "Create a file for perfermance stats at {}", outFilePath); + std::ofstream outFile(outFilePath); + if (!outFile) { + throw std::runtime_error("Failed to open file: " + outFilePath.string()); + } + + outFile << "test name,#storages,#chains,#replicas,concurrency,batch size," + "io size (bytes),effective batch size (batch size / #replicas),elapsed time (us)," + "QPS,IOPS,bandwidth (MB/s),latency samples,min latency (us),max latency (us),avg latency (us)," + "latency P50 (us),latency P75 (us),latency P90 (us),latency P95 (us),latency P99 (us)\n"; + + if (!outFile) { + throw std::runtime_error("Failed to write to file: " + outFilePath.string()); + } + + outFile.close(); + } + + auto elapsedMicro = std::chrono::duration_cast(elapsedTime); + double bandwidthMBps = totalGiB * 1024.0 / (elapsedMicro.count() / 1'000'000.0); + size_t ioSize = readIO ? benchOptions_.readSize : benchOptions_.writeSize; + size_t batchSize = readIO ? benchOptions_.readBatchSize : benchOptions_.writeBatchSize; + double iops = bandwidthMBps * 1024.0 * 1024.0 / ioSize; + double qps = bandwidthMBps * 1024.0 * 1024.0 / (batchSize * ioSize); + + boost::filesystem::ofstream fout(outFilePath, std::ios_base::app); + + fout << fmt::format("{},{},{},{},{},{},{},{:.1f},{},{:.1f},{:.1f},{:.3f},{},{:.1f},{:.1f},{:.1f}", + testName, + setupConfig_.num_storage_nodes(), + setupConfig_.num_chains(), + setupConfig_.num_replicas(), + benchOptions_.numCoroutines, + batchSize, + ioSize, + double(batchSize) / setupConfig_.num_storage_nodes(), + elapsedMicro.count(), + qps, + iops, + bandwidthMBps, + digest.count(), + digest.min(), + digest.max(), + digest.mean()); + + for (double p : {0.5, 0.75, 0.9, 0.95, 0.99}) { + fout << fmt::format(",{:.1f}", digest.estimateQuantile(p)); + } + + fout << "\n"; + fout.close(); + } + + CoTask batchWrite(uint32_t instanceId, size_t writeBatchSize, size_t writeSize, uint32_t numWriteSecs) { + // create an aligned memory block + size_t memoryBlockSize = ALIGN_UPPER(setupConfig_.chunk_size(), benchOptions_.memoryAlignment); + auto memoryBlock = (uint8_t *)folly::aligned_malloc(memoryBlockSize, sysconf(_SC_PAGESIZE)); + auto deleter = [](uint8_t *ptr) { folly::aligned_free(ptr); }; + std::unique_ptr memoryBlockPtr(memoryBlock, deleter); + std::memset(memoryBlock, 0xFF, memoryBlockSize); + + if (benchOptions_.verifyReadData) { + for (size_t byteIndex = 0; byteIndex < memoryBlockSize; byteIndex++) { + memoryBlock[byteIndex] = byteIndex; + } + } + + // register a block of memory + auto regRes = storageClient_->registerIOBuffer(memoryBlock, memoryBlockSize); + + if (regRes.hasError()) { + co_return regRes.error().code(); + } + + // create write IOs + + auto ioBuffer = std::move(*regRes); + + WriteOptions options; + options.set_enableChecksum(benchOptions_.verifyWriteChecksum); + options.debug().set_bypass_disk_io(benchOptions_.benchmarkNetwork); + options.debug().set_bypass_rdma_xmit(benchOptions_.benchmarkStorage); + options.debug().set_inject_random_server_error(benchOptions_.injectRandomServerError); + options.debug().set_inject_random_client_error(benchOptions_.injectRandomClientError); + options.retry().set_retry_permanent_error(benchOptions_.retryPermanentError); + + std::vector elapsedMicroSecs; + uint64_t numWriteBytes = 0; + + std::vector writeIOs; + writeIOs.reserve(writeBatchSize); + + auto benchStart = hf3fs::SteadyClock::now(); + std::vector &chunkInfos = chunkInfos_[instanceId]; + size_t &numCreatedChunks = numCreatedChunks_[instanceId]; + size_t seqChunkIndex = 0; + + while (true) { + if (numWriteSecs) { + auto accumElapsedSecs = + std::chrono::duration_cast(hf3fs::SteadyClock::now() - benchStart); + if (accumElapsedSecs >= std::chrono::seconds(numWriteSecs)) break; + } else { + if (numCreatedChunks >= chunkInfos.size()) break; + } + + writeIOs.clear(); + + for (size_t writeIndex = 0; writeIndex < writeBatchSize; writeIndex++) { + auto &[chainId, chunkId, chunkSize] = chunkInfos[seqChunkIndex++ % chunkInfos.size()]; + size_t writeOffset = 0; + size_t writeLength = 0; + + if (chunkSize < setupConfig_.chunk_size()) { + writeOffset = chunkSize; + writeLength = std::min(writeSize, setupConfig_.chunk_size() - writeOffset); + chunkSize += writeLength; + numCreatedChunks += chunkSize == setupConfig_.chunk_size(); + } else { + writeOffset = folly::Random::rand32(0, setupConfig_.chunk_size() - writeSize); + writeLength = writeSize; + } + + auto writeIO = storageClient_->createWriteIO(chainId, + chunkId, + writeOffset, + writeLength, + setupConfig_.chunk_size(), + &memoryBlock[writeOffset], + &ioBuffer); + writeIOs.push_back(std::move(writeIO)); + numWriteBytes += writeLength; + } + + auto rpcStart = hf3fs::SteadyClock::now(); + + co_await storageClient_->batchWrite(writeIOs, flat::UserInfo(), options); + + auto elapsedMicro = std::chrono::duration_cast(hf3fs::SteadyClock::now() - rpcStart); + elapsedMicroSecs.push_back(elapsedMicro.count()); + + if (!benchOptions_.ignoreIOError) { + for (const auto &writeIO : writeIOs) { + if (writeIO.result.lengthInfo.hasError()) { + XLOGF(ERR, "Error in write result: {}", writeIO.result); + co_return writeIO.result.lengthInfo.error().code(); + } + if (writeIO.length != *writeIO.result.lengthInfo) { + XLOGF(ERR, "Unexpected write length: {} != {}", *writeIO.result.lengthInfo, writeIO.length); + co_return StorageClientCode::kRemoteIOError; + } + } + } + } + + folly::TDigest digest; + writeLatencyDigests_[instanceId] = digest.merge(elapsedMicroSecs); + numWriteBytes_ += numWriteBytes; + + co_return StatusCode::kOK; + } + + CoTask batchRead(uint32_t instanceId) { + // create an aligned memory block + size_t alignedBufSize = ALIGN_UPPER(std::max(size_t(1), benchOptions_.readSize), benchOptions_.memoryAlignment); + size_t memoryBlockSize = alignedBufSize * benchOptions_.readBatchSize; + auto memoryBlock = (uint8_t *)folly::aligned_malloc(memoryBlockSize, sysconf(_SC_PAGESIZE)); + auto deleter = [](uint8_t *ptr) { folly::aligned_free(ptr); }; + std::unique_ptr memoryBlockPtr(memoryBlock, deleter); + std::memset(memoryBlock, 0, memoryBlockSize); + + // register a block of memory + auto regRes = storageClient_->registerIOBuffer(memoryBlock, memoryBlockSize); + + if (regRes.hasError()) { + co_return regRes.error().code(); + } + + std::vector expectedChunkData(setupConfig_.chunk_size()); + + if (benchOptions_.verifyReadData) { + for (size_t byteIndex = 0; byteIndex < expectedChunkData.size(); byteIndex++) { + expectedChunkData[byteIndex] = byteIndex; + } + } + + // create read IOs + + auto ioBuffer = std::move(*regRes); + + ReadOptions options; + options.set_enableChecksum(benchOptions_.verifyReadChecksum); + options.debug().set_bypass_disk_io(benchOptions_.benchmarkNetwork); + options.debug().set_bypass_rdma_xmit(benchOptions_.benchmarkStorage); + options.debug().set_inject_random_server_error(benchOptions_.injectRandomServerError); + options.debug().set_inject_random_client_error(benchOptions_.injectRandomClientError); + options.retry().set_retry_permanent_error(benchOptions_.retryPermanentError); + + std::vector elapsedMicroSecs; + uint64_t numReadBytes = 0; + size_t offsetAlignment = + benchOptions_.readOffAlignment ? benchOptions_.readOffAlignment : std::max(size_t(1), benchOptions_.readSize); + + std::vector readIOs; + readIOs.reserve(benchOptions_.readBatchSize); + + auto benchStart = hf3fs::SteadyClock::now(); + std::vector &chunkInfos = chunkInfos_[instanceId]; + + while (true) { + auto accumElapsedSecs = std::chrono::duration_cast(hf3fs::SteadyClock::now() - benchStart); + if (accumElapsedSecs >= std::chrono::seconds(benchOptions_.numReadSecs)) break; + + readIOs.clear(); + + for (size_t readIndex = 0; readIndex < benchOptions_.readBatchSize; readIndex++) { + uint64_t randChunkIndex = folly::Random::rand64(0, chunkInfos.size()); + const auto &[chainId, chunkId, chunkSize] = chunkInfos[randChunkIndex]; + uint32_t offset = folly::Random::rand32(0, setupConfig_.chunk_size() - benchOptions_.readSize); + uint32_t alignedOffset = ALIGN_LOWER(offset, offsetAlignment); + auto readIO = storageClient_->createReadIO(chainId, + chunkId, + alignedOffset /*offset*/, + benchOptions_.readSize /*length*/, + &memoryBlock[readIndex * alignedBufSize], + &ioBuffer); + readIOs.push_back(std::move(readIO)); + numReadBytes += benchOptions_.readSize; + } + + auto rpcStart = hf3fs::SteadyClock::now(); + + co_await storageClient_->batchRead(readIOs, flat::UserInfo(), options); + + auto elapsedMicro = std::chrono::duration_cast(hf3fs::SteadyClock::now() - rpcStart); + elapsedMicroSecs.push_back(elapsedMicro.count()); + + if (!benchOptions_.ignoreIOError) { + for (const auto &readIO : readIOs) { + if (readIO.result.lengthInfo.hasError()) { + XLOGF(ERR, "Error in read result: {}", readIO.result); + co_return readIO.result.lengthInfo.error().code(); + } + if (readIO.length != *readIO.result.lengthInfo) { + XLOGF(ERR, "Unexpected read length: {} != {}", *readIO.result.lengthInfo, readIO.length); + co_return StorageClientCode::kRemoteIOError; + } + } + } + + if (benchOptions_.verifyReadData) { + for (const auto &readIO : readIOs) { + auto diffPos = std::mismatch(&readIO.data[0], &readIO.data[readIO.length], &expectedChunkData[readIO.offset]); + uint32_t byteIndex = diffPos.first - &readIO.data[0]; + if (byteIndex < readIO.length) { + XLOGF(ERR, + "Wrong data at bytes index {} and chunk offset {}: data {:#x} != expected {:#x}", + byteIndex, + readIO.offset + byteIndex, + *diffPos.first, + *diffPos.second); + co_return StorageClientCode::kFoundBug; + } + } + } + } + + folly::TDigest digest; + readLatencyDigests_[instanceId] = digest.merge(elapsedMicroSecs); + numReadBytes_ += numReadBytes; + + co_return StatusCode::kOK; + } + + uint32_t generateChunks() { + XLOGF(WARN, "Generating {} test chunks ({:.3f} GiB)...", totalNumChunks_, totalChunkGiB_); + + auto testStart = hf3fs::SteadyClock::now(); + std::vector> writeTasks; + numWriteBytes_ = 0; + + size_t writeBatchSize = + std::max(benchOptions_.writeBatchSize, + clientConfig_.traffic_control().write().max_concurrent_requests() / benchOptions_.numCoroutines); + + for (size_t instanceId = 0; instanceId < benchOptions_.numCoroutines; instanceId++) { + writeTasks.push_back(batchWrite(instanceId, writeBatchSize, setupConfig_.chunk_size(), 0 /*numWriteSecs*/) + .scheduleOn(folly::Executor::getKeepAliveToken(testExecutor_)) + .start()); + } + + auto results = folly::coro::blockingWait(folly::coro::collectAllRange(std::move(writeTasks))); + + for (auto res : results) { + if (res != StatusCode::kOK) { + XLOGF(WARN, "Test task failed with status code: {}", res); + return res; + } + } + + auto elapsedTime = hf3fs::SteadyClock::now() - testStart; + double totalGiB = (double)numWriteBytes_ / 1_GB; + printThroughput(elapsedTime, totalGiB); + + auto mergedDigest = folly::TDigest::merge(writeLatencyDigests_); + printLatencyDigest(mergedDigest); + + return StatusCode::kOK; + } + + uint32_t runWriteBench() { + XLOGF(WARN, + "Running write benchmark ({} secs, {} chunks, {:.3f} GiB)...", + benchOptions_.numWriteSecs, + totalNumChunks_, + totalChunkGiB_); + + auto testStart = hf3fs::SteadyClock::now(); + std::vector> writeTasks; + numWriteBytes_ = 0; + + for (size_t instanceId = 0; instanceId < benchOptions_.numCoroutines; instanceId++) { + writeTasks.push_back( + batchWrite(instanceId, benchOptions_.writeBatchSize, benchOptions_.writeSize, benchOptions_.numWriteSecs) + .scheduleOn(folly::Executor::getKeepAliveToken(testExecutor_)) + .start()); + } + + auto results = folly::coro::blockingWait(folly::coro::collectAllRange(std::move(writeTasks))); + + for (auto res : results) { + if (res != StatusCode::kOK) { + XLOGF(WARN, "Test task failed with status code: {}", res); + return res; + } + } + + auto elapsedTime = hf3fs::SteadyClock::now() - testStart; + double totalGiB = (double)numWriteBytes_ / 1_GB; + printThroughput(elapsedTime, totalGiB); + + auto mergedDigest = folly::TDigest::merge(writeLatencyDigests_); + printLatencyDigest(mergedDigest); + + dumpPerfStats("batch write", mergedDigest, elapsedTime, totalGiB, false /*readIO*/); + + return StatusCode::kOK; + } + + uint32_t runReadBench() { + XLOGF(WARN, "Running read benchmark ({} secs)...", benchOptions_.numReadSecs); + + auto testStart = hf3fs::SteadyClock::now(); + std::vector> readTasks; + numReadBytes_ = 0; + + for (size_t instanceId = 0; instanceId < benchOptions_.numCoroutines; instanceId++) { + readTasks.push_back(batchRead(instanceId).scheduleOn(folly::Executor::getKeepAliveToken(testExecutor_)).start()); + } + + auto results = folly::coro::blockingWait(folly::coro::collectAllRange(std::move(readTasks))); + + for (auto res : results) { + if (res != StatusCode::kOK) { + XLOGF(WARN, "Test task failed with status code: {}", res); + return res; + } + } + + auto elapsedTime = hf3fs::SteadyClock::now() - testStart; + double totalGiB = (double)numReadBytes_ / 1_GB; + printThroughput(elapsedTime, totalGiB); + + auto mergedDigest = folly::TDigest::merge(readLatencyDigests_); + printLatencyDigest(mergedDigest); + + dumpPerfStats("batch read", mergedDigest, elapsedTime, totalGiB, false /*readIO*/); + + return StatusCode::kOK; + } + + uint32_t cleanup() { + XLOGF(WARN, "Clean up chunks..."); + + std::vector> removeTasks; + + for (size_t instanceId = 0; instanceId < benchOptions_.numCoroutines; instanceId++) { + auto batchRemove = [this](size_t instanceId) -> folly::coro::Task { + std::vector removeOps; + size_t totalNumChunksRemoved = 0; + + for (const auto &[chainId, chunkId, chunkSize] : chunkInfos_[instanceId]) { + removeOps.push_back(storageClient_->createRemoveOp(chainId, chunkId, ChunkId(chunkId, 1))); + + if (removeOps.size() >= benchOptions_.removeBatchSize) { + WriteOptions options; + options.debug().set_inject_random_server_error(benchOptions_.injectRandomServerError); + options.debug().set_inject_random_client_error(benchOptions_.injectRandomClientError); + options.retry().set_retry_permanent_error(benchOptions_.retryPermanentError); + + co_await storageClient_->removeChunks(removeOps, flat::UserInfo(), options); + + for (const auto &removeOp : removeOps) { + if (removeOp.result.statusCode.hasError()) { + XLOGF(WARN, "Remove operation failed with error: {}", removeOp.result.statusCode.error()); + co_return removeOp.result.statusCode.error().code(); + } + + XLOGF_IF(DBG5, + removeOp.result.numChunksRemoved != 1, + "{} chunks removed in range {}", + removeOp.result.numChunksRemoved, + removeOp.chunkRange()); + totalNumChunksRemoved += removeOp.result.numChunksRemoved; + } + + removeOps.clear(); + } + } + + XLOGF(WARN, "{} chunks removed by instance #{}", totalNumChunksRemoved, instanceId); + co_return StatusCode::kOK; + }; + + removeTasks.push_back( + batchRemove(instanceId).scheduleOn(folly::Executor::getKeepAliveToken(testExecutor_)).start()); + } + + auto results = folly::coro::blockingWait(folly::coro::collectAllRange(std::move(removeTasks))); + + for (auto res : results) { + if (res != StatusCode::kOK) { + XLOGF(WARN, "Test task failed with status code: {}", res); + return res; + } + } + + return StatusCode::kOK; + }; + + uint32_t truncate() { + XLOGF(WARN, "Truncate chunks..."); + + std::vector> truncateTasks; + + for (size_t instanceId = 0; instanceId < benchOptions_.numCoroutines; instanceId++) { + auto batchTruncate = [this](size_t instanceId) -> folly::coro::Task { + std::vector truncateOps; + + for (const auto &[chainId, chunkId, chunkSize] : chunkInfos_[instanceId]) { + truncateOps.push_back(storageClient_->createTruncateOp(chainId, chunkId, 0, setupConfig_.chunk_size())); + + if (truncateOps.size() >= benchOptions_.writeBatchSize) { + WriteOptions options; + options.debug().set_inject_random_server_error(benchOptions_.injectRandomServerError); + options.debug().set_inject_random_client_error(benchOptions_.injectRandomClientError); + options.retry().set_retry_permanent_error(benchOptions_.retryPermanentError); + + co_await storageClient_->truncateChunks(truncateOps, flat::UserInfo(), options); + + for (const auto &truncateOp : truncateOps) { + if (truncateOp.result.lengthInfo.hasError()) { + XLOGF(WARN, "Truncate operation failed with error: {}", truncateOp.result.lengthInfo.error()); + co_return truncateOp.result.lengthInfo.error().code(); + } + } + + truncateOps.clear(); + } + } + + co_return StatusCode::kOK; + }; + + truncateTasks.push_back( + batchTruncate(instanceId).scheduleOn(folly::Executor::getKeepAliveToken(testExecutor_)).start()); + } + + auto results = folly::coro::blockingWait(folly::coro::collectAllRange(std::move(truncateTasks))); + + for (auto res : results) { + if (res != StatusCode::kOK) { + XLOGF(WARN, "Test task failed with status code: {}", res); + return res; + } + } + + return StatusCode::kOK; + }; + + bool run() { + if (benchOptions_.numWriteSecs > 0) + if (runWriteBench() != StatusCode::kOK) return false; + if (benchOptions_.generateTestData) + if (generateChunks() != StatusCode::kOK) return false; + if (benchOptions_.numReadSecs > 0) + if (runReadBench() != StatusCode::kOK) return false; + return true; + } + + uint64_t getWriteBytes() { return numWriteBytes_; } + + uint64_t getReadBytes() { return numReadBytes_; } +}; + +} // namespace hf3fs::storage::benchmark diff --git a/cmake/AddCrate.cmake b/cmake/AddCrate.cmake new file mode 100644 index 0000000..3fdbcf1 --- /dev/null +++ b/cmake/AddCrate.cmake @@ -0,0 +1,33 @@ +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CARGO_CMD cargo build) + set(TARGET_DIR "debug") +else () + set(CARGO_CMD cargo build --release) + set(TARGET_DIR "release") +endif () + +add_custom_target( + cargo_build_all ALL + COMMAND ${CARGO_CMD} + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" +) + +macro(add_crate NAME) + set(LIBRARY "${PROJECT_SOURCE_DIR}/target/${TARGET_DIR}/lib${NAME}.a") + set(SOURCES + "${PROJECT_SOURCE_DIR}/target/cxxbridge/${NAME}/src/cxx.rs.h" + "${PROJECT_SOURCE_DIR}/target/cxxbridge/${NAME}/src/cxx.rs.cc" + ) + + add_custom_command( + OUTPUT ${SOURCES} ${LIBRARY} + COMMAND ${CARGO_CMD} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${NAME}" + ) + + add_library(${NAME} STATIC ${SOURCES} ${LIBRARY}) + target_link_libraries(${NAME} pthread dl ${LIBRARY}) + target_include_directories(${NAME} PUBLIC "${PROJECT_SOURCE_DIR}/target/cxxbridge") + target_compile_options(${NAME} PUBLIC -Wno-dollar-in-identifier-extension) + add_dependencies(${NAME} cargo_build_all) +endmacro() diff --git a/cmake/ApacheArrow.cmake b/cmake/ApacheArrow.cmake new file mode 100644 index 0000000..7ff1140 --- /dev/null +++ b/cmake/ApacheArrow.cmake @@ -0,0 +1,61 @@ +add_library(apache_arrow_static INTERFACE) +add_library(arrow_static STATIC IMPORTED) +add_library(parquet_static STATIC IMPORTED) +add_library(arrow_dependencies STATIC IMPORTED) + +set(PREFIX "${CMAKE_CURRENT_BINARY_DIR}") +set(ARROW_RELEASE_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/src/apache-arrow-cpp/cpp/build/release") + +# https://cmake.org/cmake/help/latest/policy/CMP0097.html +# Starting with CMake 3.16, explicitly setting GIT_SUBMODULES to an empty string +# means no submodules will be initialized or updated. +cmake_policy(SET CMP0097 NEW) + +if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) + set(ARROW_BUILD_PARALLEL "") +else() + set(ARROW_BUILD_PARALLEL "-j8") +endif() + +include(ExternalProject) +ExternalProject_Add( + apache-arrow-cpp + PREFIX ${PREFIX} + GIT_REPOSITORY https://github.com/apache/arrow.git + GIT_TAG b7d2f7ffca66c868bd2fce5b3749c6caa002a7f0 + GIT_SHALLOW ON + GIT_PROGRESS ON + GIT_SUBMODULES "" + SOURCE_SUBDIR "cpp" + BUILD_IN_SOURCE ON + INSTALL_DIR ${PREFIX} + CONFIGURE_COMMAND bash -x -c "\ + ( cd thirdparty && [[ -f export.sh ]] || ./download_dependencies.sh | tee export.sh ) && \ + source thirdparty/export.sh && cmake -S . -B . \ + -DCMAKE_BUILD_TYPE=Release \ + -DARROW_USE_CCACHE=OFF \ + -DARROW_USE_SCCACHE=OFF \ + -DARROW_DEPENDENCY_SOURCE=BUNDLED \ + -DARROW_BUILD_STATIC=ON \ + -DARROW_JEMALLOC=ON \ + -DARROW_SIMD_LEVEL=DEFAULT \ + -DARROW_BUILD_EXAMPLES=OFF \ + -DARROW_PARQUET=ON -DARROW_CSV=ON \ + -DARROW_WITH_ZSTD=ON -DARROW_WITH_LZ4=ON -DARROW_WITH_ZLIB=ON" + BUILD_COMMAND bash -x -c "source thirdparty/export.sh && cmake --build . ${ARROW_BUILD_PARALLEL}" + BUILD_JOB_SERVER_AWARE 1 + INSTALL_COMMAND cmake --install . --prefix "${PREFIX}" + BUILD_BYPRODUCTS + "${ARROW_RELEASE_BUILD_DIR}/libarrow.a" + "${ARROW_RELEASE_BUILD_DIR}/libparquet.a" + "${ARROW_RELEASE_BUILD_DIR}/libarrow_bundled_dependencies.a" + ) + +add_dependencies(arrow_static apache-arrow-cpp) +add_dependencies(parquet_static apache-arrow-cpp) +add_dependencies(arrow_dependencies apache-arrow-cpp) +set_target_properties(arrow_static PROPERTIES IMPORTED_LOCATION "${ARROW_RELEASE_BUILD_DIR}/libarrow.a") +set_target_properties(parquet_static PROPERTIES IMPORTED_LOCATION "${ARROW_RELEASE_BUILD_DIR}/libparquet.a") +set_target_properties(arrow_dependencies PROPERTIES IMPORTED_LOCATION "${ARROW_RELEASE_BUILD_DIR}/libarrow_bundled_dependencies.a") +target_include_directories(apache_arrow_static SYSTEM INTERFACE "${PREFIX}/include") +target_link_libraries(apache_arrow_static INTERFACE parquet_static arrow_static arrow_dependencies) diff --git a/cmake/CLangFormat.cmake b/cmake/CLangFormat.cmake new file mode 100644 index 0000000..c74b3dd --- /dev/null +++ b/cmake/CLangFormat.cmake @@ -0,0 +1,24 @@ +set(CLANG_FORMAT "/usr/bin/clang-format-14") +if(EXISTS ${CLANG_FORMAT}) + message(STATUS "Found clang-format at ${CLANG_FORMAT}") + + set(SOURCE_DIRS + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/tests + ${CMAKE_SOURCE_DIR}/benchmarks + ) + + # For now, it just hard codes the source files list to globs. That works + # fine until we have another directory in `src/`. We should ideally gather + # this from SOURCE_FILES list. But, should filter the thirs_party sources. + # Taking a quick route for now. We should deal with it sometime down the line. + add_custom_target(format + COMMENT "Running clang-format" + COMMAND find ${SOURCE_DIRS} -name '*.cc' -o -name '*.cpp' -o -name '*.h' | grep -v "_generated.h" | xargs ${CLANG_FORMAT} -i) + + add_custom_target(check-format + COMMENT "Running clang-format" + COMMAND find ${SOURCE_DIRS} -name '*.cc' -o -name '*.cpp' -o -name '*.h' | grep -v "_generated.h" | xargs ${CLANG_FORMAT} --Werror --dry-run) +else() + message(FATAL_ERROR "clang-format-14 not found") +endif() diff --git a/cmake/CLangTidy.cmake b/cmake/CLangTidy.cmake new file mode 100644 index 0000000..6f387b0 --- /dev/null +++ b/cmake/CLangTidy.cmake @@ -0,0 +1,52 @@ +# clang-tidy generates too many warnings, so just disable it by default. +option(ENABLE_CLANG_TIDY "Run clang-tidy during build" OFF) + +find_program(CLANG_TIDY NAMES clang-tidy-14) +if(CLANG_TIDY) + if(CMake_SOURCE_DIR STREQUAL CMake_BINARY_DIR) + message(FATAL_ERROR "CMake_RUN_CLANG_TIDY requires an out-of-source build!") + endif() + + if(NOT CMAKE_EXPORT_COMPILE_COMMANDS) + message(WARNING "CMAKE_EXPORT_COMPILE_COMMANDS=OFF, clang-tidy may not works!!!") + endif() + + set(HEADER_FILTER "${CMAKE_SOURCE_DIR}/\\(src\\|tests\\|benchmarks\\|demos\\)") + + if(ENABLE_CLANG_TIDY) + set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY} --header-filter ${HEADER_FILTER}) + + # Create a preprocessor definition that depends on .clang-tidy content so + # the compile command will change when .clang-tidy changes. This ensures + # that a subsequent build re-runs clang-tidy on all sources even if they + # do not otherwise need to be recompiled. Nothing actually uses this + # definition. We add it to targets on which we run clang-tidy just to + # get the build dependency on the .clang-tidy file. + file(SHA1 ${CMAKE_CURRENT_SOURCE_DIR}/.clang-tidy clang_tidy_sha1) + set(CLANG_TIDY_DEFINITIONS "CLANG_TIDY_SHA1=${clang_tidy_sha1}") + unset(clang_tidy_sha1) + + configure_file(.clang-tidy .clang-tidy COPYONLY) + endif() + + set(SOURCE_DIRS + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/tests + ${CMAKE_SOURCE_DIR}/demos + ${CMAKE_SOURCE_DIR}/benchmarks + ) + + # For now, it just hard codes the source files list to globs. That works + # fine until we have another directory in `src/`. We should ideally gather + # this from SOURCE_FILES list. But, should filter the thirs_party sources. + # Taking a quick route for now. We should deal with it sometime down the line. + add_custom_target(clang-tidy + COMMENT "Running clang-tidy" + COMMAND run-clang-tidy-14 -header-filter ${HEADER_FILTER} `find ${SOURCE_DIRS} -name "*.cc" -o -name "*.cpp" -not -name "*.actor.cpp" ` -quiet) + + add_custom_target(clang-tidy-fix + COMMENT "Running clang-tidy -fix" + COMMAND run-clang-tidy-14 -header-filter ${HEADER_FILTER} `find ${SOURCE_DIRS} -name "*.cc" -o -name "*.cpp" -not -name "*.actor.cpp" ` -fix -quiet) +else() + message(WARNING "clang-tidy-14 not found!!!") +endif() \ No newline at end of file diff --git a/cmake/CTestCustom.cmake b/cmake/CTestCustom.cmake new file mode 100644 index 0000000..75f7766 --- /dev/null +++ b/cmake/CTestCustom.cmake @@ -0,0 +1,12 @@ +file (STRINGS "@CMAKE_BINARY_DIR@/CTestTestfile.cmake" LINES) + +# overwrite the file.... +file(WRITE "@CMAKE_BINARY_DIR@/CTestTestfile.cmake" "") + +# loop through the lines, +foreach(LINE IN LISTS LINES) + # remove unwanted parts + string(REGEX REPLACE ".*third_party.*" "" STRIPPED "${LINE}") + # and write the (changed) line ... + file(APPEND "@CMAKE_BINARY_DIR@/CTestTestfile.cmake" "${STRIPPED}\n") +endforeach() diff --git a/cmake/CodeCoverage.cmake b/cmake/CodeCoverage.cmake new file mode 100644 index 0000000..7207622 --- /dev/null +++ b/cmake/CodeCoverage.cmake @@ -0,0 +1,27 @@ +option(ENABLE_CODE_COVERAGE "Enable code coverage" OFF) +if(ENABLE_CODE_COVERAGE) + if(CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG" ) + message(STATUS "Enable code coverage with debug mode.") + else() + message(WARNING "Code coverage with no debug mode!!!") + endif() + + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(COVERAGE_COMPILER_FLAGS "-g -fprofile-arcs -ftest-coverage") + link_libraries(gcov) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang") + set(COVERAGE_COMPILER_FLAGS "-g -fprofile-instr-generate -fcoverage-mapping") + else() + message(FATAL_ERROR "Unknown compiler iid ${CMAKE_CXX_COMPILER_ID}") + endif() + + include(CheckCXXCompilerFlag) + check_cxx_compiler_flag(-fprofile-abs-path HAVE_fprofile_abs_path) + if(HAVE_fprofile_abs_path) + set(COVERAGE_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path") + endif() + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}") + message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}") +endif() \ No newline at end of file diff --git a/cmake/CompileFlags.cmake b/cmake/CompileFlags.cmake new file mode 100644 index 0000000..7a81823 --- /dev/null +++ b/cmake/CompileFlags.cmake @@ -0,0 +1,21 @@ +macro(store_compile_flags) +set(ORIGINAL_C_FLAGS "${CMAKE_C_FLAGS}") +set(ORIGINAL_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") +set(ORIGINAL_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") +set(ORIGINAL_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") +set(ORIGINAL_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +set(ORIGINAL_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") +set(ORIGINAL_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") +set(ORIGINAL_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") +endmacro() + +macro(restore_compile_flags) +set(CMAKE_C_FLAGS "${ORIGINAL_C_FLAGS}") +set(CMAKE_C_FLAGS_DEBUG "${ORIGINAL_C_FLAGS_DEBUG}") +set(CMAKE_C_FLAGS_RELEASE "${ORIGINAL_C_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_RELWITHDEBINFO "${ORIGINAL_C_FLAGS_RELWITHDEBINFO}") +set(CMAKE_CXX_FLAGS "${ORIGINAL_CXX_FLAGS}") +set(CMAKE_CXX_FLAGS_DEBUG "${ORIGINAL_CXX_FLAGS_DEBUG}") +set(CMAKE_CXX_FLAGS_RELEASE "${ORIGINAL_CXX_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${ORIGINAL_CXX_FLAGS_RELWITHDEBINFO}") +endmacro() diff --git a/cmake/DumpConfig.cmake b/cmake/DumpConfig.cmake new file mode 100644 index 0000000..11fc5ad --- /dev/null +++ b/cmake/DumpConfig.cmake @@ -0,0 +1,15 @@ +if (ENABLE_FUSE_APPLICATION) +add_custom_target(dump-config + COMMENT "Running dump config" + COMMAND find ${CMAKE_CURRENT_BINARY_DIR} -name 'meta_main' -o -name 'mgmtd_main' -o -name 'storage_main' -o -name 'admin_cli' -o -name 'hf3fs_fuse_main' | xargs -I {} bash -c '{} --dump_default_cfg > ${CMAKE_SOURCE_DIR}/configs/`basename {}`.toml' + COMMAND find ${CMAKE_CURRENT_BINARY_DIR} -name 'meta_main' -o -name 'mgmtd_main' -o -name 'storage_main' -o -name 'hf3fs_fuse_main' | xargs -I {} bash -c '{} --dump_default_app_cfg > ${CMAKE_SOURCE_DIR}/configs/`basename {}`_app.toml' + COMMAND find ${CMAKE_CURRENT_BINARY_DIR} -name 'meta_main' -o -name 'mgmtd_main' -o -name 'storage_main' -o -name 'hf3fs_fuse_main' | xargs -I {} bash -c '{} --dump_default_launcher_cfg > ${CMAKE_SOURCE_DIR}/configs/`basename {}`_launcher.toml') +add_dependencies(dump-config meta_main mgmtd_main storage_main admin_cli hf3fs_fuse_main) +else() +add_custom_target(dump-config + COMMENT "Running dump config" + COMMAND find ${CMAKE_CURRENT_BINARY_DIR} -name 'meta_main' -o -name 'mgmtd_main' -o -name 'storage_main' -o -name 'admin_cli' | xargs -I {} bash -c '{} --dump_default_cfg > ${CMAKE_SOURCE_DIR}/configs/`basename {}`.toml' + COMMAND find ${CMAKE_CURRENT_BINARY_DIR} -name 'meta_main' -o -name 'mgmtd_main' -o -name 'storage_main' | xargs -I {} bash -c '{} --dump_default_app_cfg > ${CMAKE_SOURCE_DIR}/configs/`basename {}`_app.toml' + COMMAND find ${CMAKE_CURRENT_BINARY_DIR} -name 'meta_main' -o -name 'mgmtd_main' -o -name 'storage_main' | xargs -I {} bash -c '{} --dump_default_launcher_cfg > ${CMAKE_SOURCE_DIR}/configs/`basename {}`_launcher.toml') +add_dependencies(dump-config meta_main mgmtd_main storage_main admin_cli) +endif() diff --git a/cmake/GitVersion.cmake b/cmake/GitVersion.cmake new file mode 100644 index 0000000..4e03d97 --- /dev/null +++ b/cmake/GitVersion.cmake @@ -0,0 +1,127 @@ +find_package(Git REQUIRED) + +if (NOT DEFINED PRE_CONFIGURE_DIR) + set(PRE_CONFIGURE_DIR ${PROJECT_SOURCE_DIR}/src/common/utils) +endif () + +if (NOT DEFINED POST_BUILD_DIR) + set(POST_BUILD_DIR ${PROJECT_BINARY_DIR}) +endif () + +set(PRE_CONFIGURE_FILE ${PRE_CONFIGURE_DIR}/VersionInfo.cc.in) +set(POST_CONFIGURE_FILE ${POST_BUILD_DIR}/src/common/utils/VersionInfo.cc) + +function(CheckGitWrite git_hash) + file(WRITE ${POST_BUILD_DIR}/git-state.txt ${git_hash}) +endfunction() + +function(CheckGitRead git_hash) + if (EXISTS ${POST_BUILD_DIR}/git-state.txt) + file(STRINGS ${POST_BUILD_DIR}/git-state.txt CONTENT) + LIST(GET CONTENT 0 var) + set(${git_hash} ${var} PARENT_SCOPE) + endif () +endfunction() + +function(CheckGitVersion) + # Get the latest abbreviated commit hash of the working branch + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --short=8 HEAD + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE BUILD_COMMIT_HASH_SHORT + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE BUILD_COMMIT_HASH_FULL + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND ${GIT_EXECUTABLE} log -1 --format=%at --date=local + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE BUILD_TIMESTAMP + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND date -d @${BUILD_TIMESTAMP} +%Y%m%d + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE BUILD_DATE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=0 + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE BUILD_TAG + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + COMMAND bash -c "${GIT_EXECUTABLE} describe --tags --long | sed -E 's/(.*)-([0-9]+)-(\\w+)/\\2/g'" + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE BUILD_TAG_SEQ_NUM + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(NOT DEFINED BUILD_TAG OR BUILD_TAG STREQUAL "") + set(BUILD_TAG "250228") + endif() + if(NOT DEFINED BUILD_TAG_SEQ_NUM OR BUILD_TAG_SEQ_NUM STREQUAL "") + set(BUILD_TAG_SEQ_NUM "1") + endif() + message(STATUS "Git Commit hash: ${BUILD_COMMIT_HASH_SHORT} ${BUILD_COMMIT_HASH_FULL}") + message(STATUS "Git Commit Date & Timestamp: ${BUILD_DATE} ${BUILD_TIMESTAMP}") + message(STATUS "Git Commit Tag & Seq Num: ${BUILD_TAG} ${BUILD_TAG_SEQ_NUM}") + + set(BUILD_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") + set(BUILD_VERSION_MINOR "${PROJECT_VERSION_MINOR}") + set(BUILD_VERSION_PATCH "${PROJECT_VERSION_PATCH}") + set(BUILD_VERSION "${PROJECT_VERSION}") + + CheckGitRead(GIT_HASH_CACHE) + + if (NOT DEFINED GIT_HASH_CACHE) + set(GIT_HASH_CACHE "INVALID") + endif () + + if (NOT DEFINED BUILD_ON_RELEASE_BRANCH) + set(BUILD_ON_RELEASE_BRANCH "false") + endif () + + if (NOT DEFINED BUILD_PIPELINE_ID) + set(BUILD_PIPELINE_ID "999999") + endif() + + # Only update the git_version.cpp if the hash has changed. This will + # prevent us from rebuilding the project more than we need to. + if (NOT ${BUILD_COMMIT_HASH_FULL} STREQUAL ${GIT_HASH_CACHE} OR NOT EXISTS ${POST_CONFIGURE_FILE}) + # Set che GIT_HASH_CACHE variable the next build won't have + # to regenerate the source file. + CheckGitWrite("${BUILD_COMMIT_HASH_FULL}") + configure_file(${PRE_CONFIGURE_FILE} ${POST_CONFIGURE_FILE} @ONLY) + endif () +endfunction() + +function(CheckGitSetup project_src_dir) + add_custom_target(AlwaysCheckGit COMMAND ${CMAKE_COMMAND} + -DRUN_CHECK_GIT_VERSION=1 + -DPRE_CONFIGURE_DIR=${PRE_CONFIGURE_DIR} + -DPOST_BUILD_DIR=${POST_BUILD_DIR} + -DGIT_HASH_CACHE=${GIT_HASH_CACHE} + -DPROJECT_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} + -DPROJECT_VERSION_MINOR=${PROJECT_VERSION_MINOR} + -DPROJECT_VERSION_PATCH=${PROJECT_VERSION_PATCH} + -DPROJECT_VERSION=${PROJECT_VERSION} + -DPROJECT_SOURCE_DIR=${project_src_dir} + -P ${PROJECT_SOURCE_DIR}/cmake/GitVersion.cmake + DEPENDS ${PRE_CONFIGURE_FILE} + BYPRODUCTS ${POST_CONFIGURE_FILE} + ) + + add_library(version-info STATIC ${POST_CONFIGURE_FILE}) + target_include_directories(version-info PUBLIC ${PROJECT_SOURCE_DIR}/src) + add_dependencies(version-info AlwaysCheckGit) + CheckGitVersion() +endfunction() + +if (RUN_CHECK_GIT_VERSION) + CheckGitVersion() +endif () diff --git a/cmake/Jemalloc.cmake b/cmake/Jemalloc.cmake new file mode 100644 index 0000000..bd23bac --- /dev/null +++ b/cmake/Jemalloc.cmake @@ -0,0 +1,20 @@ +add_library(jemalloc INTERFACE) +add_library(hf3fs_jemalloc_shared SHARED IMPORTED) + +include(ExternalProject) +set(JEMALLOC_DIR "${CMAKE_BINARY_DIR}/third_party/jemalloc") + +ExternalProject_add(Hf3fsJemalloc_project + SOURCE_DIR "${PROJECT_SOURCE_DIR}/third_party/jemalloc" + BUILD_BYPRODUCTS "${JEMALLOC_DIR}/include/jemalloc/jemalloc.h" + "${JEMALLOC_DIR}/lib/libjemalloc.so.2" + CONFIGURE_COMMAND ./autogen.sh && ./configure --prefix=${JEMALLOC_DIR} --disable-cxx --enable-prof --disable-initial-exec-tls + BUILD_IN_SOURCE ON + BUILD_COMMAND make -j 6 + INSTALL_DIR "${JEMALLOC_DIR}" + INSTALL_COMMAND make install) + +add_dependencies(hf3fs_jemalloc_shared Hf3fsJemalloc_project) +set_target_properties(hf3fs_jemalloc_shared PROPERTIES IMPORTED_LOCATION "${JEMALLOC_DIR}/lib/libjemalloc.so.2") +target_include_directories(hf3fs_jemalloc_shared INTERFACE "${JEMALLOC_DIR}/include") +target_link_libraries(jemalloc INTERFACE hf3fs_jemalloc_shared) diff --git a/cmake/Sanitizers.cmake b/cmake/Sanitizers.cmake new file mode 100644 index 0000000..8ae6b08 --- /dev/null +++ b/cmake/Sanitizers.cmake @@ -0,0 +1,242 @@ +# +# Copyright (C) 2018-2022 by George Cave - gcave@stablecoder.ca +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +include(CheckCXXSourceCompiles) + +set(SANITIZER "" CACHE STRING "Sanitizer: ASAN, MSAN, UBSAN, TSAN") +if(SANITIZER STREQUAL "ASAN") + message(STATUS "Build with Address Sanitizer.") + set(USE_SANITIZER "Address") + set(USE_ASAN ON) +elseif(SANITIZER STREQUAL "MSAN") + message(STATUS "Build with Memory Sanitizer.") + set(USE_SANITIZER "Memory") + set(USE_MSAN ON) +elseif(SANITIZER STREQUAL "UBSAN") + message(STATUS "Build with Undefined behavior Sanitizer.") + message(WARNING "With clang++ v14.0.6 undefined behavior sanitizer doesn't work with coroutine!!!") + set(USE_SANITIZER "Undefined") + set(USE_UBSAN ON) +elseif(SANITIZER STREQUAL "TSAN") + message(STATUS "Build with Thread Sanitizer.") + set(USE_SANITIZER "Thread") + set(USE_TSAN ON) +else() + message(STATUS "Sanitizer not enabled. ${SANITIZER}") + set(USE_SANITIZER "") +endif() + +# set(USE_SANITIZER "" CACHE STRING +# "Compile with a sanitizer. Options are: Address, Memory, MemoryWithOrigins, Undefined, Thread, Leak, 'Address;Undefined', CFI" +# ) + +function(append value) + foreach(variable ${ARGN}) + set(${variable} + "${${variable}} ${value}" + PARENT_SCOPE) + endforeach(variable) +endfunction() + +function(append_quoteless value) + foreach(variable ${ARGN}) + set(${variable} + ${${variable}} ${value} + PARENT_SCOPE) + endforeach(variable) +endfunction() + +function(test_san_flags return_var flags) + set(QUIET_BACKUP ${CMAKE_REQUIRED_QUIET}) + set(CMAKE_REQUIRED_QUIET TRUE) + unset(${return_var} CACHE) + set(FLAGS_BACKUP ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "${flags}") + check_cxx_source_compiles("int main() { return 0; }" ${return_var}) + set(CMAKE_REQUIRED_FLAGS "${FLAGS_BACKUP}") + set(CMAKE_REQUIRED_QUIET "${QUIET_BACKUP}") +endfunction() + +if(USE_SANITIZER) + append("-fno-omit-frame-pointer" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + + unset(SANITIZER_SELECTED_FLAGS) + + if(UNIX) + if(uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") + append("-O1" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + endif() + + if(USE_SANITIZER MATCHES "([Aa]ddress)") + # Optional: -fno-optimize-sibling-calls -fsanitize-address-use-after-scope + message(STATUS "Testing with Address sanitizer") + set(SANITIZER_ADDR_FLAG "-fsanitize=address") + test_san_flags(SANITIZER_ADDR_AVAILABLE ${SANITIZER_ADDR_FLAG}) + if(SANITIZER_ADDR_AVAILABLE) + message(STATUS " Building with Address sanitizer") + append("${SANITIZER_ADDR_FLAG}" SANITIZER_SELECTED_FLAGS) + + if(AFL) + append_quoteless(AFL_USE_ASAN=1 CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER) + endif() + else() + message( + FATAL_ERROR + "Address sanitizer not available for ${CMAKE_CXX_COMPILER}") + endif() + endif() + + if(USE_SANITIZER MATCHES "([Mm]emory([Ww]ith[Oo]rigins)?)") + # Optional: -fno-optimize-sibling-calls -fsanitize-memory-track-origins=2 + set(SANITIZER_MEM_FLAG "-fsanitize=memory") + if(USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") + message(STATUS "Testing with MemoryWithOrigins sanitizer") + append("-fsanitize-memory-track-origins" SANITIZER_MEM_FLAG) + else() + message(STATUS "Testing with Memory sanitizer") + endif() + test_san_flags(SANITIZER_MEM_AVAILABLE ${SANITIZER_MEM_FLAG}) + if(SANITIZER_MEM_AVAILABLE) + if(USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") + message(STATUS " Building with MemoryWithOrigins sanitizer") + else() + message(STATUS " Building with Memory sanitizer") + endif() + append("${SANITIZER_MEM_FLAG}" SANITIZER_SELECTED_FLAGS) + + if(AFL) + append_quoteless(AFL_USE_MSAN=1 CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER) + endif() + else() + message( + FATAL_ERROR + "Memory [With Origins] sanitizer not available for ${CMAKE_CXX_COMPILER}" + ) + endif() + endif() + + if(USE_SANITIZER MATCHES "([Uu]ndefined)") + message(STATUS "Testing with Undefined Behaviour sanitizer") + set(SANITIZER_UB_FLAG "-fsanitize=undefined") + if(EXISTS "${BLACKLIST_FILE}") + append("-fsanitize-blacklist=${BLACKLIST_FILE}" SANITIZER_UB_FLAG) + endif() + test_san_flags(SANITIZER_UB_AVAILABLE ${SANITIZER_UB_FLAG}) + if(SANITIZER_UB_AVAILABLE) + message(STATUS " Building with Undefined Behaviour sanitizer") + append("${SANITIZER_UB_FLAG}" SANITIZER_SELECTED_FLAGS) + + if(AFL) + append_quoteless(AFL_USE_UBSAN=1 CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER) + endif() + else() + message( + FATAL_ERROR + "Undefined Behaviour sanitizer not available for ${CMAKE_CXX_COMPILER}" + ) + endif() + endif() + + if(USE_SANITIZER MATCHES "([Tt]hread)") + message(STATUS "Testing with Thread sanitizer") + set(SANITIZER_THREAD_FLAG "-fsanitize=thread -fsanitize-ignorelist=${CMAKE_SOURCE_DIR}/tsan_ignore.txt") + test_san_flags(SANITIZER_THREAD_AVAILABLE ${SANITIZER_THREAD_FLAG}) + if(SANITIZER_THREAD_AVAILABLE) + message(STATUS " Building with Thread sanitizer") + append("${SANITIZER_THREAD_FLAG}" SANITIZER_SELECTED_FLAGS) + + if(AFL) + append_quoteless(AFL_USE_TSAN=1 CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER) + endif() + else() + message( + FATAL_ERROR "Thread sanitizer not available for ${CMAKE_CXX_COMPILER}" + ) + endif() + endif() + + if(USE_SANITIZER MATCHES "([Ll]eak)") + message(STATUS "Testing with Leak sanitizer") + set(SANITIZER_LEAK_FLAG "-fsanitize=leak") + test_san_flags(SANITIZER_LEAK_AVAILABLE ${SANITIZER_LEAK_FLAG}) + if(SANITIZER_LEAK_AVAILABLE) + message(STATUS " Building with Leak sanitizer") + append("${SANITIZER_LEAK_FLAG}" SANITIZER_SELECTED_FLAGS) + + if(AFL) + append_quoteless(AFL_USE_LSAN=1 CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER) + endif() + else() + message( + FATAL_ERROR "Thread sanitizer not available for ${CMAKE_CXX_COMPILER}" + ) + endif() + endif() + + if(USE_SANITIZER MATCHES "([Cc][Ff][Ii])") + message(STATUS "Testing with Control Flow Integrity(CFI) sanitizer") + set(SANITIZER_CFI_FLAG "-fsanitize=cfi") + test_san_flags(SANITIZER_CFI_AVAILABLE ${SANITIZER_CFI_FLAG}) + if(SANITIZER_CFI_AVAILABLE) + message(STATUS " Building with Control Flow Integrity(CFI) sanitizer") + append("${SANITIZER_LEAK_FLAG}" SANITIZER_SELECTED_FLAGS) + + if(AFL) + append_quoteless(AFL_USE_CFISAN=1 CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER) + endif() + else() + message( + FATAL_ERROR + "Control Flow Integrity(CFI) sanitizer not available for ${CMAKE_CXX_COMPILER}" + ) + endif() + endif() + + message(STATUS "Sanitizer flags: ${SANITIZER_SELECTED_FLAGS}") + test_san_flags(SANITIZER_SELECTED_COMPATIBLE ${SANITIZER_SELECTED_FLAGS}) + if(SANITIZER_SELECTED_COMPATIBLE) + message(STATUS " Building with ${SANITIZER_SELECTED_FLAGS}") + append("${SANITIZER_SELECTED_FLAGS}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + else() + message( + FATAL_ERROR + " Sanitizer flags ${SANITIZER_SELECTED_FLAGS} are not compatible.") + endif() + elseif(MSVC) + if(USE_SANITIZER MATCHES "([Aa]ddress)") + message(STATUS "Building with Address sanitizer") + append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + + if(AFL) + append_quoteless(AFL_USE_ASAN=1 CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER) + endif() + else() + message( + FATAL_ERROR + "This sanitizer not yet supported in the MSVC environment: ${USE_SANITIZER}" + ) + endif() + else() + message(FATAL_ERROR "USE_SANITIZER is not supported on this platform.") + endif() + +endif() \ No newline at end of file diff --git a/cmake/Target.cmake b/cmake/Target.cmake new file mode 100644 index 0000000..dbd3cf3 --- /dev/null +++ b/cmake/Target.cmake @@ -0,0 +1,109 @@ +# Check if IPO is supported +include(CheckIPOSupported) +check_ipo_supported(RESULT HAVE_IPO) + +# Enable IPO in non-debug build +macro(target_enable_ipo NAME) + if(NOT CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG" AND HAVE_IPO) + set_property(TARGET ${NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) + message (STATUS "Enabled IPO for target: ${NAME}") + endif() +endmacro() + +macro(target_add_lib NAME) + file(GLOB_RECURSE FILES CONFIGURE_DEPENDS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc" "*.h") + add_library(${NAME} STATIC ${FILES} ${FBS_FILES}) + target_include_directories(${NAME} + PUBLIC + $ + ${PROJECT_SOURCE_DIR} + ${PROJECT_BINARY_DIR}/src + ${PROJECT_BINARY_DIR} + ) + target_link_libraries(${NAME} ${ARGN} "") +endmacro() + +macro(target_add_shared_lib NAME) + file(GLOB_RECURSE FILES CONFIGURE_DEPENDS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc" "*.h") + add_library(${NAME} SHARED ${FILES} ${FBS_FILES}) + target_include_directories(${NAME} + PUBLIC + $ + ${PROJECT_SOURCE_DIR} + ${PROJECT_BINARY_DIR}/src + ${PROJECT_BINARY_DIR} + ) + target_link_libraries(${NAME} ${ARGN} "") + target_enable_ipo(${NAME}) +endmacro() + +macro(target_add_bin NAME MAIN_FILE) + add_executable(${NAME} ${MAIN_FILE}) + target_link_libraries(${NAME} ${ARGN} "") + target_include_directories(${NAME} + PUBLIC + $ + ${PROJECT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/src/lib/api + ${PROJECT_BINARY_DIR}/src + ${PROJECT_BINARY_DIR} + ) + set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + target_enable_ipo(${NAME}) +endmacro() + +macro(target_add_test NAME) + file(GLOB_RECURSE FILES CONFIGURE_DEPENDS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc") + add_executable(${NAME} ${FILES}) + target_link_libraries(${NAME} gmock test_main ${ARGN} "") + target_include_directories(${NAME} + PUBLIC + $ + ${PROJECT_SOURCE_DIR} + ${PROJECT_BINARY_DIR}/src + ${PROJECT_BINARY_DIR} + ) + add_test(NAME ${NAME} COMMAND ${NAME}) + set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") +endmacro() + +macro(target_add_fbs NAME PATH) + cmake_parse_arguments(FBS "SERVICE" "" "DEPS" ${ARGN}) + + message("Fbs " ${NAME} " FBS_SERVICE " ${FBS_SERVICE} " ARGN " ${ARGN}) + + set(FLATBUFFERS_FLATC_SCHEMA_EXTRA_ARGS + --scoped-enums + --gen-object-api + --gen-mutable + --gen-compare + --cpp-std=c++17 + --python + --hf3fs + --keep-prefix + ) + + get_filename_component(NAME_WE ${PATH} NAME_WE) + get_filename_component(DIR ${PATH} DIRECTORY) + + build_flatbuffers(${PATH} + "${CMAKE_CURRENT_SOURCE_DIR}/${DIR};${CMAKE_SOURCE_DIR}/src" + "${NAME_WE}-generated" + "" + "${CMAKE_CURRENT_BINARY_DIR}/${DIR}" + "" + "" + ) + + add_library(${NAME} INTERFACE) + target_link_libraries(${NAME} INTERFACE common) + target_include_directories(${NAME} + INTERFACE + $ + ${PROJECT_SOURCE_DIR} + ${PROJECT_BINARY_DIR}/src + ${PROJECT_BINARY_DIR} + ) + + add_dependencies(${NAME} "${NAME_WE}-generated" ${FBS_DEPS}) +endmacro() diff --git a/configs/admin_cli.toml b/configs/admin_cli.toml new file mode 100644 index 0000000..1f3cef8 --- /dev/null +++ b/configs/admin_cli.toml @@ -0,0 +1,338 @@ +break_multi_line_command_on_failure = false +cluster_id = '' +log = 'DBG:normal; normal=file:path=/var/log/3fs/cli.log,async=true,sync_level=ERR' +num_timeout_ms = 1000 +profile = false +verbose = false + +[client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[client.io_worker.transport_pool] +max_connections = 1 + +[client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[client.rdma_control] +max_concurrent_transmission = 64 + +[client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[fdb] +casual_read_risky = false +clusterFile = '' +default_backoff = 0 +enableMultipleClient = false +externalClientDir = '' +externalClientPath = '' +multipleClientThreadNum = 4 +readonly = false +trace_file = '' +trace_format = 'json' + +[ib_devices] +allow_no_usable_devices = false +allow_unknown_zone = true +default_network_zone = 'UNKNOWN' +default_pkey_index = 0 +default_roce_pkey_index = 0 +default_traffic_class = 0 +device_filter = [] +fork_safe = true +prefer_ibdevice = true +skip_inactive_ports = true +skip_unusable_device = true +subnets = [] + +[meta_client] +check_server_interval = '5s' +dynamic_stripe = false +max_concurrent_requests = 128 +network_type = 'RDMA' +remove_chunks_batch_size = 32 +remove_chunks_max_iters = 1024 +selection_mode = 'RandomFollow' + +[meta_client.background_closer] +prune_session_batch_count = 128 +prune_session_batch_interval = '10s' +retry_first_wait = '100ms' +retry_max_wait = '10s' +task_scan = '50ms' + +[meta_client.background_closer.coroutine_pool] +coroutines_num = 8 +enable_work_stealing = false +queue_size = 128 + +[meta_client.retry_default] +max_failures_before_failover = 1 +retry_fast = '1s' +retry_init_wait = '500ms' +retry_max_wait = '5s' +retry_send = 1 +retry_total_time = '1min' +rpc_timeout = '5s' + +[mgmtd_client] +accept_incomplete_routing_info_during_mgmtd_bootstrapping = true +auto_extend_client_session_interval = '10s' +auto_heartbeat_interval = '10s' +auto_refresh_interval = '1s' +enable_auto_extend_client_session = false +enable_auto_heartbeat = false +enable_auto_refresh = true +mgmtd_server_addresses = [] +work_queue_size = 100 + +[monitor] +collect_period = '1s' +num_collectors = 1 +reporters = [] + +[storage_client] +check_overlapping_read_buffers = true +check_overlapping_write_buffers = false +chunk_checksum_type = 'CRC32C' +create_net_client_for_updates = false +implementation_type = 'RPC' +max_inline_read_bytes = '0' +max_inline_write_bytes = '0' +max_read_io_bytes = '0' + +[storage_client.net_client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[storage_client.net_client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[storage_client.net_client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[storage_client.net_client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[storage_client.net_client.io_worker.transport_pool] +max_connections = 1 + +[storage_client.net_client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[storage_client.net_client.rdma_control] +max_concurrent_transmission = 64 + +[storage_client.net_client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[storage_client.net_client_for_updates] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[storage_client.net_client_for_updates.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[storage_client.net_client_for_updates.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[storage_client.net_client_for_updates.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[storage_client.net_client_for_updates.io_worker.transport_pool] +max_connections = 1 + +[storage_client.net_client_for_updates.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[storage_client.net_client_for_updates.rdma_control] +max_concurrent_transmission = 64 + +[storage_client.net_client_for_updates.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[storage_client.retry] +init_wait_time = '10s' +max_failures_before_failover = 1 +max_retry_time = '1min' +max_wait_time = '30s' + +[storage_client.traffic_control.query] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[storage_client.traffic_control.read] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[storage_client.traffic_control.remove] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[storage_client.traffic_control.truncate] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[storage_client.traffic_control.write] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[user_info] +gid = -1 +gids = [] +token = '' +uid = -1 diff --git a/configs/hf3fs_client_agent.toml b/configs/hf3fs_client_agent.toml new file mode 100644 index 0000000..a0df915 --- /dev/null +++ b/configs/hf3fs_client_agent.toml @@ -0,0 +1,557 @@ +[[common.log.categories]] +categories = [ '.' ] +handlers = [ 'normal', 'err', 'fatal' ] +inherit = true +level = 'INFO' +propagate = 'NONE' + +[[common.log.handlers]] +async = true +file_path = '' +max_file_size = '10MB' +max_files = 100 +name = 'normal' +rotate = true +rotate_on_open = false +start_level = 'NONE' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '' +max_file_size = '10MB' +max_files = 100 +name = 'err' +rotate = true +rotate_on_open = false +start_level = 'ERR' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '' +max_file_size = '10MB' +max_files = 100 +name = 'fatal' +rotate = true +rotate_on_open = false +start_level = 'FATAL' +stream_type = 'STDERR' +writer_type = 'STREAM' + +[common.memory] +prof_active = false +prof_prefix = '' + +[common.monitor] +reporters = [] + +[server.agent] +allow_read_holes = true +auth_timeout = '5min' +background_ibreg = true +list_entry_limit = 100 +max_concurrent_iovallocs = 0 +mock_storage_dir = '' +mount_name = '' +read_only_mode = false +truncate_if_write_after_eof = false + +[server.agent.inode_cache] +capacity = 4194304 +entry_lifetime = '5min' + +[server.agent.limit_per_process] +fd = 1048576 +shm = 1048576 + +[server.agent.periodic_sync] +interval = '10min' +on = false + +[server.agent.proc_watch] +interval = '1min' +on = true + +[server.agent.storage_io.read] +enableChecksum = false + +[server.agent.storage_io.read.debug] +bypass_disk_io = false +bypass_rdma_xmit = false +inject_random_client_error = false +inject_random_server_error = false +max_num_of_injection_points = 100 + +[server.agent.storage_io.read.retry] +init_wait_time = '0ns' +max_retry_time = '0ns' +max_wait_time = '0ns' +retry_permanent_error = false + +[server.agent.storage_io.read.targetSelection] +mode = 'Default' +targetIndex = 0 +trafficZone = '' + +[server.agent.storage_io.write] +enableChecksum = true + +[server.agent.storage_io.write.debug] +bypass_disk_io = false +bypass_rdma_xmit = false +inject_random_client_error = false +inject_random_server_error = false +max_num_of_injection_points = 100 + +[server.agent.storage_io.write.retry] +init_wait_time = '0ns' +max_retry_time = '0ns' +max_wait_time = '0ns' +retry_permanent_error = false + +[server.agent.storage_io.write.targetSelection] +mode = 'Default' +targetIndex = 0 +trafficZone = '' + +[server.agent.storage_ops] +enable_read = true +enable_write = true + +[server.background_client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[server.background_client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.background_client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.background_client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.background_client.io_worker.transport_pool] +max_connections = 1 + +[server.background_client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.background_client.rdma_control] +max_concurrent_transmission = 64 + +[server.background_client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.base.independent_thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.base.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 64 +num_proc_threads = 64 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[[server.base.groups]] +check_connections_interval = '1min' +connection_expiration_time = '1day' +network_type = 'LOCAL' +services = [ 'ClientAgentSerde' ] +use_independent_thread_pool = false + +[server.base.groups.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.base.groups.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.base.groups.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.base.groups.io_worker.transport_pool] +max_connections = 1 + +[server.base.groups.listener] +filter_list = [] +listen_port = 0 +listen_queue_depth = 4096 +rdma_accept_timeout = '15s' +rdma_listen_ethernet = true +reuse_port = false + +[server.base.groups.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[[server.base.groups]] +check_connections_interval = '1min' +connection_expiration_time = '1day' +network_type = 'TCP' +services = [ 'Core' ] +use_independent_thread_pool = true + +[server.base.groups.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.base.groups.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.base.groups.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.base.groups.io_worker.transport_pool] +max_connections = 1 + +[server.base.groups.listener] +filter_list = [] +listen_port = 9000 +listen_queue_depth = 4096 +rdma_accept_timeout = '15s' +rdma_listen_ethernet = true +reuse_port = false + +[server.base.groups.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.meta] +check_server_interval = '5s' +dynamic_stripe = false +max_concurrent_requests = 128 +network_type = 'RDMA' +remove_chunks_batch_size = 32 +remove_chunks_max_iters = 1024 +selection_mode = 'RandomFollow' + +[server.meta.background_closer] +prune_session_batch_count = 128 +prune_session_batch_interval = '10s' +retry_first_wait = '100ms' +retry_max_wait = '10s' +task_scan = '50ms' + +[server.meta.background_closer.coroutine_pool] +coroutines_num = 8 +enable_work_stealing = false +queue_size = 128 + +[server.meta.retry_default] +max_failures_before_failover = 1 +retry_init_wait = '500ms' +retry_max_wait = '5s' +retry_send = 1 +retry_total_time = '1min' +rpc_timeout = '2s' + +[server.meta.retry_truncate] +max_failures_before_failover = 1 +retry_init_wait = '2s' +retry_max_wait = '5s' +retry_send = 1 +retry_total_time = '1min' +rpc_timeout = '15s' + +[server.mgmtd] +accept_incomplete_routing_info_during_mgmtd_bootstrapping = true +auto_extend_client_session_interval = '10s' +auto_heartbeat_interval = '10s' +auto_refresh_interval = '10s' +enable_auto_extend_client_session = true +enable_auto_heartbeat = false +enable_auto_refresh = true +mgmtd_server_addresses = [] +work_queue_size = 100 + +[server.storage] +check_overlapping_read_buffers = true +check_overlapping_write_buffers = false +chunk_checksum_type = 'CRC32C' +create_net_client_for_updates = false +implementation_type = 'RPC' +max_inline_read_bytes = '0' +max_inline_write_bytes = '0' +max_read_io_bytes = '0' + +[server.storage.net_client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[server.storage.net_client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.storage.net_client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.storage.net_client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.storage.net_client.io_worker.transport_pool] +max_connections = 1 + +[server.storage.net_client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.storage.net_client.rdma_control] +max_concurrent_transmission = 64 + +[server.storage.net_client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.storage.net_client_for_updates] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[server.storage.net_client_for_updates.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.storage.net_client_for_updates.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.storage.net_client_for_updates.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.storage.net_client_for_updates.io_worker.transport_pool] +max_connections = 1 + +[server.storage.net_client_for_updates.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.storage.net_client_for_updates.rdma_control] +max_concurrent_transmission = 64 + +[server.storage.net_client_for_updates.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.storage.retry] +init_wait_time = '10s' +max_failures_before_failover = 1 +max_retry_time = '1min' +max_wait_time = '30s' + +[server.storage.traffic_control.query] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[server.storage.traffic_control.read] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[server.storage.traffic_control.remove] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[server.storage.traffic_control.truncate] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[server.storage.traffic_control.write] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true diff --git a/configs/hf3fs_client_agent_app.toml b/configs/hf3fs_client_agent_app.toml new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/configs/hf3fs_client_agent_app.toml @@ -0,0 +1 @@ + diff --git a/configs/hf3fs_client_agent_launcher.toml b/configs/hf3fs_client_agent_launcher.toml new file mode 100644 index 0000000..bb5af69 --- /dev/null +++ b/configs/hf3fs_client_agent_launcher.toml @@ -0,0 +1,88 @@ +allow_dev_version = true +cluster_id = '' + +[client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[client.io_worker.transport_pool] +max_connections = 1 + +[client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[client.rdma_control] +max_concurrent_transmission = 64 + +[client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[ib_devices] +allow_unknown_zone = true +default_network_zone = 'UNKNOWN' +default_pkey_index = 0 +default_traffic_class = 0 +device_filter = [] +fork_safe = true +skip_inactive_ports = true +subnets = [] + +[mgmtd_client] +accept_incomplete_routing_info_during_mgmtd_bootstrapping = true +auto_extend_client_session_interval = '10s' +auto_heartbeat_interval = '10s' +auto_refresh_interval = '10s' +enable_auto_extend_client_session = true +enable_auto_heartbeat = false +enable_auto_refresh = true +mgmtd_server_addresses = [] +work_queue_size = 100 diff --git a/configs/hf3fs_fuse_main.toml b/configs/hf3fs_fuse_main.toml new file mode 100644 index 0000000..b99e268 --- /dev/null +++ b/configs/hf3fs_fuse_main.toml @@ -0,0 +1,450 @@ +attr_timeout = 30.0 +batch_io_coros = 128 +check_rmrf = true +chunk_size_limit = '0' +dryrun_bench_mode = false +enable_interrupt = false +enable_priority = false +enable_read_cache = true +enable_writeback_cache = false +entry_timeout = 30.0 +fdatasync_update_length = false +flush_on_stat = true +fsync_length_hint = false +io_job_deq_timeout = '1ms' +io_jobq_size = 1024 +iov_limit = '1MB' +max_background = 32 +max_idle_threads = -1 +max_jobs_per_ioring = 32 +max_readahead = '16MB' +max_threads = 256 +max_uid = '1M' +memset_before_read = false +negative_timeout = 5.0 +notify_inval_threads = 32 +rdma_buf_pool_size = 1024 +readonly = false +submit_wait_jitter = '1ms' +symlink_timeout = 5.0 +sync_on_stat = true +time_granularity = '1s' + +[client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[client.io_worker.transport_pool] +max_connections = 1 + +[client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[client.rdma_control] +max_concurrent_transmission = 64 + +[client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[[common.log.categories]] +categories = [ '.' ] +handlers = [ 'normal', 'err', 'fatal' ] +inherit = true +level = 'INFO' +propagate = 'NONE' + +[[common.log.handlers]] +async = true +file_path = '/var/log/3fs/hf3fs_fuse_main.log' +max_file_size = '100MB' +max_files = 10 +name = 'normal' +rotate = true +rotate_on_open = false +start_level = 'NONE' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '/var/log/3fs/hf3fs_fuse_main-err.log' +max_file_size = '100MB' +max_files = 10 +name = 'err' +rotate = true +rotate_on_open = false +start_level = 'ERR' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '/var/log/3fs/hf3fs_fuse_main-fatal.log' +max_file_size = '100MB' +max_files = 10 +name = 'fatal' +rotate = true +rotate_on_open = false +start_level = 'FATAL' +stream_type = 'STDERR' +writer_type = 'STREAM' + +[common.memory] +prof_active = false +prof_prefix = '' + +[common.monitor] +collect_period = '1s' +num_collectors = 1 + +[[common.monitor.reporters]] +type = 'monitor_collector' + +[common.monitor.reporters.monitor_collector] +remote_ip = '' + +[io_bufs] +max_buf_size = '1MB' +max_readahead = '256KB' +write_buf_size = '1MB' + +[io_jobq_sizes] +hi = 32 +lo = 4096 + +[io_worker_coros] +hi = 8 +lo = 8 + +[meta] +check_server_interval = '5s' +dynamic_stripe = true +max_concurrent_requests = 128 +network_type = 'RDMA' +remove_chunks_batch_size = 32 +remove_chunks_max_iters = 1024 +selection_mode = 'RandomFollow' + +[meta.background_closer] +prune_session_batch_count = 128 +prune_session_batch_interval = '10s' +retry_first_wait = '100ms' +retry_max_wait = '10s' +task_scan = '50ms' + +[meta.background_closer.coroutine_pool] +coroutines_num = 8 +enable_work_stealing = false +queue_size = 128 + +[meta.retry_default] +max_failures_before_failover = 1 +retry_fast = '1s' +retry_init_wait = '500ms' +retry_max_wait = '5s' +retry_send = 1 +retry_total_time = '1min' +rpc_timeout = '5s' + +[mgmtd] +accept_incomplete_routing_info_during_mgmtd_bootstrapping = true +auto_extend_client_session_interval = '10s' +auto_heartbeat_interval = '10s' +auto_refresh_interval = '10s' +enable_auto_extend_client_session = true +enable_auto_heartbeat = false +enable_auto_refresh = true +mgmtd_server_addresses = [] +work_queue_size = 100 + +[periodic_sync] +enable = true +flush_write_buf = true +interval = '30s' +limit = 1000 + +[periodic_sync.worker] +coroutines_num = 4 +enable_work_stealing = false +queue_size = 1024 + +[storage] +check_overlapping_read_buffers = true +check_overlapping_write_buffers = false +chunk_checksum_type = 'CRC32C' +create_net_client_for_updates = false +implementation_type = 'RPC' +max_inline_read_bytes = '0' +max_inline_write_bytes = '0' +max_read_io_bytes = '0' + +[storage.net_client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[storage.net_client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[storage.net_client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[storage.net_client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[storage.net_client.io_worker.transport_pool] +max_connections = 1 + +[storage.net_client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[storage.net_client.rdma_control] +max_concurrent_transmission = 64 + +[storage.net_client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[storage.net_client_for_updates] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[storage.net_client_for_updates.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[storage.net_client_for_updates.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[storage.net_client_for_updates.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[storage.net_client_for_updates.io_worker.transport_pool] +max_connections = 1 + +[storage.net_client_for_updates.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[storage.net_client_for_updates.rdma_control] +max_concurrent_transmission = 64 + +[storage.net_client_for_updates.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[storage.retry] +init_wait_time = '10s' +max_failures_before_failover = 1 +max_retry_time = '1min' +max_wait_time = '30s' + +[storage.traffic_control.query] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[storage.traffic_control.read] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[storage.traffic_control.remove] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[storage.traffic_control.truncate] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[storage.traffic_control.write] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[storage_io.read] +allowReadUncommitted = false +enableChecksum = false + +[storage_io.read.debug] +bypass_disk_io = false +bypass_rdma_xmit = false +inject_random_client_error = false +inject_random_server_error = false +max_num_of_injection_points = 100 + +[storage_io.read.retry] +init_wait_time = '0ns' +max_retry_time = '0ns' +max_wait_time = '0ns' +retry_permanent_error = false + +[storage_io.read.targetSelection] +mode = 'Default' +targetIndex = 0 +trafficZone = '' + +[storage_io.write] +enableChecksum = true + +[storage_io.write.debug] +bypass_disk_io = false +bypass_rdma_xmit = false +inject_random_client_error = false +inject_random_server_error = false +max_num_of_injection_points = 100 + +[storage_io.write.retry] +init_wait_time = '0ns' +max_retry_time = '0ns' +max_wait_time = '0ns' +retry_permanent_error = false + +[storage_io.write.targetSelection] +mode = 'Default' +targetIndex = 0 +trafficZone = '' diff --git a/configs/hf3fs_fuse_main_app.toml b/configs/hf3fs_fuse_main_app.toml new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/configs/hf3fs_fuse_main_app.toml @@ -0,0 +1 @@ + diff --git a/configs/hf3fs_fuse_main_launcher.toml b/configs/hf3fs_fuse_main_launcher.toml new file mode 100644 index 0000000..6b1c032 --- /dev/null +++ b/configs/hf3fs_fuse_main_launcher.toml @@ -0,0 +1,95 @@ +allow_other = true +cluster_id = '' +mountpoint = '' +token_file = '' + +[client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[client.io_worker.transport_pool] +max_connections = 1 + +[client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[client.rdma_control] +max_concurrent_transmission = 64 + +[client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[ib_devices] +allow_no_usable_devices = false +allow_unknown_zone = true +default_network_zone = 'UNKNOWN' +default_pkey_index = 0 +default_roce_pkey_index = 0 +default_traffic_class = 0 +device_filter = [] +fork_safe = true +prefer_ibdevice = true +skip_inactive_ports = true +skip_unusable_device = true +subnets = [] + +[mgmtd_client] +accept_incomplete_routing_info_during_mgmtd_bootstrapping = true +auto_extend_client_session_interval = '10s' +auto_heartbeat_interval = '10s' +auto_refresh_interval = '10s' +enable_auto_extend_client_session = true +enable_auto_heartbeat = false +enable_auto_refresh = true +mgmtd_server_addresses = [] +work_queue_size = 100 diff --git a/configs/meta_main.toml b/configs/meta_main.toml new file mode 100644 index 0000000..95f8e26 --- /dev/null +++ b/configs/meta_main.toml @@ -0,0 +1,633 @@ +[[common.log.categories]] +categories = [ '.' ] +handlers = [ 'normal', 'err', 'fatal' ] +inherit = true +level = 'INFO' +propagate = 'NONE' + +[[common.log.categories]] +categories = [ 'eventlog' ] +handlers = [ 'event' ] +inherit = false +level = 'INFO' +propagate = 'ERR' + +[[common.log.handlers]] +async = true +file_path = '/var/log/3fs/hf3fs_meta_main.log' +max_file_size = '100MB' +max_files = 10 +name = 'normal' +rotate = true +rotate_on_open = false +start_level = 'NONE' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '/var/log/3fs/hf3fs_meta_main-err.log' +max_file_size = '100MB' +max_files = 10 +name = 'err' +rotate = true +rotate_on_open = false +start_level = 'ERR' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '/var/log/3fs/hf3fs_meta_main-fatal.log' +max_file_size = '100MB' +max_files = 10 +name = 'fatal' +rotate = true +rotate_on_open = false +start_level = 'FATAL' +stream_type = 'STDERR' +writer_type = 'STREAM' + +[[common.log.handlers]] +async = true +file_path = '/var/log/3fs/hf3fs_meta_main-event.log' +max_file_size = '100MB' +max_files = 10 +name = 'event' +rotate = true +rotate_on_open = false +start_level = 'INFO' +stream_type = 'STDERR' +writer_type = 'EVENT' + +[common.memory] +prof_active = false +prof_prefix = '' + +[common.monitor] +collect_period = '1s' +num_collectors = 1 + +[[common.monitor.reporters]] +type = 'monitor_collector' + +[common.monitor.reporters.monitor_collector] +remote_ip = '' + +[server] +use_memkv = false + +[server.background_client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[server.background_client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.background_client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.background_client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.background_client.io_worker.transport_pool] +max_connections = 1 + +[server.background_client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.background_client.rdma_control] +max_concurrent_transmission = 64 + +[server.background_client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.base.independent_thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.base.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[[server.base.groups]] +check_connections_interval = '1min' +connection_expiration_time = '1day' +network_type = 'RDMA' +services = [ 'MetaSerde' ] +use_independent_thread_pool = false + +[server.base.groups.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.base.groups.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.base.groups.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.base.groups.io_worker.transport_pool] +max_connections = 1 + +[server.base.groups.listener] +domain_socket_index = 1 +filter_list = [] +listen_port = 8001 +listen_queue_depth = 4096 +rdma_accept_timeout = '15s' +rdma_listen_ethernet = true +reuse_port = false + +[server.base.groups.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[[server.base.groups]] +check_connections_interval = '1min' +connection_expiration_time = '1day' +network_type = 'TCP' +services = [ 'Core' ] +use_independent_thread_pool = true + +[server.base.groups.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.base.groups.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.base.groups.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.base.groups.io_worker.transport_pool] +max_connections = 1 + +[server.base.groups.listener] +domain_socket_index = 1 +filter_list = [] +listen_port = 9001 +listen_queue_depth = 4096 +rdma_accept_timeout = '15s' +rdma_listen_ethernet = true +reuse_port = false + +[server.base.groups.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.fdb] +casual_read_risky = false +clusterFile = '' +default_backoff = 0 +enableMultipleClient = false +externalClientDir = '' +externalClientPath = '' +multipleClientThreadNum = 4 +readonly = false +trace_file = '' +trace_format = 'json' + +[server.kv_engine] +use_memkv = false + +[server.kv_engine.fdb] +casual_read_risky = false +clusterFile = '' +default_backoff = 0 +enableMultipleClient = false +externalClientDir = '' +externalClientPath = '' +multipleClientThreadNum = 4 +readonly = false +trace_file = '' +trace_format = 'json' + +[server.meta] +acl_cache_time = '15s' +allow_directly_move_to_trash = false +allow_owner_change_immutable = false +allow_stat_deleted_inodes = true +authenticate = false +batch_stat_by_path_concurrent = 4 +batch_stat_concurrent = 8 +check_file_hole = false +dynamic_stripe = false +dynamic_stripe_growth = 2 +dynamic_stripe_initial = 16 +enable_new_chunk_engine = false +grv_cache = false +idempotent_record_clean = '1min' +idempotent_record_expire = '30min' +idempotent_remove = true +idempotent_rename = false +iflags_chain_allocation = false +iflags_chunk_engine = true +ignore_length_hint = false +inodeId_abort_on_duplicate = false +inodeId_check_unique = true +list_default_limit = 128 +max_batch_operations = 4096 +max_directory_depth = 64 +max_remove_chunks_per_request = 32 +max_symlink_count = 10 +max_symlink_depth = 4 +operation_timeout = '5s' +otrunc_replace_file = true +otrunc_replace_file_threshold = '1GB' +readonly = false +recursive_remove_check_owner = true +recursive_remove_perm_check = 1024 +statfs_cache_time = '1min' +statfs_space_imbalance_threshold = 5 +statfs_update_interval = '5s' +sync_on_prune_session = false +time_granularity = '1s' + +[server.meta.background_hole_checker] +coroutines_num = 16 +enable_work_stealing = false +queue_size = 4096 + +[server.meta.distributor] +timeout = '30s' +update_interval = '1s' + +[server.meta.event_trace_log] +dump_interval = '30s' +enabled = true +max_num_writers = 1 +max_row_group_length = 100000 +trace_file_dir = '.' + +[server.meta.forward] +addr_type = 'RDMA' +debug = true +timeout = '10s' + +[server.meta.gc] +check_session = true +distributed_gc = true +enable = true +gc_delay_free_space_threshold = 5 +gc_directory_concurrent = 4 +gc_directory_delay = '0ns' +gc_directory_entry_batch = 32 +gc_directory_entry_concurrent = 4 +gc_file_concurrent = 32 +gc_file_delay = '5min' +large_file_chunks = 128 +recursive_perm_check = true +remove_chunks_batch_size = 32 +retry_delay = '10min' +scan_batch = 4096 +scan_interval = '200ms' +small_file_chunks = 32 +txn_low_priority = false + +[server.meta.gc.retry_remove_chunks] +init_wait_time = '10s' +max_retry_time = '30s' +max_wait_time = '10s' +retry_permanent_error = false + +[server.meta.gc.workers] +coroutines_num = 8 +enable_work_stealing = false +queue_size = 1024 + +[server.meta.retry_remove_chunks] +init_wait_time = '10s' +max_retry_time = '30s' +max_wait_time = '10s' +retry_permanent_error = false + +[server.meta.retry_transaction] +max_backoff = '1s' +max_retry_count = 10 + +[server.meta.session_manager] +enable = true +scan_batch = 1024 +scan_interval = '5min' +session_timeout = '5min' +sync_on_prune_session = false + +[server.meta.session_manager.close_workers] +coroutines_num = 32 +enable_work_stealing = false +queue_size = 1024 + +[server.meta.session_manager.scan_workers] +coroutines_num = 8 +enable_work_stealing = false +queue_size = 128 + +[server.meta.user_cache] +buckets = 127 +exist_ttl = '5min' +inexist_ttl = '10s' + +[server.mgmtd_client] +accept_incomplete_routing_info_during_mgmtd_bootstrapping = true +auto_extend_client_session_interval = '10s' +auto_heartbeat_interval = '10s' +auto_refresh_interval = '10s' +enable_auto_extend_client_session = false +enable_auto_heartbeat = true +enable_auto_refresh = true +mgmtd_server_addresses = [] +work_queue_size = 100 + +[server.storage_client] +check_overlapping_read_buffers = true +check_overlapping_write_buffers = false +chunk_checksum_type = 'CRC32C' +create_net_client_for_updates = false +implementation_type = 'RPC' +max_inline_read_bytes = '0' +max_inline_write_bytes = '0' +max_read_io_bytes = '0' + +[server.storage_client.net_client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[server.storage_client.net_client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.storage_client.net_client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.storage_client.net_client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.storage_client.net_client.io_worker.transport_pool] +max_connections = 1 + +[server.storage_client.net_client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.storage_client.net_client.rdma_control] +max_concurrent_transmission = 64 + +[server.storage_client.net_client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.storage_client.net_client_for_updates] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[server.storage_client.net_client_for_updates.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.storage_client.net_client_for_updates.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.storage_client.net_client_for_updates.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.storage_client.net_client_for_updates.io_worker.transport_pool] +max_connections = 1 + +[server.storage_client.net_client_for_updates.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.storage_client.net_client_for_updates.rdma_control] +max_concurrent_transmission = 64 + +[server.storage_client.net_client_for_updates.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.storage_client.retry] +init_wait_time = '2s' +max_failures_before_failover = 1 +max_retry_time = '5s' +max_wait_time = '5s' + +[server.storage_client.traffic_control.query] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[server.storage_client.traffic_control.read] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[server.storage_client.traffic_control.remove] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[server.storage_client.traffic_control.truncate] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true + +[server.storage_client.traffic_control.write] +max_batch_bytes = '4MB' +max_batch_size = 128 +max_concurrent_requests = 32 +max_concurrent_requests_per_server = 8 +process_batches_in_parallel = true +random_shuffle_requests = true diff --git a/configs/meta_main_app.toml b/configs/meta_main_app.toml new file mode 100644 index 0000000..77786ad --- /dev/null +++ b/configs/meta_main_app.toml @@ -0,0 +1,2 @@ +allow_empty_node_id = true +node_id = 0 diff --git a/configs/meta_main_launcher.toml b/configs/meta_main_launcher.toml new file mode 100644 index 0000000..1e21a08 --- /dev/null +++ b/configs/meta_main_launcher.toml @@ -0,0 +1,93 @@ +allow_dev_version = true +cluster_id = '' + +[client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[client.io_worker.transport_pool] +max_connections = 1 + +[client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[client.rdma_control] +max_concurrent_transmission = 64 + +[client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[ib_devices] +allow_no_usable_devices = false +allow_unknown_zone = true +default_network_zone = 'UNKNOWN' +default_pkey_index = 0 +default_roce_pkey_index = 0 +default_traffic_class = 0 +device_filter = [] +fork_safe = true +prefer_ibdevice = true +skip_inactive_ports = true +skip_unusable_device = true +subnets = [] + +[mgmtd_client] +accept_incomplete_routing_info_during_mgmtd_bootstrapping = true +auto_extend_client_session_interval = '10s' +auto_heartbeat_interval = '10s' +auto_refresh_interval = '10s' +enable_auto_extend_client_session = false +enable_auto_heartbeat = true +enable_auto_refresh = true +mgmtd_server_addresses = [] +work_queue_size = 100 diff --git a/configs/mgmtd_main.toml b/configs/mgmtd_main.toml new file mode 100644 index 0000000..9fdb0a0 --- /dev/null +++ b/configs/mgmtd_main.toml @@ -0,0 +1,232 @@ +[[common.log.categories]] +categories = [ '.' ] +handlers = [ 'normal', 'err', 'fatal' ] +inherit = true +level = 'INFO' +propagate = 'NONE' + +[[common.log.handlers]] +async = true +file_path = '/var/log/3fs/mgmtd_main.log' +max_file_size = '100MB' +max_files = 10 +name = 'normal' +rotate = true +rotate_on_open = false +start_level = 'NONE' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '/var/log/3fs/mgmtd_main-err.log' +max_file_size = '100MB' +max_files = 10 +name = 'err' +rotate = true +rotate_on_open = false +start_level = 'ERR' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '/var/log/3fs/mgmtd_main-fatal.log' +max_file_size = '100MB' +max_files = 10 +name = 'fatal' +rotate = true +rotate_on_open = false +start_level = 'FATAL' +stream_type = 'STDERR' +writer_type = 'STREAM' + +[common.memory] +prof_active = false +prof_prefix = '' + +[common.monitor] +collect_period = '1s' +num_collectors = 1 + +[[common.monitor.reporters]] +type = 'monitor_collector' + +[common.monitor.reporters.monitor_collector] +remote_ip = "" + +[server.base.independent_thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.base.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[[server.base.groups]] +check_connections_interval = '1min' +connection_expiration_time = '1day' +network_type = 'RDMA' +services = [ 'Mgmtd' ] +use_independent_thread_pool = false + +[server.base.groups.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.base.groups.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.base.groups.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.base.groups.io_worker.transport_pool] +max_connections = 1 + +[server.base.groups.listener] +domain_socket_index = 1 +filter_list = [] +listen_port = 8000 +listen_queue_depth = 4096 +rdma_accept_timeout = '15s' +rdma_listen_ethernet = true +reuse_port = false + +[server.base.groups.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[[server.base.groups]] +check_connections_interval = '1min' +connection_expiration_time = '1day' +network_type = 'TCP' +services = [ 'Core' ] +use_independent_thread_pool = true + +[server.base.groups.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.base.groups.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.base.groups.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.base.groups.io_worker.transport_pool] +max_connections = 1 + +[server.base.groups.listener] +domain_socket_index = 1 +filter_list = [] +listen_port = 9000 +listen_queue_depth = 4096 +rdma_accept_timeout = '15s' +rdma_listen_ethernet = true +reuse_port = false + +[server.base.groups.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.service] +allow_heartbeat_from_unregistered = true +authenticate = false +bootstrapping_length = '2min' +bump_routing_info_version_interval = '5s' +check_status_interval = '10s' +client_session_timeout = '20min' +enable_routinginfo_cache = true +extend_lease_check_release_version = true +extend_lease_interval = '10s' +heartbeat_fail_interval = '1min' +heartbeat_ignore_stale_targets = true +heartbeat_ignore_unknown_targets = false +heartbeat_timestamp_valid_window = '30s' +lease_length = '1min' +new_chain_bootstrap_interval = '2min' +only_accept_client_uuid = false +retry_times_on_txn_errors = -1 +send_heartbeat = true +send_heartbeat_interval = '10s' +suspicious_lease_interval = '20s' +target_info_load_interval = '1s' +target_info_persist_batch = 1000 +target_info_persist_interval = '1s' +try_adjust_target_order_as_preferred = false +update_chains_interval = '1s' +update_metrics_interval = '1s' +validate_lease_on_write = true + +[server.service.retry_transaction] +max_backoff = '1s' +max_retry_count = 10 + +[server.service.user_cache] +buckets = 127 +exist_ttl = '5min' +inexist_ttl = '10s' diff --git a/configs/mgmtd_main_app.toml b/configs/mgmtd_main_app.toml new file mode 100644 index 0000000..77786ad --- /dev/null +++ b/configs/mgmtd_main_app.toml @@ -0,0 +1,2 @@ +allow_empty_node_id = true +node_id = 0 diff --git a/configs/mgmtd_main_launcher.toml b/configs/mgmtd_main_launcher.toml new file mode 100644 index 0000000..889870f --- /dev/null +++ b/configs/mgmtd_main_launcher.toml @@ -0,0 +1,44 @@ +allow_dev_version = true +cluster_id = '' +use_memkv = false + +[fdb] +casual_read_risky = false +clusterFile = '' +default_backoff = 0 +enableMultipleClient = false +externalClientDir = '' +externalClientPath = '' +multipleClientThreadNum = 4 +readonly = false +trace_file = '' +trace_format = 'json' + +[ib_devices] +allow_no_usable_devices = false +allow_unknown_zone = true +default_network_zone = 'UNKNOWN' +default_pkey_index = 0 +default_roce_pkey_index = 0 +default_traffic_class = 0 +device_filter = [] +fork_safe = true +prefer_ibdevice = true +skip_inactive_ports = true +skip_unusable_device = true +subnets = [] + +[kv_engine] +use_memkv = false + +[kv_engine.fdb] +casual_read_risky = false +clusterFile = '' +default_backoff = 0 +enableMultipleClient = false +externalClientDir = '' +externalClientPath = '' +multipleClientThreadNum = 4 +readonly = false +trace_file = '' +trace_format = 'json' diff --git a/configs/monitor_collector_main.toml b/configs/monitor_collector_main.toml new file mode 100644 index 0000000..459b6f1 --- /dev/null +++ b/configs/monitor_collector_main.toml @@ -0,0 +1,141 @@ +[common] +cluster_id = '' + +[common.ib_devices] +allow_unknown_zone = true +default_network_zone = 'UNKNOWN' +device_filter = [] +subnets = [] + +[[common.log.categories]] +categories = [ '.' ] +handlers = [ 'normal', 'err', 'fatal' ] +inherit = true +level = 'INFO' +propagate = 'NONE' + +[[common.log.handlers]] +async = true +file_path = '/var/log/3fs/monitor_collector_main.log' +max_file_size = '100MB' +max_files = 10 +name = 'normal' +rotate = true +rotate_on_open = false +start_level = 'NONE' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '/var/log/3fs/monitor_collector_main-err.log' +max_file_size = '100MB' +max_files = 10 +name = 'err' +rotate = true +rotate_on_open = false +start_level = 'ERR' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '/var/log/3fs/monitor_collector_main-fatal.log' +max_file_size = '100MB' +max_files = 10 +name = 'fatal' +rotate = true +rotate_on_open = false +start_level = 'FATAL' +stream_type = 'STDERR' +writer_type = 'STREAM' + +[server.base.independent_thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.base.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[[server.base.groups]] +#default_timeout = '1s' +#drop_connections_interval = '1h' +network_type = 'TCP' +services = [ 'MonitorCollector' ] +use_independent_thread_pool = false + +[server.base.groups.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.base.groups.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drop_connections = 0 +event_ack_batch = 128 +#gid_index = 0 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +pkey_index = 0 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 +traffic_class = 0 + +[server.base.groups.io_worker.transport_pool] +max_connections = 1 + +[server.base.groups.listener] +filter_list = [] +listen_port = 10000 +listen_queue_depth = 4096 +rdma_listen_ethernet = true +reuse_port = false + +[server.base.groups.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 + +[server.monitor_collector] +batch_commit_size = 4096 +conn_threads = 32 +queue_capacity = 204800 + +[server.monitor_collector.reporter] +type = 'clickhouse' + +[server.monitor_collector.reporter.clickhouse] +db = '' +host = '' +passwd = '' +port = '' +user = '' diff --git a/configs/storage_main.toml b/configs/storage_main.toml new file mode 100644 index 0000000..ed389f7 --- /dev/null +++ b/configs/storage_main.toml @@ -0,0 +1,510 @@ +[[common.log.categories]] +categories = [ '.' ] +handlers = [ 'normal', 'err', 'fatal' ] +inherit = true +level = 'INFO' +propagate = 'NONE' + +[[common.log.handlers]] +async = true +file_path = '/var/log/3fs/storage_main.log' +max_file_size = '100MB' +max_files = 10 +name = 'normal' +rotate = true +rotate_on_open = false +start_level = 'NONE' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '/var/log/3fs/storage_main-err.log' +max_file_size = '100MB' +max_files = 10 +name = 'err' +rotate = true +rotate_on_open = false +start_level = 'ERR' +stream_type = 'STDERR' +writer_type = 'FILE' + +[[common.log.handlers]] +async = false +file_path = '/var/log/3fs/storage_main-fatal.log' +max_file_size = '100MB' +max_files = 10 +name = 'fatal' +rotate = true +rotate_on_open = false +start_level = 'FATAL' +stream_type = 'STDERR' +writer_type = 'STREAM' + +[common.memory] +prof_active = false +prof_prefix = '' + +[common.monitor] +collect_period = '1s' +num_collectors = 1 + +[[common.monitor.reporters]] +type = 'monitor_collector' + +[common.monitor.reporters.monitor_collector] +remote_ip = "" + +[server] +speed_up_quit = true +use_coroutines_pool_read = true +use_coroutines_pool_update = true + +[server.aio_read_worker] +enable_io_uring = true +inflight_control_offset = 128 +ioengine = 'libaio' +max_events = 512 +min_complete = 128 +num_threads = 32 +queue_size = 4096 +wait_all_inflight = false + +[server.allocate_worker] +max_remain_groups = 8 +max_remain_ultra_groups = 4 +max_reserved_chunks = '1GB' +min_remain_groups = 4 +min_remain_ultra_groups = 0 + +[server.base.independent_thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.base.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 32 +num_proc_threads = 32 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[[server.base.groups]] +check_connections_interval = '1min' +connection_expiration_time = '1day' +network_type = 'RDMA' +services = [ 'StorageSerde' ] +use_independent_thread_pool = false + +[server.base.groups.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.base.groups.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.base.groups.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.base.groups.io_worker.transport_pool] +max_connections = 1 + +[server.base.groups.listener] +custom_tcp_nic_prefix = '' +domain_socket_index = 1 +filter_list = [] +listen_port = 8000 +listen_queue_depth = 4096 +rdma_accept_timeout = '15s' +rdma_listen_ethernet = true +reuse_port = false + +[server.base.groups.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[[server.base.groups]] +check_connections_interval = '1min' +connection_expiration_time = '1day' +network_type = 'TCP' +services = [ 'Core' ] +use_independent_thread_pool = true + +[server.base.groups.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.base.groups.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.base.groups.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.base.groups.io_worker.transport_pool] +max_connections = 1 + +[server.base.groups.listener] +domain_socket_index = 1 +filter_list = [] +listen_port = 9000 +listen_queue_depth = 4096 +rdma_accept_timeout = '15s' +rdma_listen_ethernet = true +reuse_port = false + +[server.base.groups.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.buffer_pool] +big_rdmabuf_count = 64 +big_rdmabuf_size = '64MB' +rdmabuf_count = 1024 +rdmabuf_size = '4MB' + +[server.check_worker] +disk_low_space_threshold = 0.95999999999999996 +disk_reject_create_chunk_threshold = 0.97999999999999998 +emergency_recycling_ratio = 0.94999999999999996 +update_target_size_interval = '10s' + +[server.client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[server.client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.client.io_worker.transport_pool] +max_connections = 1 + +[server.client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.client.rdma_control] +max_concurrent_transmission = 64 + +[server.client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.coroutines_pool_default] +coroutines_num = 64 +queue_size = 1024 +threads_num = 8 + +[server.coroutines_pool_read] +coroutines_num = 64 +queue_size = 1024 +threads_num = 8 + +[server.coroutines_pool_sync] +coroutines_num = 64 +queue_size = 1024 +threads_num = 8 + +[server.coroutines_pool_update] +coroutines_num = 64 +queue_size = 1024 +threads_num = 8 + +[server.dump_worker] +dump_interval = '1day' +dump_root_path = '' +high_cpu_usage_threshold = 100 + +[server.forward_client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[server.forward_client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[server.forward_client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[server.forward_client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[server.forward_client.io_worker.transport_pool] +max_connections = 1 + +[server.forward_client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[server.forward_client.rdma_control] +max_concurrent_transmission = 64 + +[server.forward_client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[server.mgmtd] +accept_incomplete_routing_info_during_mgmtd_bootstrapping = true +auto_extend_client_session_interval = '10s' +auto_heartbeat_interval = '10s' +auto_refresh_interval = '10s' +enable_auto_extend_client_session = false +enable_auto_heartbeat = true +enable_auto_refresh = true +mgmtd_server_addresses = [] +work_queue_size = 100 + +[server.reliable_forwarding] +max_inline_forward_bytes = '0' +retry_first_wait = '100ms' +retry_max_wait = '1s' +retry_total_time = '1min' + +[server.reliable_update] +clean_up_expired_clients = false +expired_clients_timeout = '1h' + +[server.storage] +apply_transmission_before_getting_semaphore = true +batch_read_ignore_chain_version = false +batch_read_job_split_size = 1024 +max_concurrent_rdma_reads = 256 +max_concurrent_rdma_writes = 256 +max_num_results_per_query = 100 +post_buffer_per_bytes = '64KB' +rdma_transmission_req_timeout = '0ns' +read_only = false + +[server.storage.event_trace_log] +dump_interval = '30s' +enabled = true +max_num_writers = 1 +max_row_group_length = 100000 +trace_file_dir = '.' + +[server.storage.write_worker] +bg_num_threads = 8 +num_threads = 32 +queue_size = 4096 + +[server.sync_meta_kv_worker] +sync_meta_kv_interval = '1min' + +[server.sync_worker] +batch_size = 16 +full_sync_chains = [] +full_sync_level = 'NONE' +num_channels = 1024 +num_threads = 16 +sync_start_timeout = '10s' + +[server.sync_worker.batch_concurrency_limiter] +max_concurrency = 64 + +[server.sync_worker.pool] +coroutines_num = 64 +enable_work_stealing = false +queue_size = 1024 + +[server.targets] +allow_disk_without_uuid = false +collect_all_fds = true +create_engine_path = true +space_info_cache_timeout = '5s' +target_num_per_path = 0 +target_paths = [] + +[server.targets.storage_target] +force_persist = true +kv_path = '' +migrate_kv_store = false +mutex_num = 257 +point_query_strategy = 'NONE' + +[server.targets.storage_target.file_store] +preopen_chunk_size_list = [] + +[server.targets.storage_target.kv_store] +create_if_missing = false +integrate_leveldb_log = false +leveldb_block_cache_size = '8GB' +leveldb_iterator_fill_cache = true +leveldb_shared_block_cache = true +leveldb_sst_file_size = '16MB' +leveldb_write_buffer_size = '16MB' +rocksdb_avoid_flush_during_recovery = false +rocksdb_avoid_flush_during_shutdown = false +rocksdb_avoid_unnecessary_blocking_io = false +rocksdb_block_cache_size = '8GB' +rocksdb_block_size = '4KB' +rocksdb_bloom_filter_bits_per_key = 10 +rocksdb_compression = 'kNoCompression' +rocksdb_enable_bloom_filter = true +rocksdb_enable_pipelined_write = false +rocksdb_enable_prefix_transform = true +rocksdb_keep_log_file_num = 10 +rocksdb_level0_file_num_compaction_trigger = 4 +rocksdb_lowest_used_cache_tier = 'kNonVolatileBlockTier' +rocksdb_max_manifest_file_size = '64MB' +rocksdb_num_levels = 7 +rocksdb_prepopulate_block_cache = 'kDisable' +rocksdb_readahead_size = '2MB' +rocksdb_shared_block_cache = true +rocksdb_stats_dump_period = '2min' +rocksdb_target_file_size_base = '64MB' +rocksdb_target_file_size_multiplier = 1 +rocksdb_threads_num = 8 +rocksdb_unordered_write = false +rocksdb_wal_recovery_mode = 'kTolerateCorruptedTailRecords' +rocksdb_write_buffer_size = '16MB' +sync_when_write = true +type = 'LevelDB' + +[server.targets.storage_target.meta_store] +allocate_size = '256MB' +punch_hole_batch_size = 16 +recycle_batch_size = 256 +removed_chunk_expiration_time = '3day' +removed_chunk_force_recycled_time = '1h' diff --git a/configs/storage_main_app.toml b/configs/storage_main_app.toml new file mode 100644 index 0000000..77786ad --- /dev/null +++ b/configs/storage_main_app.toml @@ -0,0 +1,2 @@ +allow_empty_node_id = true +node_id = 0 diff --git a/configs/storage_main_launcher.toml b/configs/storage_main_launcher.toml new file mode 100644 index 0000000..1e21a08 --- /dev/null +++ b/configs/storage_main_launcher.toml @@ -0,0 +1,93 @@ +allow_dev_version = true +cluster_id = '' + +[client] +default_compression_level = 0 +default_compression_threshold = '128KB' +default_log_long_running_threshold = '0ns' +default_report_metrics = false +default_send_retry_times = 1 +default_timeout = '1s' +enable_rdma_control = false +force_use_tcp = false + +[client.io_worker] +num_event_loop = 1 +rdma_connect_timeout = '5s' +read_write_rdma_in_event_thread = false +read_write_tcp_in_event_thread = false +tcp_connect_timeout = '1s' +wait_to_retry_send = '100ms' + +[client.io_worker.connect_concurrency_limiter] +max_concurrency = 4 + +[client.io_worker.ibsocket] +buf_ack_batch = 8 +buf_signal_batch = 8 +buf_size = 16384 +drain_timeout = '5s' +drop_connections = 0 +event_ack_batch = 128 +max_rd_atomic = 16 +max_rdma_wr = 128 +max_rdma_wr_per_post = 32 +max_sge = 16 +min_rnr_timer = 1 +record_bytes_per_peer = false +record_latency_per_peer = false +retry_cnt = 7 +rnr_retry = 0 +send_buf_cnt = 32 +sl = 0 +start_psn = 0 +timeout = 14 + +[client.io_worker.transport_pool] +max_connections = 1 + +[client.processor] +enable_coroutines_pool = true +max_coroutines_num = 256 +max_processing_requests_num = 4096 +response_compression_level = 1 +response_compression_threshold = '128KB' + +[client.rdma_control] +max_concurrent_transmission = 64 + +[client.thread_pool] +bg_thread_pool_stratetry = 'SHARED_QUEUE' +collect_stats = false +enable_work_stealing = false +io_thread_pool_stratetry = 'SHARED_QUEUE' +num_bg_threads = 2 +num_connect_threads = 2 +num_io_threads = 2 +num_proc_threads = 2 +proc_thread_pool_stratetry = 'SHARED_QUEUE' + +[ib_devices] +allow_no_usable_devices = false +allow_unknown_zone = true +default_network_zone = 'UNKNOWN' +default_pkey_index = 0 +default_roce_pkey_index = 0 +default_traffic_class = 0 +device_filter = [] +fork_safe = true +prefer_ibdevice = true +skip_inactive_ports = true +skip_unusable_device = true +subnets = [] + +[mgmtd_client] +accept_incomplete_routing_info_during_mgmtd_bootstrapping = true +auto_extend_client_session_interval = '10s' +auto_heartbeat_interval = '10s' +auto_refresh_interval = '10s' +enable_auto_extend_client_session = false +enable_auto_heartbeat = true +enable_auto_refresh = true +mgmtd_server_addresses = [] +work_queue_size = 100 diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 0000000..e50fed6 --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,374 @@ +# 3FS Setup Guide + +This section provides a manual deployment guide for setting up a six-node cluster with the cluster ID `stage`. + +## Installation prerequisites + +### Hardware specifications + +| Node | OS | IP | Memory | SSD | RDMA | +|----------|---------------|--------------|--------|------------|-------| +| meta | Ubuntu 22.04 | 192.168.1.1 | 128GB | - | RoCE | +| storage1 | Ubuntu 22.04 | 192.168.1.2 | 512GB | 14TB × 16 | RoCE | +| storage2 | Ubuntu 22.04 | 192.168.1.3 | 512GB | 14TB × 16 | RoCE | +| storage3 | Ubuntu 22.04 | 192.168.1.4 | 512GB | 14TB × 16 | RoCE | +| storage4 | Ubuntu 22.04 | 192.168.1.5 | 512GB | 14TB × 16 | RoCE | +| storage5 | Ubuntu 22.04 | 192.168.1.6 | 512GB | 14TB × 16 | RoCE | + +> **RDMA Configuration** +> 1. Assign IP addresses to RDMA NICs. Multiple RDMA NICs (InfiniBand or RoCE) are supported on each node. +> 2. Check RDMA connectivity between nodes using `ib_write_bw`. + +### Third-party dependencies + +In production environment, it is recommended to install FoundationDB and ClickHouse on dedicated nodes. + +| Service | Node | +|------------|-------------------------| +| [ClickHouse](https://clickhouse.com/docs/install) | meta | +| [FoundationDB](https://apple.github.io/foundationdb/administration.html) | meta | + +> **FoundationDB** +> 1. Ensure that the version of FoundationDB client matches the server version, or copy the corresponding version of `libfdb_c.so` to maintain compatibility. +> 2. Find the `fdb.cluster` file and `libfdb_c.so` at `/etc/foundationdb/fdb.cluster`, `/usr/lib/libfdb_c.so` on nodes with FoundationDB installed. + + +--- +## Step 0: Build 3FS + +Follow the [instructions](../README.md#build-3fs) to build 3FS. Binaries can be found in `build/bin`. + +### Services and clients + +The following steps show how to install 3FS services in `/opt/3fs/bin` and the config files in `/opt/3fs/etc`. + +| Service | Binary | Config files | NodeID | Node | +|------------|-------------------------|-----------------------------------------------------------------------------|--------|---------------| +| monitor | monitor_collector_main | [monitor_collector_main.toml](../configs/monitor_collector_main.toml) | - | meta | +| admin_cli | admin_cli | [admin_cli.toml](../configs/admin_cli.toml)
fdb.cluster | - | meta
storage1
storage2
storage3
storage4
storage5 | +| mgmtd | mgmtd_main | [mgmtd_main_launcher.toml](../configs/mgmtd_main_launcher.toml)
[mgmtd_main.toml](../configs/mgmtd_main.toml)
[mgmtd_main_app.toml](../configs/mgmtd_main_app.toml)
fdb.cluster | 1 | meta | +| meta | meta_main | [meta_main_launcher.toml](../configs/meta_main_launcher.toml)
[meta_main.toml](../configs/meta_main.toml)
[meta_main_app.toml](../configs/meta_main_app.toml)
fdb.cluster | 100 | meta | +| storage | storage_main | [storage_main_launcher.toml](../configs/storage_main_launcher.toml)
[storage_main.toml](../configs/storage_main.toml)
[storage_main_app.toml](../configs/storage_main_app.toml) | 10001~10005 | storage1
storage2
storage3
storage4
storage5 | +| client | hf3fs_fuse_main | [hf3fs_fuse_main_launcher.toml](../configs/hf3fs_fuse_main_launcher.toml)
[hf3fs_fuse_main.toml](../configs/hf3fs_fuse_main.toml) | - | meta | + +--- +## Step 1: Create ClickHouse tables for metrics + + Import the SQL file into ClickHouse: + ```bash + clickhouse-client -n < ~/3fs/deploy/sql/3fs-monitor.sql + ``` + +--- +## Step 2: Monitor service + +Install `monitor_collector` service on the **meta** node. + +1. Copy `monitor_collector_main` to `/opt/3fs/bin` and config files to `/opt/3fs/etc`, and create log directory `/var/log/3fs`. + ```bash + mkdir -p /opt/3fs/{bin,etc} + mkdir -p /var/log/3fs + cp ~/3fs/build/bin/monitor_collector_main /opt/3fs/bin + cp ~/3fs/configs/monitor_collector_main.toml /opt/3fs/etc + ``` +2. Update [`monitor_collector_main.toml`](../configs/monitor_collector_main.toml) to add a ClickHouse connection: + ```toml + [server.monitor_collector.reporter] + type = 'clickhouse' + + [server.monitor_collector.reporter.clickhouse] + db = '3fs' + host = '' + passwd = '' + port = '' + user = '' + ``` +3. Start monitor service: + ```bash + cp ~/3fs/deploy/systemd/monitor_collector_main.service /usr/lib/systemd/system + systemctl start monitor_collector_main + ``` + +Note that +> - Multiple instances of monitor services can be deployed behind a virtual IP address to share the traffic. +> - Other services communicate with the monitor service over a TCP connection. + +--- +## Step 3: Admin client +Install `admin_cli` on **all** nodes. + +1. Copy `admin_cli` to `/opt/3fs/bin` and config files to `/opt/3fs/etc`. + ```bash + mkdir -p /opt/3fs/{bin,etc} + rsync -avz meta:~/3fs/build/bin/admin_cli /opt/3fs/bin + rsync -avz meta:~/3fs/configs/admin_cli.toml /opt/3fs/etc + rsync -avz meta:/etc/foundationdb/fdb.cluster /opt/3fs/etc + ``` +2. Update [`admin_cli.toml`](../configs/admin_cli.toml) to set `cluster_id` and `clusterFile`: + ```toml + cluster_id = "stage" + + [fdb] + clusterFile = '/opt/3fs/etc/fdb.cluster' + ``` + +The full help documentation for `admin_cli` can be displayed by running the following command: + +```bash +/opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml help +``` + +--- +## Step 4: Mgmtd service +Install `mgmtd` service on **meta** node. + +1. Copy `mgmtd_main` to `/opt/3fs/bin` and config files to `/opt/3fs/etc`. + ```bash + cp ~/3fs/build/bin/mgmtd_main /opt/3fs/bin + cp ~/3fs/configs/{mgmtd_main.toml,mgmtd_main_launcher.toml,mgmtd_main_app.toml} /opt/3fs/etc + ``` +2. Update config files: + - Set mgmtd `node_id = 1` in [`mgmtd_main_app.toml`](../configs/mgmtd_main_app.toml). + - Edit [`mgmtd_main_launcher.toml`](../configs/mgmtd_main_launcher.toml) to set the `cluster_id` and `clusterFile`: + ```toml + cluster_id = "stage" + + [fdb] + clusterFile = '/opt/3fs/etc/fdb.cluster' + ``` + - Set monitor address in [`mgmtd_main.toml`](../configs/mgmtd_main.toml): + ```toml + [common.monitor.reporters.monitor_collector] + remote_ip = "192.168.1.1:10000" + ``` +3. Initialize the cluster: + ```bash + /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml "init-cluster --mgmtd /opt/3fs/etc/mgmtd_main.toml 1 1048576 16" + ``` + + The parameters of `admin_cli`: + > - `1` the chain table ID + > - `1048576` the chunk size in bytes + > - `16` the file strip size + + Run `help init-cluster` for full documentation. +4. Start mgmtd service: + ```bash + cp ~/3fs/deploy/systemd/mgmtd_main.service /usr/lib/systemd/system + systemctl start mgmtd_main + ``` +5. Run `list-nodes` command to check if the cluster has been successfully initialized: + ```bash + /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' "list-nodes" + ``` + +If multiple instances of `mgmtd` services deployed, one of the `mgmtd` services is elected as the primary; others are secondaries. Automatic failover occurs when the primary fails. + +--- +## Step 5: Meta service +Install `meta` service on **meta** node. +1. Copy `meta_main` to `/opt/3fs/bin` and config files to `/opt/3fs/etc`. + ```bash + cp ~/3fs/build/bin/meta_main /opt/3fs/bin + cp ~/3fs/configs/{meta_main_launcher.toml,meta_main.toml,meta_main_app.toml} /opt/3fs/etc + ``` +2. Update config files: + - Set meta `node_id = 100` in [`meta_main_app.toml`](../configs/meta_main_app.toml). + - Set `cluster_id`, `clusterFile` and mgmtd address in [`meta_main_launcher.toml`](../configs/meta_main_launcher.toml): + ```toml + cluster_id = "stage" + + [mgmtd_client] + mgmtd_server_addresses = ["RDMA://192.168.1.1:8000"] + ``` + - Set mgmtd and monitor addresses in [`meta_main.toml`](../configs/meta_main.toml). + ```toml + [server.mgmtd_client] + mgmtd_server_addresses = ["RDMA://192.168.1.1:8000"] + + [common.monitor.reporters.monitor_collector] + remote_ip = "192.168.1.1:10000" + + [server.fdb] + clusterFile = '/opt/3fs/etc/fdb.cluster' + ``` +3. Config file of meta service is managed by mgmtd service. Use `admin_cli` to upload the config file to mgmtd: + ```bash + /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' "set-config --type META --file /opt/3fs/etc/meta_main.toml" + ``` +4. Start meta service: + ```bash + cp ~/3fs/deploy/systemd/meta_main.service /usr/lib/systemd/system + systemctl start meta_main + ``` +5. Run `list-nodes` command to check if meta service has joined the cluster: + ```bash + /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' "list-nodes" + ``` + +If multiple instances of `meta` services deployed, meta requests will be evenly distributed to all instances. + +--- +## Step 6: Storage service +Install `storage` service on **storage** node. +1. Format the attached 16 SSDs as XFS and mount at `/storage/data{1..16}`, then create data directories `/storage/data{1..16}/3fs` and log directory `/var/log/3fs`. + ```bash + mkdir -p /storage/data{1..16} + mkdir -p /var/log/3fs + for i in {1..16};do mkfs.xfs -L data${i} -s size=4096 /dev/nvme${i}n1;mount -o noatime,nodiratime -L data${i} /storage/data${i};done + mkdir -p /storage/data{1..16}/3fs + ``` +2. Increase the max number of asynchronous aio requests: + ```bash + sysctl -w fs.aio-max-nr=67108864 + ``` +3. Copy `storage_main` to `/opt/3fs/bin` and config files to `/opt/3fs/etc`. + ```bash + rsync -avz meta:~/3fs/build/bin/storage_main /opt/3fs/bin + rsync -avz meta:~/3fs/configs/{storage_main_launcher.toml,storage_main.toml,storage_main_app.toml} /opt/3fs/etc + ``` +4. Update config files: + - Set `node_id` in [`storage_main_app.toml`](../configs/storage_main_app.toml). Each storage service is assigned a unique id between `10001` and `10005`. + - Set `cluster_id` and mgmtd address in [`storage_main_launcher.toml`](../configs/storage_main_launcher.toml). + ```toml + cluster_id = "stage" + + [mgmtd_client] + mgmtd_server_addresses = ["RDMA://192.168.1.1:8000"] + ``` + - Add target paths in [`storage_main.toml`](../configs/storage_main.toml): + ```toml + [server.mgmtd] + mgmtd_server_addresses = ["RDMA://192.168.1.1:8000"] + + [common.monitor.reporters.monitor_collector] + remote_ip = "192.168.1.1:10000" + + [server.targets] + target_paths = ["/storage/data1/3fs","/storage/data2/3fs","/storage/data3/3fs","/storage/data4/3fs","/storage/data5/3fs","/storage/data6/3fs","/storage/data7/3fs","/storage/data8/3fs","/storage/data9/3fs","/storage/data10/3fs","/storage/data11/3fs","/storage/data12/3fs","/storage/data13/3fs","/storage/data14/3fs","/storage/data15/3fs","/storage/data16/3fs",] + ``` +5. Config file of storage service is managed by mgmtd service. Use `admin_cli` to upload the config file to mgmtd: + ```bash + /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' "set-config --type STORAGE --file /opt/3fs/etc/storage_main.toml" + ``` +6. Start storage service: + ```bash + rsync -avz meta:~/3fs/deploy/systemd/storage_main.service /usr/lib/systemd/system + systemctl start storage_main + ``` +7. Run `list-nodes` command to check if storage service has joined the cluster: + ``` + /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' "list-nodes" + ``` + +--- +## Step 7: Create admin user, storage targets and chain table +1. Create an admin user: + ```bash + /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' "user-add --root --admin 0 root" + ``` + The admin token is printed to the console, save it to `/opt/3fs/etc/token.txt`. +2. Generate `admin_cli` commands to create storage targets on 5 storage nodes (16 SSD per node, 6 targets per SSD). + - Follow instructions at [here](data_placement/README.md) to install Python packages. + ```bash + pip install -r ~/3fs/deploy/data_placement/requirements.txt + python ~/3fs/deploy/data_placement/src/model/data_placement.py \ + -ql -relax -type CR --num_nodes 5 --replication_factor 3 --min_targets_per_disk 6 + python ~/3fs/deploy/data_placement/src/setup/gen_chain_table.py \ + --chain_table_type CR --node_id_begin 10001 --node_id_end 10005 \ + --num_disks_per_node 16 --num_targets_per_disk 6 \ + --target_id_prefix 1 --chain_id_prefix 9 \ + --incidence_matrix_path output/DataPlacementModel-v_5-b_10-r_6-k_3-λ_2-lb_1-ub_1/incidence_matrix.pickle + ``` + The following 3 files will be generated in `output` directory: `create_target_cmd.txt`, `generated_chains.csv`, and `generated_chain_table.csv`. +3. Create storage targets: + ```bash + /opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' --config.user_info.token $(<"/opt/3fs/etc/token.txt") < output/create_target_cmd.txt + ``` +4. Upload chains to mgmtd service: + ```bash + /opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' --config.user_info.token $(<"/opt/3fs/etc/token.txt") "upload-chains output/generated_chains.csv" + ``` +5. Upload chain table to mgmtd service: + ```bash + /opt/3fs/bin/admin_cli --cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' --config.user_info.token $(<"/opt/3fs/etc/token.txt") "upload-chain-table --desc stage 1 output/generated_chain_table.csv" + ``` +6. List chains and chain tables to check if they have been correctly uploaded: + ```bash + /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' "list-chains" + /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' "list-chain-tables" + ``` +--- +## Step 8: FUSE client +For simplicity FUSE client is deployed on the **meta** node in this guide. However, we strongly advise against deploying clients on service nodes in production environment. + +1. Copy `hf3fs_fuse_main` to `/opt/3fs/bin` and config files to `/opt/3fs/etc`. + ```bash + cp ~/3fs/build/bin/hf3fs_fuse_main /opt/3fs/bin + cp ~/3fs/configs/{hf3fs_fuse_main_launcher.toml,hf3fs_fuse_main.toml,hf3fs_fuse_main_app.toml} /opt/3fs/etc + ``` +2. Create the mount point: + ```bash + mkdir -p /3fs/stage + ``` +3. Set cluster ID, mountpoint, token file and mgmtd address in [`hf3fs_fuse_main_launcher.toml`](../configs/hf3fs_fuse_main_launcher.toml) + ```toml + cluster_id = "stage" + mountpoint = '/3fs/stage' + token_file = '/opt/3fs/etc/token.txt' + + [mgmtd_client] + mgmtd_server_addresses = ["RDMA://192.168.1.1:8000"] + ``` +4. Set mgmtd and monitor address in [`hf3fs_fuse_main.toml`](../configs/hf3fs_fuse_main.toml). + ```toml + [mgmtd] + mgmtd_server_addresses = ["RDMA://192.168.1.1:8000"] + + [common.monitor.reporters.monitor_collector] + remote_ip = "192.168.1.1:10000" + ``` +5. Config file of FUSE client is also managed by mgmtd service. Use `admin_cli` to upload the config file to mgmtd: + ```bash + /opt/3fs/bin/admin_cli -cfg /opt/3fs/etc/admin_cli.toml --config.mgmtd_client.mgmtd_server_addresses '["RDMA://192.168.1.1:8000"]' "set-config --type FUSE --file /opt/3fs/etc/hf3fs_fuse_main.toml" + ``` +6. Start FUSE client: + ```bash + cp ~/3fs/deploy/systemd/hf3fs_fuse_main.service /usr/lib/systemd/system + systemctl start hf3fs_fuse_main + ``` +7. Check if 3FS has been mounted at `/3fs/stage`: + ```bash + mount | grep '/3fs/stage' + ``` + +## FAQ +
+ How to troubleshoot admin_cli init-cluster error? + + If mgmtd fails to start after running `init-cluster`, the most likely cause is an error in `mgmtd_main.toml`. Any changes to this file require clearing all FoundationDB data and re-running `init-cluster` +
+ +--- +
+ How to build a single-node cluster? + + A minimum of two storage services is required for data replication. If set `--num-nodes=1`, the `gen_chain_table.py` script will fail. In a test environment, this limitation can be bypassed by deploying multiple storage services on a single machine. +
+ +--- +
+ How to update config files? + + All config files are managed by mgmtd. If any `*_main.toml` is updated, such as `storage_main.toml`, the modified file should be uploaded using `admin_cli set-config`. +
+ +--- +
+ How to troubleshoot common deployment issues? + + When encountering any error during deployment, + - Check the log messages in `stdout/stderr` using `journalctl`, especially during service startup. + - Check log files stored in `/var/log/3fs/` on service and client nodes. + - Ensure that the directory `/var/log/3fs/` exists before starting any service. +
diff --git a/deploy/data_placement/.gitignore b/deploy/data_placement/.gitignore new file mode 100644 index 0000000..f8c208b --- /dev/null +++ b/deploy/data_placement/.gitignore @@ -0,0 +1,17 @@ +__pycache__ +.ipynb_checkpoints +.tmp/ +dist/ +build/ +output/ +*.egg-info/ +test/scratch/ +test/runtime/ +*.log +*.pyc +*.xml +.tmp/ +.idea +.coverage +.vscode/ +.hypothesis/ diff --git a/deploy/data_placement/README.md b/deploy/data_placement/README.md new file mode 100644 index 0000000..5137a05 --- /dev/null +++ b/deploy/data_placement/README.md @@ -0,0 +1,72 @@ +# How to generate chain tables + +Suppose we are going to setup a small 3FS cluster: +- 3 replicas for each chunk +- 5 storage nodes: `10001 ... 10005` +- 16 SSDs attached to each node +- 6 storage targets on each SSD + +## Install dependencies + +The data placement problem is formulated using [Pyomo](https://www.pyomo.org/) and solved with the [HiGHS](https://highs.dev/) solver. Install them and other dependencies: + +```bash +$ cd deploy/data_placement +$ pip install -r requirements.txt +``` + +## Generate chain table + +First generate a solution of the data placement problem. + +```bash +$ cd deploy/data_placement +$ python src/model/data_placement.py -ql -relax -type CR --num_nodes 5 --replication_factor 3 --min_targets_per_disk 6 --init_timelimit 600 + +... + +2025-02-24 14:25:13.623 | SUCCESS | __main__:solve:165 - optimal solution: +- Status: ok + Termination condition: optimal + Termination message: TerminationCondition.optimal + +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 1,2: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 1,3: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 1,4: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 1,5: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 2,1: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 2,3: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 2,4: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 2,5: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 3,1: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 3,2: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 3,4: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 3,5: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 4,1: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 4,2: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 4,3: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 4,5: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 5,1: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 5,2: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 5,3: 1.5 +2025-02-24 14:25:13.624 | DEBUG | __main__:check_solution:322 - 5,4: 1.5 +2025-02-24 14:25:13.624 | INFO | __main__:check_solution:331 - min_peer_traffic=1.5 max_peer_traffic=1.5 +2025-02-24 14:25:13.624 | INFO | __main__:check_solution:332 - total_traffic=30.0 max_total_traffic=30 +2025-02-24 14:25:14.147 | SUCCESS | __main__:run:147 - saved solution to: output/DataPlacementModel-v_5-b_10-r_6-k_3-λ_2-lb_1-ub_1 +``` + +Note that some combinations of `--num_nodes` and `--replication_factor` may have no solution. + +Then generate commands to create/remove storage targets and the chain table. + +```bash +$ python src/setup/gen_chain_table.py --chain_table_type CR --node_id_begin 10001 --node_id_end 10005 --num_disks_per_node 16 --num_targets_per_disk 6 --incidence_matrix_path output/DataPlacementModel-v_5-b_10-r_6-k_3-λ_2-lb_1-ub_1/incidence_matrix.pickle + +$ ls -1 output/ +DataPlacementModel-v_5-b_10-r_6-k_3-λ_2-lb_1-ub_1 +appsi_highs.log +create_target_cmd.txt +generated_chain_table.csv +generated_chains.csv +remove_target_cmd.txt +``` diff --git a/deploy/data_placement/requirements.txt b/deploy/data_placement/requirements.txt new file mode 100644 index 0000000..5559c8a --- /dev/null +++ b/deploy/data_placement/requirements.txt @@ -0,0 +1,12 @@ +psutil +pandas +plotly +loguru +highspy==1.8.0 +pyomo==6.8.0 +coverage~=7.4.4 +pytest==8.2.1 +pytest-cov==5.0.0 +pytest-forked==1.6.0 +pytest-xdist==3.6.1 +pytest-timeout==2.3.1 diff --git a/deploy/data_placement/src/__init__.py b/deploy/data_placement/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/deploy/data_placement/src/model/data_placement.py b/deploy/data_placement/src/model/data_placement.py new file mode 100644 index 0000000..9ade651 --- /dev/null +++ b/deploy/data_placement/src/model/data_placement.py @@ -0,0 +1,549 @@ +import math +import pickle +import random +import time +import psutil +import os.path +import pandas as pd +import pyomo.environ as po +import plotly.express as px +from typing import Dict, Generator, Literal, Tuple +from loguru import logger +from pyomo.opt import SolverStatus, TerminationCondition + + +class InfeasibleModel(Exception): + pass + +class SolverTimeout(Exception): + pass + +class SolverError(Exception): + pass + +class InvalidSolution(Exception): + pass + + +class DataPlacementModel(object): + + def __init__(self, chain_table_type: Literal["EC", "CR"], num_nodes, group_size, num_groups=None, num_targets_per_disk=None, min_targets_per_disk=1, bibd_only=False, qlinearize=False, relax_lb=1, relax_ub=0): + if num_targets_per_disk is None: + num_nodes, num_groups, num_targets_per_disk, group_size = DataPlacementModel.find_params(num_nodes, group_size, min_r=min_targets_per_disk, bibd_only=bibd_only) + self.chain_table_type = chain_table_type + self.num_nodes = num_nodes + self.group_size = group_size + self.num_targets_per_disk = num_targets_per_disk + self.num_groups = num_groups or self.num_targets_total // self.group_size + self.bibd_only = bibd_only + self.qlinearize = qlinearize + self.relax_lb = relax_lb + self.relax_ub = relax_ub + + def __repr__(self): + v, b, r, k, λ = self.v, self.b, self.r, self.k, self.λ + lb, ub = self.relax_lb, self.relax_ub + return f"{self.__class__.__name__}-{v=},{b=},{r=},{k=},{λ=},{lb=},{ub=}" + + __str__ = __repr__ + + @property + def path_name(self): + return str(self).translate(str.maketrans(' ,:=', '---_')) + + @property + def v(self): + return self.num_nodes + + @property + def b(self): + return self.num_groups + + @property + def r(self): + return self.num_targets_per_disk + + @property + def k(self): + return self.group_size + + @property + def λ(self): + return self.max_recovery_traffic_on_peer + + @property + def num_targets_used(self): + return self.num_groups * self.group_size + + @property + def num_targets_total(self): + return self.num_nodes * self.num_targets_per_disk + + @property + def all_targets_used(self): + return self.num_targets_used == self.num_targets_total + + @property + def balanced_peer_traffic(self): + return self.all_targets_used and self.sum_recovery_traffic_per_failure % (self.num_nodes-1) == 0 + + @property + def recovery_traffic_factor(self): + return (self.group_size - 1) if self.chain_table_type == "EC" else 1 + + @property + def sum_recovery_traffic_per_failure(self): + return self.num_targets_per_disk * self.recovery_traffic_factor + + @property + def max_recovery_traffic_on_peer(self): + return math.ceil(self.sum_recovery_traffic_per_failure / (self.num_nodes-1)) + + @property + def balanced_incomplete_block_design(self): + return self.bibd_only and self.balanced_peer_traffic and self.relax_ub == 0 + + @staticmethod + def find_params(v, k, min_r=1, max_r=100, bibd_only=False): + if bibd_only: min_r = max(min_r, k) + for r in range(min_r, max_r): + if v * r % k == 0 and r * (k - 1) >= v - 1: + b = v * r // k + if not bibd_only or r * (k - 1) % (v - 1) == 0: + return v, b, r, k + raise ValueError(f"cannot find valid params: {v=}, {k=}") + + def run(self, pyomo_solver=None, threads=psutil.cpu_count(logical=False), init_timelimit=1800, max_timelimit=3600*2, auto_relax=False, output_root="output", verbose=False, add_elapsed_time=None): + init_relax_lb = self.relax_lb + init_relax_ub = self.relax_ub + timelimit = 0 + num_loops = self.max_recovery_traffic_on_peer*2 + os.makedirs(output_root, exist_ok=True) + + for loop in range(num_loops): + try: + logger.info(f"solving model with {pyomo_solver} #{loop}: {self}") + if add_elapsed_time is not None: + add_elapsed_time() + timelimit = min(timelimit + init_timelimit, max_timelimit) + instance = self.solve(pyomo_solver, threads, timelimit, output_root, verbose) + if add_elapsed_time is not None: + add_elapsed_time(f"solve model time (lb={self.relax_lb}, ub={self.relax_ub})") + except (InfeasibleModel, SolverTimeout) as ex: + logger.error(f"cannot find solution for current params: {ex}") + if auto_relax: + self.relax_lb = init_relax_lb + (loop+1) // 2 + self.relax_ub = init_relax_ub + (loop+2) // 2 + continue + elif loop + 1 < num_loops: + logger.critical(f"failed to find solution after {num_loops} attempts") + raise ex + else: + raise ex + else: + output_path = os.path.join(output_root, self.path_name) + os.makedirs(output_path, exist_ok=True) + self.save_solution(instance, output_path) + self.visualize_solution(instance, output_path) + logger.success(f"saved solution to: {output_path}") + return instance + + logger.catch(reraise=True, message="failed to solve model") + def solve(self, pyomo_solver=None, threads=psutil.cpu_count(logical=False), timelimit=3600, output_path="output", verbose=False): + if "highs" in pyomo_solver: + self.qlinearize = True + + instance = self.build_model() + if verbose: instance.pprint() + + try: + results = self.solve_model(instance, pyomo_solver, threads, timelimit, output_path) + except RuntimeError as ex: + raise SolverError("unknown runtime error") from ex + + if (results.solver.status == SolverStatus.ok) and (results.solver.termination_condition == TerminationCondition.optimal): + logger.success(f"optimal solution: {str(results.solver)}") + if pyomo_solver is not None: instance.solutions.load_from(results) + elif results.solver.termination_condition == TerminationCondition.infeasible: + raise InfeasibleModel(f"infeasible: {str(results.solver)}") + elif results.solver.termination_condition in (TerminationCondition.maxTimeLimit, TerminationCondition.maxIterations): + raise SolverTimeout(f"timeout: {str(results.solver)}") + else: + raise SolverError(f"error: {str(results.solver)}") + + if verbose: self.print_solution(instance) + try: + self.check_solution(instance) + except AssertionError as ex: + raise InvalidSolution from ex + return instance + + def build_model(self): + logger.info(f"{self.num_nodes=} {self.num_targets_per_disk=} {self.group_size=} {self.num_groups=} {self.qlinearize=} {self.relax_lb=} {self.relax_ub=}") + # v >= k + assert self.num_nodes >= self.group_size, f"{self.num_nodes=} < {self.group_size=}" + # Fisher's inequality + if self.balanced_incomplete_block_design: + # b >= v + assert self.num_groups >= self.num_nodes, f"{self.num_groups=} < {self.num_nodes=}" + # r >= k + assert self.num_targets_per_disk >= self.group_size, f"{self.num_targets_per_disk=} < {self.group_size=}" + + logger.info(f"{self.sum_recovery_traffic_per_failure=} {self.max_recovery_traffic_on_peer=}") + if self.sum_recovery_traffic_per_failure < self.num_nodes - 1: + logger.warning(f"some disks do not share recovery traffic: {self.sum_recovery_traffic_per_failure=} < {self.num_nodes=} - 1") + + logger.info(f"{self.all_targets_used=} {self.balanced_peer_traffic=}") + logger.info(f"{self.num_targets_used=} {self.num_targets_total=}") + if self.num_targets_used < self.num_targets_total: + logger.warning(f"some disks have unused targets: {self.num_targets_used=} < {self.num_targets_total=}") + else: + assert self.num_targets_used == self.num_targets_total, f"{self.num_targets_used=} > {self.num_targets_total=}" + + model = po.ConcreteModel() + # index sets + model.disks = po.RangeSet(1, self.num_nodes) + model.target_idxs = po.RangeSet(1, self.num_targets_per_disk) + model.targets = model.disks * model.target_idxs + model.groups = po.RangeSet(1, self.num_groups) + + def disk_pairs_init(model): + for disk in model.disks: + for peer in model.disks: + if peer > disk: + yield (disk, peer) + model.disk_pairs = po.Set(dimen=2, initialize=disk_pairs_init) + + # variables + + model.disk_used_by_group = po.Var(model.disks, model.groups, domain=po.Binary) + if self.qlinearize: + model.disk_in_same_group = po.Var(model.disk_pairs, model.groups, domain=po.Binary) + + # constraints + + def calc_disk_in_same_group(model, disk, peer, group): + return model.disk_used_by_group[disk,group] * model.disk_used_by_group[peer,group] + + def define_disk_in_same_group_lower_bound(model, disk, peer, group): + return model.disk_used_by_group[disk,group] + model.disk_used_by_group[peer,group] <= model.disk_in_same_group[disk,peer,group] + 1 + + def define_disk_in_same_group_upper_bound1(model, disk, peer, group): + return model.disk_in_same_group[disk,peer,group] <= model.disk_used_by_group[disk,group] + + def define_disk_in_same_group_upper_bound2(model, disk, peer, group): + return model.disk_in_same_group[disk,peer,group] <= model.disk_used_by_group[peer,group] + + if self.qlinearize: + model.define_disk_in_same_group_lower_bound_eqn = po.Constraint(model.disk_pairs, model.groups, rule=define_disk_in_same_group_lower_bound) + model.define_disk_in_same_group_upper_bound1_eqn = po.Constraint(model.disk_pairs, model.groups, rule=define_disk_in_same_group_upper_bound1) + model.define_disk_in_same_group_upper_bound2_eqn = po.Constraint(model.disk_pairs, model.groups, rule=define_disk_in_same_group_upper_bound2) + + def each_disk_has_limited_capcity(model, disk): + if self.all_targets_used: + return po.quicksum(model.disk_used_by_group[disk,group] for group in model.groups) == self.num_targets_per_disk + else: + return po.quicksum(model.disk_used_by_group[disk,group] for group in model.groups) <= self.num_targets_per_disk + model.each_disk_has_limited_capcity_eqn = po.Constraint(model.disks, rule=each_disk_has_limited_capcity) + + def enough_disks_assigned_to_each_group(model, group): + return po.quicksum(model.disk_used_by_group[disk,group] for disk in model.disks) == self.group_size + model.enough_disks_assigned_to_each_group_eqn = po.Constraint(model.groups, rule=enough_disks_assigned_to_each_group) + + def calc_peer_recovery_traffic(model, disk, peer): + if self.qlinearize: + return po.quicksum(model.disk_in_same_group[disk,peer,group] for group in model.groups) + else: + return po.quicksum(calc_disk_in_same_group(model, disk, peer, group) for group in model.groups) + + def peer_recovery_traffic_upper_bound(model, disk, peer): + if self.balanced_incomplete_block_design: + return calc_peer_recovery_traffic(model, disk, peer) == self.max_recovery_traffic_on_peer + else: + return calc_peer_recovery_traffic(model, disk, peer) <= self.max_recovery_traffic_on_peer + self.relax_ub + model.peer_recovery_traffic_upper_bound_eqn = po.Constraint(model.disk_pairs, rule=peer_recovery_traffic_upper_bound) + + def peer_recovery_traffic_lower_bound(model, disk, peer): + return calc_peer_recovery_traffic(model, disk, peer) >= max(0, self.max_recovery_traffic_on_peer - self.relax_lb) + + if self.balanced_incomplete_block_design: + logger.info(f"lower bound not needed for balanced incomplete block design (BIBD)") + elif self.all_targets_used: + logger.info(f"lower bound imposed on peer traffic: {self.relax_lb=} {self.qlinearize=} {self.all_targets_used=}") + model.peer_recovery_traffic_lower_bound_eqn = po.Constraint(model.disk_pairs, rule=peer_recovery_traffic_lower_bound) + else: + logger.info(f"lower bound not imposed on peer traffic: {self.relax_lb=} {self.qlinearize=} {self.all_targets_used=}") + + def total_recovery_traffic(model): + return po.summation(model.disk_in_same_group) * 2 + + # model.obj = po.Objective(rule=total_recovery_traffic, sense=po.minimize) + model.obj = po.Objective(expr=1) # dummy objective + return model + + def solve_model(self, instance, pyomo_solver, threads, timelimit, output_path): + if pyomo_solver is not None: + solver = po.SolverFactory(pyomo_solver) + return solver.solve(instance, options={"threads": str(threads), "log_file": os.path.join(output_path, f"{pyomo_solver}.log")}, load_solutions=False, timelimit=timelimit, tee=True) + else: + raise ValueError(f"no solver specified") + + def get_peer_traffic(self, instance) -> Dict[Tuple[int,int], int]: + peer_traffic_map = {} + for disk in instance.disks: + for peer in instance.disks: + if disk == peer: continue + peer_traffic_map[(disk, peer)] = sum( + po.value(instance.disk_used_by_group[disk,group]) * + po.value(instance.disk_used_by_group[peer,group]) + for group in instance.groups) * self.recovery_traffic_factor / (self.group_size - 1) + return peer_traffic_map + + def get_incidence_matrix(self, instance) -> Dict[Tuple[int, int], bool]: + incidence_matrix = {} + for disk in instance.disks: + for group in instance.groups: + val = instance.disk_used_by_group[disk,group] + if math.isclose(po.value(val), 1): + incidence_matrix[(disk,group)] = True + if self.all_targets_used: + assert len(incidence_matrix) % self.num_nodes == 0, f"{len(incidence_matrix)=} % {self.num_nodes=}" + assert len(incidence_matrix) % self.num_groups == 0, f"{len(incidence_matrix)=} % {self.num_groups=}" + return incidence_matrix + + def check_solution(self, instance): + has_peer_traffic_lower_bound = False + for c in instance.component_objects(po.Constraint): + if "peer_recovery_traffic_lower_bound_eqn" in str(c): + has_peer_traffic_lower_bound = True + + peer_traffic_map = self.get_peer_traffic(instance) + for (disk, peer), peer_traffic in peer_traffic_map.items(): + logger.debug(f"{disk},{peer}: {peer_traffic:.1f}") + assert peer_traffic <= self.max_recovery_traffic_on_peer + self.relax_ub + 1e-5, f"{peer_traffic=} > {self.max_recovery_traffic_on_peer=} + {self.relax_ub}" + if has_peer_traffic_lower_bound: + assert peer_traffic >= max(0, self.max_recovery_traffic_on_peer - self.relax_lb) - 1e-5, f"{peer_traffic=} < {self.max_recovery_traffic_on_peer=} - {self.relax_lb}" + + min_peer_traffic = min(peer_traffic_map.values()) + max_peer_traffic = max(peer_traffic_map.values()) + total_traffic = sum(peer_traffic_map.values()) + max_total_traffic = self.num_nodes * self.sum_recovery_traffic_per_failure + logger.info(f"{min_peer_traffic=:.1f} {max_peer_traffic=:.1f}") + logger.info(f"{total_traffic=} {max_total_traffic=}") + + peer_traffic_diff = max_peer_traffic - min_peer_traffic + if has_peer_traffic_lower_bound: + assert peer_traffic_diff <= self.relax_ub + self.relax_lb + 1e-5, f"{peer_traffic_diff=}" + if self.balanced_incomplete_block_design: + assert math.isclose(peer_traffic_diff, 0.0, abs_tol=1e-9), f"{peer_traffic_diff=}" + + assert total_traffic <= max_total_traffic + 1e-5 + return total_traffic, min_peer_traffic, max_peer_traffic + + def print_solution(self, instance): + for disk in instance.disks: + for group in instance.groups: + val = instance.disk_used_by_group[disk,group] + if math.isclose(po.value(val), 1): + logger.info(f"{val}: {po.value(val)}") + + def save_solution(self, instance, output_path: str="output"): + incidence_matrix = self.get_incidence_matrix(instance) + with open(os.path.join(output_path, "incidence_matrix.pickle"), "wb") as fout: + pickle.dump(incidence_matrix, fout) + + peer_traffic_map = self.get_peer_traffic(instance) + with open(os.path.join(output_path, "peer_traffic_map.pickle"), "wb") as fout: + pickle.dump(peer_traffic_map, fout) + + def visualize_solution(self, instance, output_path: str="output", write_html=True): + incidence_matrix = self.get_incidence_matrix(instance) + disks, groups = zip(*incidence_matrix.keys()) + incidence_df = pd.DataFrame(zip(disks, groups), columns=["disk", "group"]) + + peer_traffic_map = self.get_peer_traffic(instance) + min_peer_traffic = min(peer_traffic_map.values()) + max_peer_traffic = max(peer_traffic_map.values()) + + fig = px.scatter( + incidence_df, + x="disk", + y="group", + title=f"{self}, min/max peer traffic: {min_peer_traffic:.1f}/{max_peer_traffic:.1f}") + fig.update_layout( + xaxis_title="Nodes", + yaxis_title="Groups", + xaxis = dict( + tickmode = 'array', + tickvals = list(range(1, self.num_nodes+1)), + ), + yaxis = dict( + tickmode = 'array', + tickvals = list(range(1, self.num_groups+1)), + ), + ) + + if write_html: + fig.write_html(os.path.join(output_path, f"data_placement.html"), include_plotlyjs=True) + return fig + + +class RebalanceTrafficModel(DataPlacementModel): + + def __init__(self, existing_incidence_matrix, chain_table_type: Literal["EC", "CR"], num_nodes, group_size, num_groups=None, num_targets_per_disk=None, min_targets_per_disk=1, bibd_only=False, qlinearize=False, relax_lb=1, relax_ub=0): + self.existing_incidence_matrix = existing_incidence_matrix + self.existing_disks, self.existing_groups = zip(*existing_incidence_matrix.keys()) + num_existing_targets_per_disk = math.ceil(self.total_existing_targets / self.num_existing_disk) + min_targets_per_disk = max(min_targets_per_disk, num_existing_targets_per_disk) + if num_targets_per_disk is None: + num_nodes, num_groups, num_targets_per_disk, group_size = DataPlacementModel.find_params(num_nodes, group_size, min_r=min_targets_per_disk, bibd_only=bibd_only) + else: + assert num_targets_per_disk >= min_targets_per_disk + super().__init__(chain_table_type, num_nodes, group_size, num_groups, num_targets_per_disk, min_targets_per_disk, bibd_only, qlinearize, relax_lb, relax_ub) + + @property + def num_existing_disk(self): + return max(self.existing_disks) + + @property + def num_existing_groups(self): + return max(self.existing_groups) + + @property + def total_existing_targets(self): + return len(self.existing_disks) + + @property + def existing_group_size(self): + assert self.total_existing_targets % self.num_existing_groups == 0, f"{self.total_existing_targets=} % {self.num_existing_groups=}" + return self.total_existing_targets // self.num_existing_groups + + def build_model(self): + max_existing_targets_per_disk = math.ceil(self.total_existing_targets / self.num_nodes) + logger.info(f"{self.num_existing_disk=} {self.num_existing_groups=} {self.total_existing_targets=} {max_existing_targets_per_disk=}") + + assert self.num_nodes >= self.num_existing_disk, f"{self.num_nodes=} < {self.num_existing_disk=}" + assert self.num_groups >= self.num_existing_groups, f"{self.num_groups=} < {self.num_existing_groups=}" + assert self.group_size == self.existing_group_size, f"{self.group_size=} != {self.existing_group_size=}" + assert self.num_targets_per_disk >= max_existing_targets_per_disk, f"{self.num_targets_per_disk=} >= {max_existing_targets_per_disk=}" + + model = super().build_model() + + def existing_targets_evenly_distributed_to_disks(model, disk): + return po.quicksum(model.disk_used_by_group[disk,group] for group in model.groups if group <= self.num_existing_groups) <= max_existing_targets_per_disk + model.existing_targets_evenly_distributed_to_disks_eqn = po.Constraint(model.disks, rule=existing_targets_evenly_distributed_to_disks) + + def num_existing_targets_not_moved(model): + return po.quicksum(model.disk_used_by_group[disk,group] for disk in model.disks for group in model.groups if (disk,group) in self.existing_incidence_matrix) + + def total_rebalance_traffic(model): + return self.total_existing_targets - num_existing_targets_not_moved(model) + + model.obj = po.Objective(expr=total_rebalance_traffic, sense=po.minimize) + return model + + def visualize_solution(self, instance, output_path = "output", write_html=True): + incidence_matrix = self.get_incidence_matrix(instance) + disks, groups = zip(*incidence_matrix.keys()) + incidence_df = pd.DataFrame(zip(disks, groups, [g > self.num_existing_groups for g in groups]), columns=["disk", "group", "new"]) + + peer_traffic_map = self.get_peer_traffic(instance) + min_peer_traffic = min(peer_traffic_map.values()) + max_peer_traffic = max(peer_traffic_map.values()) + + fig = px.scatter( + incidence_df, + x="disk", + y="group", + color="new", + title=f"{self}, min/max peer traffic: {min_peer_traffic:.1f}/{max_peer_traffic:.1f}, rebalance traffic: {po.value(instance.obj.expr)}") + fig.update_layout( + xaxis_title="Nodes", + yaxis_title="Groups", + xaxis = dict( + tickmode = 'array', + tickvals = list(range(1, self.num_nodes+1)), + ), + yaxis = dict( + tickmode = 'array', + tickvals = list(range(1, self.num_groups+1)), + ), + ) + + if write_html: + fig.write_html(os.path.join(output_path, f"{self.path_name}.html"), include_plotlyjs=True) + return fig + + +def main(): + import psutil + import argparse + + parser = argparse.ArgumentParser(prog="model.py", description="3FS data placement") + parser.add_argument("-pyomo", "--pyomo_solver", default="appsi_highs", choices=["appsi_highs", "cbc", "scip"], help="Solver used by Pyomo") + parser.add_argument("-type", "--chain_table_type", type=str, required=True, choices=["CR", "EC"], help="CR - Chain Replication; EC - Erasure Coding") + parser.add_argument("-j", "--solver_threads", type=int, default=psutil.cpu_count(logical=False)//2, help="Number of solver threads") + parser.add_argument("-v", "--num_nodes", type=int, required=True, help="Number of storage nodes") + parser.add_argument("-r", "--num_targets_per_disk", type=int, default=None, help="Number of storage targets on each disk") + parser.add_argument("-min_r", "--min_targets_per_disk", type=int, default=1, help="Min number of storage targets on each disk") + parser.add_argument("-k", "--replication_factor", "--group_size", dest="group_size", type=int, default=3, help="Replication factor or erasure coding group size") + parser.add_argument("-b", "--num_groups", type=int, default=None, help="Number of chains or EC groups") + parser.add_argument("-ql", "--qlinearize", action="store_true", help="Enable linearization of quadratic equations") + parser.add_argument("-lb", "--relax_lb", type=int, default=1, help="Relax the lower bound of peer recovery traffic") + parser.add_argument("-ub", "--relax_ub", type=int, default=0, help="Relax the upper bound of peer recovery traffic") + parser.add_argument("-relax", "--auto_relax", action="store_true", help="Auto relax the lower/upper bound of peer recovery traffic when timeout") + parser.add_argument("-bibd", "--bibd_only", action="store_true", help="Only create balanced incomplete block design (BIBD)") + parser.add_argument("-t", "--init_timelimit", type=int, default=1800, help="Initial timeout for solver") + parser.add_argument("-T", "--max_timelimit", type=int, default=3600*2, help="Max timeout for solver") + parser.add_argument("-o", "--output_path", default="output", help="Path of output files") + parser.add_argument("-m", "--existing_incidence_matrix", default=None, help="Existing incidence matrix for rebalance traffic model") + parser.add_argument("-V", "--verbose", action="store_true", help="Show verbose output") + args = parser.parse_args() + + if args.existing_incidence_matrix is None: + DataPlacementModel( + args.chain_table_type, + args.num_nodes, + args.group_size, + args.num_groups, + args.num_targets_per_disk, + args.min_targets_per_disk, + args.bibd_only, + args.qlinearize, + args.relax_lb, + args.relax_ub, + ).run( + args.pyomo_solver, + args.solver_threads, + args.init_timelimit, + args.max_timelimit, + args.auto_relax, + args.output_path, + args.verbose) + else: + with open(args.existing_incidence_matrix, "rb") as fin: + existing_incidence_matrix = pickle.load(fin) + RebalanceTrafficModel( + existing_incidence_matrix, + args.chain_table_type, + args.num_nodes, + args.group_size, + args.num_groups, + args.num_targets_per_disk, + args.min_targets_per_disk, + args.bibd_only, + args.qlinearize, + args.relax_lb, + args.relax_ub, + ).run( + args.pyomo_solver, + args.solver_threads, + args.init_timelimit, + args.max_timelimit, + args.auto_relax, + args.output_path, + args.verbose) + + +if __name__ == "__main__": + main() diff --git a/deploy/data_placement/src/model/data_placement_job.py b/deploy/data_placement/src/model/data_placement_job.py new file mode 100644 index 0000000..02df8fb --- /dev/null +++ b/deploy/data_placement/src/model/data_placement_job.py @@ -0,0 +1,108 @@ +# local test +# pytest test/test_plan.py -v -x +# production setup +import functools +import socket +import sys +import os.path +import itertools +import pandas as pd +import pyarrow as arrow +from typing import List, Literal +from loguru import logger +from smallpond.common import pytest_running +from smallpond.logical.dataset import ArrowTableDataSet +from smallpond.logical.node import Context, ConsolidateNode, DataSetPartitionNode, DataSourceNode, ArrowComputeNode, LogicalPlan, SqlEngineNode +from smallpond.execution.driver import Driver +from smallpond.execution.task import RuntimeContext, ArrowComputeTask + + +def solve_model(runtime_task: ArrowComputeTask, + chain_table_type, num_nodes, group_size, min_targets_per_disk, + init_timelimit, max_timelimit, + pyomo_solver="appsi_highs"): + import logging + pyomo_logger = logging.getLogger('pyomo') + pyomo_logger.setLevel(logging.WARNING) + + try: + from src.model.data_placement import DataPlacementModel + except: + sys.path.append(os.path.dirname(os.path.abspath(__file__))) + from src.model.data_placement import DataPlacementModel + + model = DataPlacementModel(chain_table_type, num_nodes, group_size, min_targets_per_disk=min_targets_per_disk, bibd_only=False, qlinearize=True, relax_lb=1, relax_ub=0) + runtime_task.add_elapsed_time("build model time") + + instance = model.run( + pyomo_solver=pyomo_solver, + threads=runtime_task.cpu_limit, + init_timelimit=init_timelimit, + max_timelimit=max_timelimit, + auto_relax=True, + output_root=runtime_task.runtime_output_abspath, + add_elapsed_time=runtime_task.add_elapsed_time) + return model, instance + +def solve_loop(runtime_ctx: RuntimeContext, input_tables: List[arrow.Table], + init_timelimit, max_timelimit, + pyomo_solver="appsi_highs") -> arrow.Table: + runtime_task = runtime_ctx.task + model_params, = input_tables + + output_table = None + schema = arrow.schema([ + arrow.field("chain_table_type", arrow.string()), + arrow.field("num_nodes", arrow.uint32()), + arrow.field("group_size", arrow.uint32()), + arrow.field("disks", arrow.list_(arrow.uint32())), + arrow.field("groups", arrow.list_(arrow.uint32())), + ]) + + for chain_table_type, num_nodes, group_size, min_targets_per_disk in zip(*model_params.to_pydict().values()): + model, instance = solve_model(runtime_task, chain_table_type, num_nodes, group_size, min_targets_per_disk, init_timelimit, max_timelimit, pyomo_solver) + incidence_matrix = model.get_incidence_matrix(instance) + disks, groups = zip(*incidence_matrix.keys()) + sol_table = arrow.Table.from_arrays([[chain_table_type], [num_nodes], [group_size], [disks], [groups]], schema=schema) + output_table = sol_table if output_table is None else arrow.concat_tables((output_table, sol_table)) + return output_table + + +def search_data_placement_plans( + chain_table_type: Literal["EC", "CR"], + num_nodes: List[int], group_size: List[int], min_targets_per_disk=1, + init_timelimit=1800, max_timelimit=3600*3, + solver_threads: int=64, + pyomo_solver="appsi_highs"): + params = pd.DataFrame([(chain_table_type, v, k, min_targets_per_disk) + for v, k in itertools.product(num_nodes, group_size) if v >= k], + columns=["chain_table_type", "num_nodes", "group_size", "min_targets_per_disk"]) + logger.warning(f"params: {params}") + + ctx = Context() + params_source = DataSourceNode(ctx, ArrowTableDataSet(arrow.Table.from_pandas(params))) + params_partitions = DataSetPartitionNode(ctx, (params_source,), npartitions=len(params), partition_by_rows=True) + + data_placement_sols = ArrowComputeNode( + ctx, (params_partitions,), + process_func=functools.partial(solve_loop, init_timelimit=init_timelimit, max_timelimit=max_timelimit, pyomo_solver=pyomo_solver), + cpu_limit=solver_threads) + return LogicalPlan(ctx, data_placement_sols) + + +def main(): + driver = Driver() + driver.add_argument("-pyomo", "--pyomo_solver", default="appsi_highs", choices=["appsi_highs", "cbc", "scip"], help="Solver used by Pyomo") + driver.add_argument("-type", "--chain_table_type", type=str, required=True, choices=["EC", "CR"], help="CR - Chain Replication; EC - Erasure Coding") + driver.add_argument("-v", "--num_nodes", nargs="+", type=int, required=True, help="Number of storage nodes") + driver.add_argument("-k", "--replication_factor", "--group_size", dest="group_size", type=int, default=3, help="Replication factor or erasure coding group size") + driver.add_argument("-min_r", "--min_targets_per_disk", type=int, default=1, help="Min number of storage targets on each disk") + driver.add_argument("-j", "--solver_threads", type=int, default=32, help="Number of solver threads") + driver.add_argument("-t", "--init_timelimit", type=int, default=1800, help="Initial timeout for solver") + driver.add_argument("-T", "--max_timelimit", type=int, default=3600*3, help="Max timeout for solver") + plan = search_data_placement_plans(num_executors=driver.num_executors, **driver.get_arguments()) + driver.run(plan) + + +if __name__ == "__main__": + main() diff --git a/deploy/data_placement/src/setup/__init__.py b/deploy/data_placement/src/setup/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/deploy/data_placement/src/setup/gen_chain_table.py b/deploy/data_placement/src/setup/gen_chain_table.py new file mode 100644 index 0000000..6468808 --- /dev/null +++ b/deploy/data_placement/src/setup/gen_chain_table.py @@ -0,0 +1,124 @@ +import argparse +import os.path +from collections import Counter, defaultdict, namedtuple +import pickle +from typing import Dict, List, Literal, Tuple + + +Target = namedtuple("Target", ["target_id", "node_id", "disk_index"]) +Chain = namedtuple("Chain", ["chain_id", "target_list"]) + + +def calc_target_id(target_id_prefix: int, node_id: int, disk_index: int, target_index: int): + return ((target_id_prefix * 1_000_000 + node_id) * 1_000 + (disk_index+1)) * 100 + (target_index+1) + + +def generate_chains( + chain_table_type: Literal["EC", "CR"], + node_id_begin: int, + node_id_end: int, + num_disks_per_node: int, + num_targets_per_disk: int, + target_id_prefix: int, + chain_id_prefix: int, + incidence_matrix: Dict[Tuple[int, int], bool], + **kwargs): + num_nodes = node_id_end - node_id_begin + 1 + nodes, groups = zip(*sorted(incidence_matrix.keys())) + group_sizes = list(Counter(groups).values()) + assert max(nodes) == num_nodes, f"{max(nodes)=} != {num_nodes=}" + assert all(s == group_sizes[0] for s in group_sizes[1:]), f"not all group sizes the same: {group_sizes}" + assert len(incidence_matrix) % group_sizes[0] == 0, f"{len(incidence_matrix)=} % {group_sizes[0]=} != 0" + assert len(incidence_matrix) == num_nodes * num_targets_per_disk, f"{len(incidence_matrix)=} != {num_nodes=} * {num_targets_per_disk=}" + + global_target_list = [] + chain_target_list = defaultdict(list) + + for disk_index in range(num_disks_per_node): + group_slot_idx = defaultdict(int) + for node_id in range(node_id_begin, node_id_end+1): + for target_index in range(num_targets_per_disk): + target_id = calc_target_id(target_id_prefix, node_id, disk_index, target_index) + target_pos = (node_id - node_id_begin) * num_targets_per_disk + target_index + + if chain_table_type == "EC": + group_slot_idx[groups[target_pos]] += 1 + chain_index = (groups[target_pos]-1) * group_sizes[0] + group_slot_idx[groups[target_pos]] + else: + chain_index = groups[target_pos] + + assert chain_index < 1_00_000, f"{chain_index} >= {1_00_000}" + chain_id = (chain_id_prefix * 1_000 + (disk_index+1)) * 1_00_000 + chain_index + target = Target(target_id, node_id, disk_index) + global_target_list.append(target) + chain_target_list[chain_id].append(target) + + num_targets_on_node = list(Counter(target.node_id for target in global_target_list).values()) + num_targets_on_disk = list(Counter((target.node_id, target.disk_index) for target in global_target_list).values()) + assert len(global_target_list) == len(set(global_target_list)) == num_nodes * num_disks_per_node * num_targets_per_disk + assert all(x == num_targets_on_node[0] for x in num_targets_on_node[1:]) + assert all(x == num_targets_on_disk[0] for x in num_targets_on_disk[1:]) + + if chain_table_type == "EC": + assert all(len(target_ids) == 1 for target_ids in chain_target_list.values()) + assert len(chain_target_list) == num_nodes * num_disks_per_node * num_targets_per_disk + else: + assert all(len(target_ids) == group_sizes[0] for target_ids in chain_target_list.values()) + assert len(chain_target_list) == num_nodes * num_disks_per_node * num_targets_per_disk // group_sizes[0] + + return [Chain(chain_id, target_list) for chain_id, target_list in sorted(chain_target_list.items())] + + +def main(): + parser = argparse.ArgumentParser(prog="model.py", description="Generate 3FS create target commands") + parser.add_argument("-type", "--chain_table_type", type=str, required=True, choices=["EC", "CR"], help="CR - Chain Replication; EC - Erasure Coding") + parser.add_argument("-b", "--node_id_begin", type=int, required=True, help="The first node id") + parser.add_argument("-e", "--node_id_end", type=int, required=True, help="The last node id") + parser.add_argument("-d", "--num_disks_per_node", type=int, required=True, help="Number of disk on each storage node") + parser.add_argument("-r", "--num_targets_per_disk", type=int, required=True, help="Number of storage targets on each disk") + parser.add_argument("-tp", "--target_id_prefix", type=int, default=10, help="Prefix of generated target id") + parser.add_argument("-cp", "--chain_id_prefix", type=int, default=10, help="Prefix of generated chain id") + parser.add_argument("-cs", "--chunk_size", nargs="+", help="A list of supported file chunk sizes") + parser.add_argument("-mat", "--incidence_matrix_path", type=str, required=True, help="Incidence matrix generated by data placement model") + parser.add_argument("-o", "--output_path", default="output", help="Path of output files") + args = parser.parse_args() + + with open(args.incidence_matrix_path, "rb") as fin: + incidence_matrix = pickle.load(fin) + + assert len(incidence_matrix) < 1_00_000 + assert args.node_id_end - args.node_id_begin < 1000 + assert args.node_id_end < 1_000_000 + assert args.node_id_begin < 1_000_000 + assert args.num_disks_per_node < 1000 + assert args.num_targets_per_disk < 100 + assert args.target_id_prefix < 100 + assert args.chain_id_prefix < 100 + + chain_list = generate_chains(**vars(args), incidence_matrix=incidence_matrix) + + with open(os.path.join(args.output_path, "generated_chains.csv"), "w") as fout: + print(f"ChainId,{','.join(['TargetId']*len(chain_list[0].target_list))}", file=fout) + for chain in chain_list: + print(f"{chain.chain_id},{','.join(str(target.target_id) for target in chain.target_list)}", file=fout) + + with open(os.path.join(args.output_path, "generated_chain_table.csv"), "w") as fout: + print("ChainId", file=fout) + for chain in chain_list: + print(f"{chain.chain_id}", file=fout) + + with open(os.path.join(args.output_path, "create_target_cmd.txt"), "w") as fout: + chunk_size_opt = f"--chunk-size {' '.join(args.chunk_size)}" if args.chunk_size else "" + for chain in chain_list: + for target in chain.target_list: + print(f"create-target --node-id {target.node_id} --disk-index {target.disk_index} --target-id {target.target_id} --chain-id {chain.chain_id} {chunk_size_opt} --use-new-chunk-engine", file=fout) + + with open(os.path.join(args.output_path, "remove_target_cmd.txt"), "w") as fout: + for chain in chain_list: + for target in chain.target_list: + print(f"offline-target --node-id {target.node_id} --target-id {target.target_id}", file=fout) + print(f"remove-target --node-id {target.node_id} --target-id {target.target_id}", file=fout) + + +if __name__ == "__main__": + main() diff --git a/deploy/data_placement/test/test_model.py b/deploy/data_placement/test/test_model.py new file mode 100644 index 0000000..4a48453 --- /dev/null +++ b/deploy/data_placement/test/test_model.py @@ -0,0 +1,94 @@ +import copy +import glob +import os.path +import importlib +import shutil +import tempfile +import pytest +from src.model.data_placement import DataPlacementModel, RebalanceTrafficModel + + +placement_params = [ + # simple cases for replication group + { + "chain_table_type": "EC", + "num_nodes": 5, + "num_targets_per_disk": 6, + "group_size": 2, + }, + { + "chain_table_type": "EC", + "num_nodes": 5, + "num_targets_per_disk": 6, + "group_size": 3, + }, + # not all targets used: num_nodes * num_targets_per_disk % group_size != 0 + { + "chain_table_type": "EC", + "num_nodes": 7, + "num_targets_per_disk": 5, + "group_size": 4, + }, + # always evenly distributed: num_targets_per_disk * (group_size-1) % (num_nodes-1) == 0 + { + "chain_table_type": "EC", + "num_nodes": 8, + "num_targets_per_disk": 6, + "group_size": 5, + }, + # all targets used & evenly distributed + { + "chain_table_type": "EC", + "num_nodes": 10, + "num_targets_per_disk": 9, + "group_size": 5, + }, +] +qlinearize = [False, True] +relax_lb = [1, 2] + +@pytest.mark.parametrize('qlinearize', qlinearize[1:]) +@pytest.mark.parametrize('relax_lb', relax_lb) +@pytest.mark.parametrize('placement_params', placement_params) +@pytest.mark.skipif(importlib.util.find_spec("highspy") is None, reason="cannot find solver") +def test_solve_placement_model_with_highs(placement_params, qlinearize, relax_lb): + DataPlacementModel( + **placement_params, + qlinearize=qlinearize, + relax_lb=relax_lb, + ).run(pyomo_solver="appsi_highs") + +@pytest.mark.parametrize('chain_table_type, num_nodes, group_size', [("CR", 25, 3), ("EC", 25, 20)]) +@pytest.mark.skipif(importlib.util.find_spec("highspy") is None, reason="cannot find solver") +def test_solve_placement_model_v25(chain_table_type, num_nodes, group_size): + model = DataPlacementModel( + chain_table_type=chain_table_type, + num_nodes=num_nodes, + group_size=group_size, + qlinearize=True, + relax_lb=1, + relax_ub=1, + ) + model.run(pyomo_solver="appsi_highs", max_timelimit=30, auto_relax=True) + +@pytest.mark.parametrize('placement_params', placement_params) +@pytest.mark.skipif(importlib.util.find_spec("highspy") is None, reason="cannot find solver") +def test_solve_rebalance_model(placement_params): + model = DataPlacementModel( + **placement_params, + qlinearize=True, + relax_lb=1, + relax_ub=1, + ) + instance = model.run(pyomo_solver="appsi_highs") + + placement_params = copy.deepcopy(placement_params) + placement_params["num_nodes"] *= 2 + placement_params.pop("num_targets_per_disk") + RebalanceTrafficModel( + existing_incidence_matrix=model.get_incidence_matrix(instance), + **placement_params, + qlinearize=True, + relax_lb=2, + relax_ub=1, + ).run(pyomo_solver="appsi_highs", max_timelimit=15, auto_relax=True) diff --git a/deploy/data_placement/test/test_plan.py b/deploy/data_placement/test/test_plan.py new file mode 100644 index 0000000..cc3746b --- /dev/null +++ b/deploy/data_placement/test/test_plan.py @@ -0,0 +1,10 @@ +from smallpond.test_fabric import TestFabric +from src.model.data_placement_job import search_data_placement_plans + +class TestPlan(TestFabric): + + def test_search_data_placement_plans(self): + for pyomo_solver in ["appsi_highs"]: + with self.subTest(pyomo_solver=pyomo_solver): + plan = search_data_placement_plans(chain_table_type="EC", num_nodes=[10], group_size=[5, 9], solver_threads=16, pyomo_solver=pyomo_solver) + self.execute_plan(plan, num_executors=1) diff --git a/deploy/data_placement/test/test_setup.py b/deploy/data_placement/test/test_setup.py new file mode 100644 index 0000000..8848c66 --- /dev/null +++ b/deploy/data_placement/test/test_setup.py @@ -0,0 +1,55 @@ +from collections import Counter +import glob +import os.path +import pytest + +from src.model.data_placement import DataPlacementModel +from src.setup.gen_chain_table import generate_chains + + +@pytest.mark.parametrize('num_nodes, num_disks_per_node, num_targets_per_disk, num_replicas', [(5, 10, 6, 2), (10, 10, 9, 3)]) +def test_generate_cr_chains(num_nodes: int, num_disks_per_node: int, num_targets_per_disk: int, num_replicas: int): + model = DataPlacementModel( + chain_table_type="CR", + num_nodes=num_nodes, + num_targets_per_disk=num_targets_per_disk, + group_size=num_replicas, + qlinearize=True, + relax_lb=1, + relax_ub=1, + ) + instance = model.run(pyomo_solver="appsi_highs", max_timelimit=15, auto_relax=True) + + generate_chains( + chain_table_type="CR", + node_id_begin=1, + node_id_end=num_nodes, + num_disks_per_node=num_disks_per_node, + num_targets_per_disk=num_targets_per_disk, + target_id_prefix=1, + chain_id_prefix=9, + incidence_matrix=model.get_incidence_matrix(instance)) + + +@pytest.mark.parametrize('num_nodes, num_disks_per_node, num_targets_per_disk, ec_group_size', [(20, 10, 6, 12), (25, 10, 12, 20)]) +def test_generate_ec_chains(num_nodes: int, num_disks_per_node: int, num_targets_per_disk: int, ec_group_size: int): + model = DataPlacementModel( + chain_table_type="EC", + num_nodes=num_nodes, + num_targets_per_disk=num_targets_per_disk, + group_size=ec_group_size, + qlinearize=True, + relax_lb=1, + relax_ub=1, + ) + instance = model.run(pyomo_solver="appsi_highs", max_timelimit=15, auto_relax=True) + + generate_chains( + chain_table_type="EC", + node_id_begin=1, + node_id_end=num_nodes, + num_disks_per_node=num_disks_per_node, + num_targets_per_disk=num_targets_per_disk, + target_id_prefix=1, + chain_id_prefix=9, + incidence_matrix=model.get_incidence_matrix(instance)) diff --git a/deploy/sql/3fs-monitor.sql b/deploy/sql/3fs-monitor.sql new file mode 100644 index 0000000..2c9c41c --- /dev/null +++ b/deploy/sql/3fs-monitor.sql @@ -0,0 +1,51 @@ +CREATE DATABASE IF NOT EXISTS 3fs; + +CREATE TABLE IF NOT EXISTS 3fs.counters ( + `TIMESTAMP` DateTime CODEC(DoubleDelta), + `metricName` LowCardinality(String) CODEC(ZSTD(1)), + `host` LowCardinality(String) CODEC(ZSTD(1)), + `tag` LowCardinality(String) CODEC(ZSTD(1)), + `val` Int64 CODEC(ZSTD(1)), + `mount_name` LowCardinality(String) CODEC(ZSTD(1)), + `instance` String CODEC(ZSTD(1)), + `io` LowCardinality(String) CODEC(ZSTD(1)), + `uid` LowCardinality(String) CODEC(ZSTD(1)), + `pod` String CODEC(ZSTD(1)), + `thread` LowCardinality(String) CODEC(ZSTD(1)), + `statusCode` LowCardinality(String) CODEC(ZSTD(1)) +) +ENGINE = MergeTree +PRIMARY KEY (metricName, host, pod, instance, TIMESTAMP) +PARTITION BY toDate(TIMESTAMP) +ORDER BY (metricName, host, pod, instance, TIMESTAMP) +TTL TIMESTAMP + toIntervalMonth(1) +SETTINGS index_granularity = 8192; + +CREATE TABLE IF NOT EXISTS 3fs.distributions ( + `TIMESTAMP` DateTime CODEC(DoubleDelta), + `metricName` LowCardinality(String) CODEC(ZSTD(1)), + `host` LowCardinality(String) CODEC(ZSTD(1)), + `tag` LowCardinality(String) CODEC(ZSTD(1)), + `count` Float64 CODEC(ZSTD(1)), + `mean` Float64 CODEC(ZSTD(1)), + `min` Float64 CODEC(ZSTD(1)), + `max` Float64 CODEC(ZSTD(1)), + `p50` Float64 CODEC(ZSTD(1)), + `p90` Float64 CODEC(ZSTD(1)), + `p95` Float64 CODEC(ZSTD(1)), + `p99` Float64 CODEC(ZSTD(1)), + `mount_name` LowCardinality(String) CODEC(ZSTD(1)), + `instance` String CODEC(ZSTD(1)), + `io` LowCardinality(String) CODEC(ZSTD(1)), + `uid` LowCardinality(String) CODEC(ZSTD(1)), + `method` LowCardinality(String) CODEC(ZSTD(1)), + `pod` String CODEC(ZSTD(1)), + `thread` LowCardinality(String) CODEC(ZSTD(1)), + `statusCode` LowCardinality(String) CODEC(ZSTD(1)) +) +ENGINE = MergeTree +PRIMARY KEY (metricName, host, pod, instance, TIMESTAMP) +PARTITION BY toDate(TIMESTAMP) +ORDER BY (metricName, host, pod, instance, TIMESTAMP) +TTL TIMESTAMP + toIntervalMonth(1) +SETTINGS index_granularity = 8192; diff --git a/deploy/systemd/hf3fs_fuse_main.service b/deploy/systemd/hf3fs_fuse_main.service new file mode 100644 index 0000000..f6e7c77 --- /dev/null +++ b/deploy/systemd/hf3fs_fuse_main.service @@ -0,0 +1,12 @@ +[Unit] +Description=fuse_main Server +Requires=network-online.target +After=network-online.target + +[Service] +LimitNOFILE=1000000 +ExecStart=/opt/3fs/bin/hf3fs_fuse_main --launcher_cfg /opt/3fs/etc/hf3fs_fuse_main_launcher.toml +Type=simple + +[Install] +WantedBy=multi-user.target diff --git a/deploy/systemd/meta_main.service b/deploy/systemd/meta_main.service new file mode 100644 index 0000000..b4e89eb --- /dev/null +++ b/deploy/systemd/meta_main.service @@ -0,0 +1,12 @@ +[Unit] +Description=meta_main Server +Requires=network-online.target +After=network-online.target + +[Service] +LimitNOFILE=1000000 +ExecStart=/opt/3fs/bin/meta_main --launcher_cfg /opt/3fs/etc/meta_main_launcher.toml --app-cfg /opt/3fs/etc/meta_main_app.toml +Type=simple + +[Install] +WantedBy=multi-user.target diff --git a/deploy/systemd/mgmtd_main.service b/deploy/systemd/mgmtd_main.service new file mode 100644 index 0000000..a4c5ea7 --- /dev/null +++ b/deploy/systemd/mgmtd_main.service @@ -0,0 +1,12 @@ +[Unit] +Description=mgmtd_main Server +Requires=network-online.target +After=network-online.target + +[Service] +LimitNOFILE=1000000 +ExecStart=/opt/3fs/bin/mgmtd_main --launcher_cfg /opt/3fs/etc/mgmtd_main_launcher.toml --app-cfg /opt/3fs/etc/mgmtd_main_app.toml +Type=simple + +[Install] +WantedBy=multi-user.target diff --git a/deploy/systemd/monitor_collector_main.service b/deploy/systemd/monitor_collector_main.service new file mode 100644 index 0000000..6b5f6fc --- /dev/null +++ b/deploy/systemd/monitor_collector_main.service @@ -0,0 +1,11 @@ +[Unit] +Description=monitor_collector_main Server +Requires=network-online.target +After=network-online.target + +[Service] +ExecStart=/opt/3fs/bin/monitor_collector_main --cfg /opt/3fs/etc/monitor_collector_main.toml +Type=simple + +[Install] +WantedBy=multi-user.target diff --git a/deploy/systemd/storage_main.service b/deploy/systemd/storage_main.service new file mode 100644 index 0000000..d9246a8 --- /dev/null +++ b/deploy/systemd/storage_main.service @@ -0,0 +1,14 @@ +[Unit] +Description=storage_main Server +Requires=network-online.target +After=network-online.target + +[Service] +LimitNOFILE=1000000 +LimitMEMLOCK=infinity +TimeoutStopSec=5m +ExecStart=/opt/3fs/bin/storage_main --launcher_cfg /opt/3fs/etc/storage_main_launcher.toml --app-cfg /opt/3fs/etc/storage_main_app.toml +Type=simple + +[Install] +WantedBy=multi-user.target diff --git a/dockerfile/dev.centos9.dockerfile b/dockerfile/dev.centos9.dockerfile new file mode 100644 index 0000000..d09235e --- /dev/null +++ b/dockerfile/dev.centos9.dockerfile @@ -0,0 +1,46 @@ +FROM quay.io/centos/centos:stream9 +RUN dnf clean all \ + && dnf config-manager --set-enabled crb \ + && dnf install -y epel-release \ + && dnf install -y wget git meson cmake cargo perl lld gcc gcc-c++ autoconf lz4 lz4-devel xz xz-devel \ + double-conversion-devel libdwarf-devel libunwind-devel libaio-devel gflags-devel glog-devel \ + libuv-devel gmock-devel gperftools gperftools-devel openssl-devel boost-static boost-devel mono-devel \ + libevent-devel libibverbs-devel numactl-devel python3-devel \ + && dnf remove -y fuse \ + && dnf clean all \ + && echo "alias ll='ls -al'" >> /root/.bashrc +RUN mkdir -p /tmp/fuse \ + && cd /tmp/fuse \ + && wget https://github.com/libfuse/libfuse/releases/download/fuse-3.16.2/fuse-3.16.2.tar.gz \ + && tar -zxf fuse-3.16.2.tar.gz \ + && cd fuse-3.16.2 \ + && mkdir build \ + && cd build \ + && meson setup .. \ + && meson configure -D default_library=both \ + && meson setup --reconfigure ../ \ + && ninja \ + && ninja install \ + && cd / \ + && rm -rf /tmp/fuse +RUN mkdir -p /tmp/foundationdb \ + && cd /tmp/foundationdb \ + && wget https://github.com/apple/foundationdb/releases/download/7.3.63/foundationdb-clients-7.3.63-1.el7.x86_64.rpm \ + && wget https://github.com/apple/foundationdb/releases/download/7.3.63/foundationdb-server-7.3.63-1.el7.x86_64.rpm \ + && rpm -ivh foundationdb-clients-7.3.63-1.el7.x86_64.rpm \ + && rpm -ivh foundationdb-server-7.3.63-1.el7.x86_64.rpm \ + && cd / \ + && rm -rf /tmp/foundationdb +RUN mkdir -p /tmp/clang \ + && cd /tmp/clang \ + && wget https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/clang+llvm-14.0.6-x86_64-linux-gnu-rhel-8.4.tar.xz \ + && tar -xf clang+llvm-14.0.6-x86_64-linux-gnu-rhel-8.4.tar.xz \ + && mv clang+llvm-14.0.6-x86_64-linux-gnu-rhel-8.4 /usr/local/clang-llvm-14 \ + && ln -s /usr/local/clang-llvm-14/bin/clang++ /usr/local/clang-llvm-14/bin/clang++-14 \ + && ln -s /usr/local/clang-llvm-14/bin/clang-format /usr/local/clang-llvm-14/bin/clang-format-14 \ + && ln -s /usr/local/clang-llvm-14/bin/clang-tidy /usr/local/clang-llvm-14/bin/clang-tidy-14 \ + && ln -s /usr/local/clang-llvm-14/bin/clang-format /usr/bin/clang-format-14 \ + && echo "export PATH=\$PATH:/usr/local/clang-llvm-14/bin" >> /root/.bashrc \ + && cd / \ + && rm -rf /tmp/clang +CMD ["/bin/bash"] diff --git a/dockerfile/dev.dockerfile b/dockerfile/dev.dockerfile new file mode 100644 index 0000000..06c7beb --- /dev/null +++ b/dockerfile/dev.dockerfile @@ -0,0 +1,51 @@ +FROM ubuntu:22.04 + +SHELL ["/bin/bash", "-euo", "pipefail", "-c"] +RUN apt-get update &&\ + apt-get install -y --no-install-recommends \ + git wget ca-certificates \ + clang-format-14 clang-14 clang-tidy-14 lld-14 \ + build-essential meson gcc-12 g++-12 cmake \ + google-perftools \ + libaio-dev \ + libboost-all-dev \ + libdouble-conversion-dev \ + libdwarf-dev \ + libgflags-dev \ + libgmock-dev \ + libgoogle-glog-dev \ + libgoogle-perftools-dev \ + libgtest-dev \ + liblz4-dev \ + liblzma-dev \ + libssl-dev \ + libunwind-dev \ + libuv1-dev &&\ + apt-get clean &&\ + rm -rf /var/lib/apt/lists/* + +ARG FDB_VERSION=7.3.63 +RUN FDB_ARCH_SUFFIX=$(dpkg --print-architecture) && \ + case "${FDB_ARCH_SUFFIX}" in \ + amd64) ;; \ + arm64) FDB_ARCH_SUFFIX="aarch64" ;; \ + *) echo "Unsupported architecture: ${FDB_ARCH_SUFFIX}"; exit 1 ;; \ + esac && \ + FDB_CLIENT_URL="https://github.com/apple/foundationdb/releases/download/${FDB_VERSION}/foundationdb-clients_${FDB_VERSION}-1_${FDB_ARCH_SUFFIX}.deb" && \ + wget -q "${FDB_CLIENT_URL}" && \ + dpkg -i foundationdb-clients_${FDB_VERSION}-1_${FDB_ARCH_SUFFIX}.deb && \ + rm foundationdb-clients_${FDB_VERSION}-1_${FDB_ARCH_SUFFIX}.deb + +ARG LIBFUSE_VERSION=3.16.2 +ARG LIBFUSE_DOWNLOAD_URL=https://github.com/libfuse/libfuse/releases/download/fuse-${LIBFUSE_VERSION}/fuse-${LIBFUSE_VERSION}.tar.gz +RUN wget -O- ${LIBFUSE_DOWNLOAD_URL} |\ + tar -xzvf - -C /tmp &&\ + cd /tmp/fuse-${LIBFUSE_VERSION} &&\ + mkdir build && cd build &&\ + meson setup .. && meson configure -D default_library=both &&\ + ninja && ninja install &&\ + rm -f -r /tmp/fuse-${LIBFUSE_VERSION}* + +# Install Rust +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +ENV PATH="/root/.cargo/bin:${PATH}" \ No newline at end of file diff --git a/dockerfile/dev.opencloudos9.dockerfile b/dockerfile/dev.opencloudos9.dockerfile new file mode 100644 index 0000000..5b8e40e --- /dev/null +++ b/dockerfile/dev.opencloudos9.dockerfile @@ -0,0 +1,53 @@ +FROM opencloudos/opencloudos9-minimal:latest +RUN dnf clean all \ + && dnf install -y epol-release \ + && dnf install -y wget git meson cmake perl lld gcc gcc-c++ autoconf lz4 lz4-devel xz xz-devel \ + double-conversion-devel libdwarf-devel libunwind-devel libaio-devel gflags-devel glog-devel \ + libuv-devel gmock-devel gperftools gperftools-devel openssl-devel boost-static boost-devel mono-devel \ + libevent-devel libibverbs-devel numactl-devel python3-devel \ + && dnf remove -y fuse \ + && dnf clean all \ + && echo "alias ll='ls -al'" >> /root/.bashrc + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \ + sh -s -- -y --default-toolchain 1.85.0 +ENV PATH="/root/.cargo/bin:${PATH}" + +RUN mkdir -p /tmp/fuse \ + && cd /tmp/fuse \ + && wget https://github.com/libfuse/libfuse/releases/download/fuse-3.16.2/fuse-3.16.2.tar.gz \ + && tar -zxf fuse-3.16.2.tar.gz \ + && cd fuse-3.16.2 \ + && mkdir build \ + && cd build \ + && meson setup .. \ + && meson configure -D default_library=both \ + && meson setup --reconfigure ../ \ + && ninja \ + && ninja install \ + && cd / \ + && rm -rf /tmp/fuse +RUN mkdir -p /tmp/foundationdb \ + && cd /tmp/foundationdb \ + && wget https://github.com/apple/foundationdb/releases/download/7.3.63/foundationdb-clients-7.3.63-1.el7.x86_64.rpm \ + && wget https://github.com/apple/foundationdb/releases/download/7.3.63/foundationdb-server-7.3.63-1.el7.x86_64.rpm \ + && rpm -ivh foundationdb-clients-7.3.63-1.el7.x86_64.rpm \ + && rpm -ivh foundationdb-server-7.3.63-1.el7.x86_64.rpm \ + && cd / \ + && rm -rf /tmp/foundationdb +RUN mkdir -p /tmp/clang \ + && cd /tmp/clang \ + && wget https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/clang+llvm-14.0.6-x86_64-linux-gnu-rhel-8.4.tar.xz \ + && tar -xf clang+llvm-14.0.6-x86_64-linux-gnu-rhel-8.4.tar.xz \ + && mv clang+llvm-14.0.6-x86_64-linux-gnu-rhel-8.4 /usr/local/clang-llvm-14 \ + && ln -s /usr/local/clang-llvm-14/bin/clang++ /usr/local/clang-llvm-14/bin/clang++-14 \ + && ln -s /usr/local/clang-llvm-14/bin/clang-format /usr/local/clang-llvm-14/bin/clang-format-14 \ + && ln -s /usr/local/clang-llvm-14/bin/clang-tidy /usr/local/clang-llvm-14/bin/clang-tidy-14 \ + && ln -s /usr/local/clang-llvm-14/bin/clang-format /usr/bin/clang-format-14 \ + && ln -s /lib/gcc/x86_64-TencentOS-linux /lib/gcc/x86_64-linux-gnu \ + && ln -s /usr/include/c++/12/x86_64-TencentOS-linux /usr/include/c++/12/x86_64-linux-gnu \ + && ln -s /usr/libexec/gcc/x86_64-TencentOS-linux /usr/libexec/gcc/x86_64-linux-gnu \ + && echo "export PATH=\$PATH:/usr/local/clang-llvm-14/bin" >> /root/.bashrc \ + && cd / \ + && rm -rf /tmp/clang +CMD ["/bin/bash"] \ No newline at end of file diff --git a/dockerfile/dev.ubuntu2004.dockerfile b/dockerfile/dev.ubuntu2004.dockerfile new file mode 100644 index 0000000..01f42af --- /dev/null +++ b/dockerfile/dev.ubuntu2004.dockerfile @@ -0,0 +1,60 @@ +FROM ubuntu:20.04 + +SHELL ["/bin/bash", "-euo", "pipefail", "-c"] +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update &&\ + apt-get install -y --no-install-recommends \ + git wget ca-certificates software-properties-common \ + build-essential meson cmake \ + google-perftools \ + libaio-dev \ + libboost1.71-all-dev \ + libdouble-conversion-dev \ + libdwarf-dev \ + libgflags-dev \ + libgmock-dev \ + libgoogle-glog-dev \ + libgoogle-perftools-dev \ + libgtest-dev \ + liblz4-dev \ + liblzma-dev \ + libunwind-dev \ + libuv1-dev \ + libssl-dev \ + gnupg &&\ + apt-get clean &&\ + rm -rf /var/lib/apt/lists/* + +RUN wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key |tee /etc/apt/trusted.gpg.d/llvm.asc &&\ + add-apt-repository -y "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main" &&\ + apt-get update && apt-get install -y clang-format-14 clang-14 clang-tidy-14 lld-14 libclang-rt-14-dev gcc-10 g++-10 &&\ + apt-get clean &&\ + rm -rf /var/lib/apt/lists/* + +ARG FDB_VERSION=7.3.63 +RUN FDB_ARCH_SUFFIX=$(dpkg --print-architecture) && \ + case "${FDB_ARCH_SUFFIX}" in \ + amd64) ;; \ + arm64) FDB_ARCH_SUFFIX="aarch64" ;; \ + *) echo "Unsupported architecture: ${FDB_ARCH_SUFFIX}"; exit 1 ;; \ + esac && \ + FDB_CLIENT_URL="https://github.com/apple/foundationdb/releases/download/${FDB_VERSION}/foundationdb-clients_${FDB_VERSION}-1_${FDB_ARCH_SUFFIX}.deb" && \ + wget -q "${FDB_CLIENT_URL}" && \ + dpkg -i foundationdb-clients_${FDB_VERSION}-1_${FDB_ARCH_SUFFIX}.deb && \ + rm foundationdb-clients_${FDB_VERSION}-1_${FDB_ARCH_SUFFIX}.deb + +ARG LIBFUSE_VERSION=3.16.2 +ARG LIBFUSE_DOWNLOAD_URL=https://github.com/libfuse/libfuse/releases/download/fuse-${LIBFUSE_VERSION}/fuse-${LIBFUSE_VERSION}.tar.gz +RUN wget -O- ${LIBFUSE_DOWNLOAD_URL} |\ + tar -xzvf - -C /tmp &&\ + cd /tmp/fuse-${LIBFUSE_VERSION} &&\ + mkdir build && cd build &&\ + meson setup .. && meson configure -D default_library=both &&\ + ninja && ninja install &&\ + rm -f -r /tmp/fuse-${LIBFUSE_VERSION}* + +# Install Rust +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +ENV PATH="/root/.cargo/bin:${PATH}" + + diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..17ec6f2 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,6 @@ +# Documentation + +* [Design Notes](./design_notes.md) +* [Setup Guide](../deploy/README.md) +* [USRBIO API Reference](../src/lib/api/UsrbIo.md) +* [P Specifications](../specs/README.md) diff --git a/docs/design_notes.md b/docs/design_notes.md new file mode 100644 index 0000000..e652b87 --- /dev/null +++ b/docs/design_notes.md @@ -0,0 +1,290 @@ +# Design Notes + +## Design and implementation + +The 3FS system has four components: cluster manager, metadata service, storage service and client. All components are connected in an RDMA network (InfiniBand or RoCE). + +Metadata and storage services send heartbeats to cluster manager. Cluster manager handles membership changes and distributes cluster configuration to other services and clients. Multiple cluster managers are deployed and one of them is elected as the primary. Another manager is promoted as primary when the primary fails. Cluster configuration is typically stored in a reliable distributed coordination service, such as ZooKeeper or etcd. In our production environment, we use the same key-value store as file metadata to reduce dependencies. + +File metadata operations (e.g. open or create files/directories) are sent to metadata services, which implement the file system semantics. Metadata services are stateless, since file metadata are stored in a transactional key-value store (e.g. FoundationDB). Clients can connect to any metadata service. + +Each storage service manages a few local SSDs and provides a chunk store interface. The storage service implements Chain Replication with Apportioned Queries (CRAQ) to ensure strong consistency. CRAQ’s write-all-read-any approach helps to unleash the throughput of SSDs and RDMA network. A 3FS file is split into equally sized chunks, which are replicated over multiple SSDs. + +Two clients are developed for applications: FUSE client and native client. Most applications use FUSE client, which has a low adoption barrier. Performance-critical applications are integrated with the native client. + +## File system interfaces + +Object store is becoming a popular option for data analytics and machine learning. However, file system semantics and a unified namespace where files are organized in directories provide greater flexibility for applications. + +- *Atomic directory manipulation* An object store can approximate hierarchical directory structures by using slashes (/) in object keys. However, it doesn’t natively support operations like atomically moving files/directories, or recursively deleting entire directories. Actually a common pattern in our internal applications involves creating a temporary directory, writing files to it, and then moving the directory to its final location. When handling a large number of small files, the recursive delete for directories is crucial. Without it, applications have to traverse each directory and remove files one by one. + +- *Symbolic and hard links* Our applications utilize symbolic and hard links to create lightweight snapshots of dynamically updated datasets, where new data is appended as individual files. + +- *Familiar interface* The file interface is well known and used everywhere. There is no need to learn a new storage API. Many datasets are stored as CSV/Parquet files. Adapting file-based data loaders to use the 3FS FUSE client or native client is straightforward. + +### Limitations of FUSE + +FUSE (Filesystem in Userspace) simplifies file system client development by redirecting I/O operations to user-space processes through the FUSE kernel module. It creates the illusion that applications are accessing the remote file system as if it were a local file system. However, it has performance limitations: + +- *Memory copy overhead* The user-space file system daemon cannot access application memory. Data transfer between kernel and user spaces consumes memory bandwidth and increases end-to-end latency. + +- *Primitive multi-threading support* When an application initiates I/O requests, FUSE places these requests into a multi-threaded shared queue, protected by a spin lock. The user-space file system daemon then retrieves and processes requests from this queue. Due to lock contention, FUSE’s I/O processing capability fails to scale with the number of threads. Our benchmark results indicate that FUSE only handles approximately 400K 4KiB reads per second. Further increasing concurrency does not improve performance as lock contention intensifies. `perf` profiling reveals that the kernel-space spin lock consumes a significant amount of CPU time. + +Most applications, e.g. data analytics, perform large block writes on 3FS or they can buffer data in memory and flush it to 3FS when write buffer is full. However, FUSE on Linux 5.x does not support concurrent writes to the same file[^1]. Applications overcome this limitation by writing to multiple files concurrently, maximizing the total throughput. + +Read operations exhibit more complex patterns. Some training jobs require random access to dataset samples, with read sizes varying from a few kilobytes to several megabytes per sample. And samples are typically not 4K-aligned in files. Data loaders are specifically designed to fetch batches of samples. But they perform poorly when handling small random reads on FUSE-mounted 3FS. Bandwidth of SSDs and RDMA network are not fully utilized. + +### Asynchronous zero-copy API + +Implementing the file system client as a VFS kernel module avoids performance issues mentioned above. But kernel module development is significantly more challenging than user-space system programming. Bugs are difficult to diagnose and can lead to catastrophic failures in production environments. For example, machines may crash and leave no log message for debugging. When upgrading a kernel module, all processes using the file system must be stopped cleanly; otherwise, a machine restart is required. + +For these reasons, we have chosen to implement a native client within the FUSE daemon. This client offers an interface that supports asynchronous zero-copy I/O operations. File meta operations are still handled by FUSE daemon (e.g. open/close/stat files). Applications call `open()` to obtain a file descriptor (fd) and register it via native API. They can then perform I/O operations on the file with native client. This approach ensures consistency in metadata operations with the POSIX API, making it easier to migrate existing code. + +The asynchronous, zero-copy API is inspired by Linux `io_uring`. Below are the key data structures in the API: + +- *Iov* A large memory region for zero-copy read/write operations, shared between the user process and the native client. InfiniBand memory registration is managed by the client. In native API, all read data will be read into Iov, and all write data should be written to Iov before calling the API. + +- *Ior* A small shared ring buffer for communication between user process and native client. The usage of Ior is similar to Linux `io_uring`, where the user process enqueues read/write requests, and the native client dequeues these requests for completion. The requests are executed in batches, with their sizes controlled by the `io_depth` parameter. Multiple batches are processed in parallel, whether from different rings or the same ring. However, multiple rings are still recommended for multi-threaded applications, as sharing a ring requires synchronization, which can impact performance. + +Within the native client, multiple threads are spawned to fetch I/O requests from the Iors. These requests are batched and dispatched to storage services, reducing RPC overhead caused by small read requests. + +## File metadata store + +### Location of file chunks + +3FS divides file data into equally sized chunks and stripes them across multiple replication chains (replication chains and chain tables are defined in Section [Data placement](#data-placement)). Users can specify the chain table, chunk size, and stripe size for files on a per-directory basis. Each chunk is independently stored on multiple storage services, with its chunk ID generated by concatenating the file’s inode id and chunk index. + +When creating a new file, the metadata service employs a round-robin strategy to select consecutive replication chains from the designated chain table, based on the stripe size. Next, a random seed is generated to shuffle the selected chains. This allocation strategy ensures balanced data distribution across chains and SSDs. + +When an application opens a file, the client contacts the meta service to obtain the file’s data layout information. Then the client can independently compute chunk IDs and chains for data operations, minimizing the involvement of the meta service in the critical path. + +### File metadata on transactional key-value store + +3FS uses FoundationDB as its distributed storage system for metadata. FoundationDB provides a key-value store interface and supports transactions with Serializable Snapshot Isolation (SSI). 3FS stores all metadata as key-value pairs in FoundationDB. Meta services follow a stateless architecture, greatly enhancing maintainability by allowing administrators to seamlessly upgrade or restart services without disruption. When clients experience request failures or timeouts, they can automatically fail over to other available services. + +The file system metadata primarily consists of two core structures: inodes and directory entries. Inodes store attribute information for files, directories, and symbolic links, each identified by a globally unique 64-bit identifier that increments monotonically. Inode keys are constructed by concatenating the "INOD" prefix with the inode id, which is encoded in little-endian byte order to spread inodes over multiple FoundationDB nodes. The inode values vary by its type: + +- All inode types contain basic attributes: ownership, permissions, access/modification/change times. + +- Additional attributes for file inodes: file length, chunk size, selected range in chain table, shuffle seed. + +- Additional attributes for directory inodes: the parent directory’s inode id, default layout configurations for subdirectories/files (chain table, chunk size, stripe size). The parent’s inode id is required to detect loops when moving directories. When moving `dir_a/dir_b` to `dir_c/`, we need to ensure that `dir_c` is not a descendant of `dir_b`, which can be achieved by checking all ancestors of `dir_c` upward. + +- Additional attributes for symbolic link inodes: target path string. + +Directory entry keys are composed of a "DENT" prefix, the parent inode ID, and the entry name. Directory entry values store the target inode id and inode type. All entries within a directory naturally form a contiguous key range, allowing efficient directory listing via range queries. + +The meta operations leverage FoundationDB’s transactions: + +- Read-only transactions used for metadata queries: fstat, lookup, listdir etc. + +- Read-write transactions used for metadata updates: create, link, unlink, rename etc. + +For write transactions, FoundationDB tracks the read/write key sets to form conflict detection sets. When concurrent transaction conflicts are detected, the meta service automatically retries the transaction. This design enables multiple meta services to process requests in parallel while maintaining file system metadata consistency. + +### Dynamic file attributes + +On most local file systems, deleting an opened file is deferred until all associated file descriptors are closed. Consequently, it is necessary to track all file descriptors of the file. Training jobs open a large number of files during startup. Storing all file descriptors would impose heavy load on meta service and FoundationDB. Since training jobs do not depend on this feature, 3FS does not track file descriptors opened in read-only mode. + +3FS maintains a file session for each file descriptor (fd) opened in write mode since deleting write opened files may lead to unreclaimable garbage chunks from concurrent writes. When a file with active write sessions is deleted, meta service delays the deletion until all its fds are closed. To prevent lingering sessions from offline clients, the 3FS meta service periodically checks client liveness and cleans up sessions of offline clients. + +The file length is stored in the inode. For files being actively updated, the length stored in inode may diverge from the actual length. Clients periodically (5 seconds by default) report to meta service maximum write position of each file opened in write mode. If this position exceeds the length in inode and there is no concurrent truncate operation, this position is adopted as the new file length. + +Due to the possibility of concurrent writes from multiple clients, the method described above ensures only eventual consistency for file lengths. When processing close/fsync operations, the meta service obtains the precise file length by querying the ID and length of the last chunk from the storage service. Since file data is striped across multiple chains, this operation incurs non-negligible overhead. + +Concurrent updates to the same file’s length by multiple meta services may cause transaction conflicts and lead to repeated file length computation. To mitigate this, meta service distributes file length update tasks across multiple meta services using inode IDs and the rendezvous hash algorithm. + +Our production environments use a large stripe size: 200. For small files, the number of chains containing file chunks is well below this number. The number of potentially used chains is stored in file inode and used as a hint when updating the length. It starts with an initial value of 16 and is doubled each time additional file chunks are written to more chains. This allows us to avoid querying all 200 chains when updating lengths of small files. This optimization can also be extended to the deletion of small files. + +## Chunk storage system + +The design goal of chunk storage system is to achieve the highest bandwidth possible even when there are storage medium failures. The read/write throughput of 3FS should scale linearly with the number of SSDs and bisection network bandwidth between clients and storage services. Applications access storage services in a locality-oblivious manner. + +### Data placement + +Each file chunk is replicated over a chain of storage targets using chain replication with apportioned queries (CRAQ). In CRAQ write requests are sent to the head target and propagated along a chain. Read requests can be sent to any of the storage target. Usually the read traffic is evenly distributed among all targets in a chain for better load balance. Multiple storage targets are created on each SSD and the targets join different chains. + +Suppose there are 6 nodes: A, B, C, D, E, F. Each node has 1 SSD. Create 5 storage targets on each SSD: 1, 2, ... 5. Then there are 30 targets in total: A1, A2, A3, ..., F5. If each chunk has 3 replicas, a chain table is constructed as follows. + +| Chain | Version | Target 1 (head) | Target 2 | Target 3 (tail) | +| :---: | :-----: | :-------------: | :------: | :-------------: | +| 1 | 1 | `A1` | `B1` | `C1` | +| 2 | 1 | `D1` | `E1` | `F1` | +| 3 | 1 | `A2` | `B2` | `C2` | +| 4 | 1 | `D2` | `E2` | `F2` | +| 5 | 1 | `A3` | `B3` | `C3` | +| 6 | 1 | `D3` | `E3` | `F3` | +| 7 | 1 | `A4` | `B4` | `C4` | +| 8 | 1 | `D4` | `E4` | `F4` | +| 9 | 1 | `A5` | `B5` | `C5` | +| 10 | 1 | `D5` | `E5` | `F5` | + +Each chain has a version number. The version number is incremented if the chain is changed (e.g. a storage target is offline). Only the primary cluster manager makes changes to chain tables. + +A few chain tables can be constructed to support different data placement requirements. For example, two chain tables can be created, one for batch/offline jobs and another for online services. The two tables consist of storage targets on mutually exclusive nodes and SSDs. + +Logically, the state of each chain changes independently. Each chain can be included in multiple chain tables. The concept of chain table is created to let metadata service pick a table for each file and stripe file chunks across chains in the table. + +### Balanced traffic during recovery + +Suppose read traffic is evenly distributed among all storage targets in the above chain table. When A fails its read requests would be redirected to B and C. Under heavy load the read bandwidth of B, C is immediately saturated and B, C become the bottleneck of the entire system. Replacing a failed SSD and syncing data to the new SSD can take several hours. The read throughput is impaired during this period. + +To reduce the performance impact, we can have more SSDs share the redirected traffic. In the following chain table, A is paired with every other SSDs. When A fails, each of the other SSDs receives 1/5 of A’s read traffic. + +| Chain | Version | Target 1 (head) | Target 2 | Target 3 (tail) | +| :---: | :-----: | :-------------: | :------: | :-------------: | +| 1 | 1 | `B1` | `E1` | `F1` | +| 2 | 1 | `A1` | `B2` | `D1` | +| 3 | 1 | `A2` | `D2` | `F2` | +| 4 | 1 | `C1` | `D3` | `E2` | +| 5 | 1 | `A3` | `C2` | `F3` | +| 6 | 1 | `A4` | `B3` | `E3` | +| 7 | 1 | `B4` | `C3` | `F4` | +| 8 | 1 | `B5` | `C4` | `E4` | +| 9 | 1 | `A5` | `C5` | `D4` | +| 10 | 1 | `D5` | `E5` | `F5` | + +To achieve maximum read throughput during recovery, the load balance problem can be formulated as a balanced incomplete block design. The optimal solution is obtained by using integer programming solver. + +### Data replication + +CRAQ is a write-all-read-any replication protocol optimized for read-heavy workloads. Utilizing read bandwidth of all replicas is critical to achieve highest read throughput in an all-flash storage system. + +When a write request is received by a storage service, it goes through the following steps: + +1. The service checks if the chain version in write request matches with the latest known version; reject the request if it’s not. The write request could be sent by a client or a predecessor in the chain. + +2. The service issues RDMA Read operations to pull write data. If the client/predecessor fails, the RDMA Read operations may time out and the write is aborted. + +3. Once the write data is fetched into local memory buffer, a lock for the chunk to be updated is acquired from a lock manager. Concurrent writes to the same chunk are blocked. All writes are serialized at the head target. + +4. The service reads the committed version of the chunk into memory, applies the update, and stores the updated chunk as a pending version. A storage target may store two versions of a chunk: a committed version and a pending version. Each version has a monotonically-increasing version number. The version numbers of committed version and pending versions are `v` and `u` respectively, and satisfy `u = v + 1`. + +5. If the service is the tail, the committed version is atomically replaced by the pending version and an acknowledgment message is sent to the predecessor. Otherwise, the write request is forwarded to the successor. When the committed version is updated, the current chain version is stored as a field in the chunk metadata. + +6. When an acknowledgment message arrives at a storage service, the service replaces the committed version with the pending version and continues to propagate the message to its predecessor. The local chunk lock is then released. + +Suppose there are 3 targets in the chain: `A, B, C`. A write request has just entered step 5 at `A`. `A` forwards the request to successor `B`. Then `B` instantly fails and the forwarded write request is lost. When cluster manager detects `B`’s failure, it marks `B` as offline and moves it to the end of chain and broadcasts the updated chain table. Once `A` receives the latest chain table, it forwards the write request to the new successor `C`. `C` may not receive the latest chain table yet and rejects the request. But `A` can keep forwarding the request to `C`. Eventually `C` gets the latest chain table and accepts the request. + +When a read request arrives at a storage service: + +1. When the service only has a committed version of the chunk, this version is returned to the client. + +2. Unlike CRAQ, our implementation does not issue version query to the tail target. When there are both committed and pending versions, the service replies a special status code to notify the client. The client may wait for a short interval and retry. Or the client can issue a relaxed read request to get the pending version. + +### Failure detection + +The cluster manager relies on heartbeats to detect fail-stop failures. Cluster manager declares a service failed if it does not receive heartbeats from it for a configurable interval (e.g. T seconds). A service stops processing requests and exits if it cannot communicate with cluster manager for T/2 seconds. The heartbeat can be seen as a request to \*renew a lease\* granted by the manager. + +The metadata services are stateless. The list of online meta services provided by cluster manager is a simple service discovery mechanism that helps clients create connections to metadata services. If one meta service is down, the clients may switch to any other metadata service. + +Cluster manager plays a more critical role in membership changes of storage services. It maintains a global view of chain tables and storage targets’ states. Each storage target has a public state and a local state. + +Public state indicates if it’s ready to serve read requests and if write requests would be propagated to it. Public states are stored with chain tables and distributed to services and clients. + +| Public State | Read | Write | Notes | +| :----------- | :--: | :---: | :---------------------------------------------- | +| serving | Y | Y | service alive and serving client requests | +| syncing | N | Y | service alive and data recovery is in progress | +| waiting | N | N | service alive and data recovery not started yet | +| lastsrv | N | N | service down and it was the last serving target | +| offline | N | N | service down or storage medium failure | + +Local state is only known by storage services and cluster manager, and it’s stored in the memory of cluster manager. If a storage target has medium failure, the related service sets the target’s local state to offline in heartbeat. If a storage service is down, storage targets managed by the service are marked offline. + +| Local State | Notes | +| :---------- | :--------------------------------------------------- | +| up-to-date | service alive and serving client requests | +| online | service alive and target in syncing or waiting state | +| offline | service down or storage medium failure | + +A storage target can change from one public state to another in response to the latest local state. The local state plays the role of a triggering event. The cluster manager periodically scans every chain and updates the public states of targets on the chain according to a state-transition table. + +- The chain version is incremented if the chain is updated. + +- If a storage target is marked offline, it’s moved to the end of chain. + +- If a storage service finds public state of any local storage target is lastsrv or offline, it exits immediately. The service may be isolated from the cluster manager by network partition error. + +- Once the data recovery of a storage target in syncing state is completed, the storage service set the target’s local state to up-to-date in subsequent heartbeat messages sent to cluster manager. + +| Local State | Current Public State | Predecessor’s Public State | Next Public State | +| :---------- | :------------------- | :------------------------- | :---------------- | +| up-to-date | serving | (any) | serving | +| | syncing | (any) | serving | +| | waiting | (any) | waiting | +| | lastsrv | (any) | serving | +| | offline | (any) | waiting | +| online | serving | (any) | serving | +| | syncing | serving | syncing | +| | | not serving | waiting | +| | waiting | serving | syncing | +| | | not serving | waiting | +| | lastsrv | (any) | serving | +| | offline | (any) | waiting | +| offline | serving | has no predecessor | lastsrv | +| | | has predecessor | offline | +| | syncing | (any) | offline | +| | waiting | (any) | offline | +| | lastsrv | (any) | lastsrv | +| | offline | (any) | offline | + +### Data recovery + +When a storage service exits (e.g. process crashes or restarts during upgrade), or a storage medium failure occurs, all related storage targets will be marked as offline and moved to the end of chains by cluster manager. Once the service restarts, each target on the service enters into the recovery process independently. The entire recovery process overlaps with normal activity and minimizes any interruption. + +When a previously offline storage service starts: + +1. The service periodically pulls latest chain tables from cluster manager. But it does not send heartbeats until all its storage targets have been marked offline in the latest chain tables. This ensures all its targets would go through the data recovery process. + +2. When a write request arrives during recovery, the request is always a full-chunk-replace write. The local committed version is updated and any existing pending version is abandoned. Since current service is the tail, an acknowledgment message is sent to the predecessor. The full state of the predecessor is copied to the returning service through a continuous stream of full-chunk-replace writes. + +3. Before the data recovery of a storage target starts, the predecessor sends a dump-chunkmeta request to the returning service. Then the service iterates the local chunk metadata store to collect the ids, chain versions and committed/pending version numbers of all chunks on the target, and replies the collected metadata to the predecessor. + +4. When a sync-done message arrives, the service knows that the storage target is up-to-date. It sets local state of the target to up-to-date in heartbeat messages sent to cluster manager. + +When a storage service finds a previously offline successor is online: + +1. The service starts to forward normal write requests to the successor. Clients may only update a portion of the chunk, but the forwarded write requests should contain the whole chunk, i.e. a full-chunk-replace write. + +2. The service sends a dump-chunkmeta request to the successor. Once the metadata of all chunks on the successor target are received, it collects the chunk metadata on its local target. Then it compares the two copies of chunk metadata to decide which chunks should be transferred. + +3. The selected chunks are transferred to the successor by issuing full-chunk-replace write requests. + + - The chunk lock is first acquired for each chunk. + + - The chain version, committed version number and chunk content are read and transferred to successor by sending a full-chunk-replace request. + + - The chunk lock is released. + +4. When all required chunks have been transferred, a sync-done message is sent to the successor. + +The rules used to decide which chunks should be transferred are: + +- If a chunk only exists on the local target, it should be transferred. + +- If a chunk only exists on the remote target, it should be removed. + +- If the chain version of local chunk replica is greater than that of the remote chunk replica, it should be transferred. + +- If the chain versions of local/remote chunk replicas are the same but local committed version number does not equal to the remote pending version number, it should be transferred. + +- Otherwise, two chunk replicas are either the same or being updated by in-progress write requests. + +### Chunks and the metadata + +File chunks are stored in the chunk engine. On each SSD, the persistent storage of the chunk engine consists of a fixed number of data files for storing chunk data, and a RocksDB instance for maintaining chunk metadata and other system information. Additionally, the chunk engine maintains an in-memory cache of chunk metadata to enhance query performance. A chunk allocator is implemented for fast allocation of new chunks. The chunk engine interface provides thread-safe access through the following operations: + +1. *open/close* Initializes the engine by loading metadata from RocksDB and reconstructing chunk allocator states. + +2. *get* Retrieves chunk metadata and reference-counted handle through a hashmap cache, enabling concurrent access with O(1) average complexity. + +3. *update* Implements copy-on-write (COW) semantics by allocating new chunks before modifying data. Old chunks remain readable until all handles are released. + +4. *commit* Commit the updated chunk metadata to RocksDB via write batches to ensure atomic updates; synchronously refresh the chunk metadata cache. + +The chunk data will ultimately be stored on physical blocks. Physical block sizes range from 64KiB to 64MiB in increments of powers of two, totaling 11 distinct sizes. The allocator will assign physical blocks whose sizes most closely match the actual chunk size. A resource pool is constructed for each physical block size, with each pool containing 256 physical files. The usage status of physical blocks is maintained in memory using bitmaps. When a physical block is reclaimed, its bitmap flag is set to 0. The actual storage space of the block remains preserved and will be prioritized for subsequent allocations. When no available physical blocks remain, `fallocate()` will be used to allocate a contiguous large space in physical files, creating 256 new physical blocks - this approach helps reduce disk fragmentation. + +When performing write operations on a chunk, the allocator first assigns a new physical block. The system then reads existing chunk data into a buffer, applies the update, and writes the updated buffer to the newly allocated block. An optimized process is implemented for appends, where data is directly added in-place at the end of the existing block. A new copy of metadata is constructed from the new block's location and existing chunk metadata. Subsequently, both the new chunk metadata and statuses of new and old physical blocks are atomically updated in RocksDB. + +[^1]: https://elixir.bootlin.com/linux/v5.4.284/source/fs/fuse/file.c#L1573 diff --git a/docs/images/gray_sort_client.png b/docs/images/gray_sort_client.png new file mode 100644 index 0000000000000000000000000000000000000000..b21df5de562661c5c8dade69b5a507cd1ffc8c35 GIT binary patch literal 535589 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

*h9f?;u#{6P3RK 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

-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

vBp~exMWG(kUKU6&TiJ4~mD?wwvY*xWnJb>2^ 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

} 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∈g zD#hU)cdP8-qCNUiaHZCte900&5{h2y5sHK#eu1M>sef4E5YE^>lu~tp9C<-TXK-FI zzebWbduO}d_x}P*pOZ6{j64Y7>C2-z4hwfa4sRNwIG3PP)#<4XI@={wJZ+@IN|SaN z){R-NVlog)IJ@UU=4{aahkW?xrlD-*n~OqZ6%qFXMpznpvo2`XyAP++H~F;wneh*^ zoV&QVG{G%)5cH9jw9Kd7vz7T)lwa`ac3Ql5pg(}$hPa{6R{{XEvXGii~V&S}IU>#TT)G8twU>F9T6%RjSXwkL_(r@cYgcy^v!ZIZx<5cX?o} zpl!Su8SeRT9f);O6vD)r1d@sT_l7iLR$E=6Uwv4HY0?t(7%t`^CF3pAM;xKa{G-nY zVWgiqwAoFSD22G#1-hDBDgN6;H7E9SD>7+3&q@S`aL_JTI*~A4CW(t-b5uKCMuqO= zQ8+O|kS219jKH|`lLrs%2FdhDf0mtf2~$(YXlTgYcMn7?m3gU*KIT#q_eKwS#;KK* zzuN`+q&8fFf&ya9&f4P)!Za+XWn)I<)zzxSgRv_0b%Bn~p)e67zV0mv5mSJYqRC=> zz>)YV1F&E#@K!!s1*C862CWc2s^XQBgG>3Fc+p;yT{qYQfMJyOYAO>sf$ucF3BG%3 zq2#>b-gB3 zt}bq?w}J|BvxA`)_V~=3bm3k@dTrguQXdoG&cwOAxg4h*HdX|sjymzMj5;(PpxFrmL0!KDfs0J|Lno?YLf>XgCtfo z!@bA2HskS=zdsESz7n`|YWfYb^1?sqSpZ`6vmcOUQupwz!6~ag6>-*~X$U~pq7HJf zTO^D3Sj>HE;H!Bc^`BbewtT(vCd*B|lbmU$|L+A$MqF2sQe=_moeXD*jcYrZJrQvY z?@UR~1(Y6Elkn@UE9Y@$Wfy4>VVE#@GNg=>qvOdIJExO1*+rWgUso+aQUs-l1!Sk# z?~E@qVJcJb`WRaHryzJtoEL}*?}(5dG8J2H8CNFLtg^lT5ZLQ!__2;^vMciD!DI+!VE zH{*vf`aW9ZJ<6WVT#qPybcq}%%t;GJKvvOTR+~9k{wg6_15@dVcWU)Bgrc%GO@X3{AgTlg4vz0$3$6^hDQLW%Wr&o=}5qXnc)wEZAOt@5#rb0fi<<2w5 z)=JIu`#SZlZU?Nz7C`YwT>j+WiR~bFdV{Z2h(ql>a6yadoI$^^mj6LIU`Yfy(|Kdx zd}u&FEW!Dxm|uI-ab-gNkB~58MNTf})e?VpgFF0rgIEvX$bsT3PQTxFPrKj<)J@^N zpG;*k8#cmJnqY<;u1)bff?B*7EkpMM?KTi3`{w-|0vtjpL!mzfxpH}|?t>}dfwcVl z{|kh&E-<2>1F6P{CIoUnU#CJVC)kZ?0niNAW|1NVR*ndj##uQRbLyf_aN;^ZdAJh(UGK6w4eD9=Mi~OmkyitCA z5P5F7;ss3q(Vbt57<=hxH!mIlrx~s-ga@5e8>4>+eTN8Xint zA9~?h@siWMaW((A#ZAfmb~_!AagNySki%$jsXxPgBt@-YPo&|U7~6t17N^80iRN9| zx8+(Y*M?)V<${Lce%f z4-E;h>xXtWnhm4d3*NjePjBbRqBp7$)7S?u(E~3E3ufm7R?-y9nWGi0HRH$A+MH*F zv!*~4hWYnc1Xk4#;oZqnQFt#?UW4&e%3BNc_8G3S*u|e?~Y>jz|H}5@O=< zF^M1UJKgkAef|HgL)O4()g*v<6>v`r;;KYwzDZ=)l$MN1t-Rri5?Im@ovNcM*+Atz zhW~^Ge_bn;FcIMdo68wP{t3AYdY&J&E0$YK+O9Y9BUj}Y3y`hHfer~6U&=j4rE^RU z91=%z9wavptzXg6bCZ5*shpn^X{ctRtzv}I|1#vJJzI|h2KwKOZu;|WkeF{3mHD04 zrK*AC_81!$Qn<@Re(3&^kXahvp*tutjxZRGcVMr{*MX?s|Ho*=5sd?-MK@rYuWpPD z3BMV#cYdf5ov1H3(buZFd*(dLkxPkc2#Ixqj#Wc$n1BsYvNs_11rG2{=54i!7qlLJ z7OW5XzMc&57j?_Q203V{!pMLi*rctWwdh1Ie`q8xa)vju-i-40#2Cx|=)Ox7JE%L4 z+BL!4j;vMue_uER=xRrSAX60GSFzu)jN)6#rHHqaYh5BYp^-NUk*`wk4jV;j$TiztazSfWqcKn(AT)@;Gf#9bcf@fXnzt(u?43& zMhZCNzgaKL5UZSmzSs4W|K^o^kH;n*oEXhdsaG=y?%+^iS498QPbF#N7Ed#zYKf?2 zIdS)x6nrOKMzMtM5kFpRZY@8jpp+mRjmj!?^=~zdj8CZ zd5c(1;*big$Q)YF!ADFgPS2cNZGMFGDJXqVh?Qb&@dY2oXOfb5(wWnuqp)`v31*>{z7A<)PqKQ;*`&B z59WOC2vkF97VH4q(}ft*^d%_cUe_T_K8Yk_tu_u3S1W^$h&al8_UwFfj8UAUJ}<=* zzFLx6K7~7et?9-+_v9CPU~oVp%3zhpH`U3B$~FOnBoY{I)aP3?!sC~|s2H5~dy!;S z?Hf1f@HgSH(Wt~7Qz=}h?iaXRQ7qmg%#>EvE;|8uj}GJ=R&p2Oep}{=tL&z;cyI9x z{a^rIx3%Fz)}%ZRfXCnd`|=1~7J_$Jv2u2SUCbZ6`u)2=0gBkt2sGLtNZmU84>Pt2>P+hG!0jj$&DcdHFpRCEnI$>(CwwDG6k~~?* zc3VJLaP%fk^GBQ-&vcw2lvy`(00V5#C(d(w7vApy^D9@E7oWbAZNsgtDab+yXmzJ_ z40j4C2JoZD3O5aH-*|KV`a>;>sS24Lg-6w33<_O?d1>2ai(JfNQ6RthNBZfqS&;4; z|Dox1dUL1KWO-RLVW{V)1ES2+b;r#L?;AX=oF&mNzr1TAhiM@t+0J98SLAKNw~w& zeE?pZ#tg5=#3R!ersl~3wG}7er(*@zJdmLA2Vkn&!wT=NV!w*>iBEw06$dnkrL!Vd z@(C#JXrqWY#>ct!I~{VX`ur<%oF zS(HPtd3eV1y|y&{nxQuDYuexYD%>mk5X883E?HqknhA-UK#m_BrRslSacda`G*{f) z*G;}K_(l*!AwyY*Jjhp_+6Y};Xy;4P$>SmlCWNc}r(ea@Rkyh<( z1xKoxZe;X5n^acKlPsFh4-=s&ug4ST-2a&e9U5rn zv=8)(kry6|(FG>dH_v`6Obu`6u`%Gm6Te6OdP_O=W~SJM1QcL|z4}BGCuBF(7;wMW zjPIHSlY!~(>sePHuy*{{$_6Wc1&ZdX-W;I9RsTFn1~m}uhg5pS{Mi1r=*PO)F{2dj zYGm$4t<8qGVuGY!cM~!5rn$y0)hmTW5um1ehr<6yV{O#AMj%@JOK<3xiT-e8(qG6sI$l z@QCTIpi2AP+n_Q-waSBYc%@(fn~b6G0pC==fr%Y&@-k_o$LPexqRKwO_udFVEQ0el zp|4L`FytS5PI5RP5?-d-|J;|6Zp1{qpN^J}FT{C;=$V|7Kgv&p8KmrN*9hsWkM?Kn z30gng^sGA$8%9*5d-VPq#zfgE2v>)*RwQk_9BU(!ij8)CI7fe*pcl8 zIAG#cF@OWN$4KMc_pG#;7sD!iBWntgFyvqpvNN6Ngh@Gc{qR=sKh=Y7IxX?Lbb=Jz z_xE~X{!Vp>N=5ZuVX<)ba>)J`!(Ls`N|@zCjkgN4&~|H&%(LRBI%-ZiOxCeD7<1I! z0;8%w@y`o=?D&_(#vcF={gNI9GBGi|g~7L~-0GqN{8(f4fp&feL;fyO?&B@@%UD_A zG26xHK&JSyEA|Wn9IsviV9QSL%*iwK`e_E}XAH1!Jtu?|;xRA(Crc_O_M=0-iX$~U zI>Ev^%i^F8Qg0rNGLV7$=7kDwM!bK6}KTWT;%WbYR3C z;GCS+rWUg->Y9qe-e$_~xenV<&rpnx^_{C7??W?=9`!k$KI-ni`0ak<0LZWCRQz7^>S;HLV)xlZ#8}K6#DSM=R)?zu zQp$mwv7Y&JO}UwD7Z{@jLDbfC*6X@5Z4&LM>iDZiu1^vrZ?+k}46&oYrKX4bV%)lV zm=*yihB~DonW~@@$c$O78umNVNQM1t*|*InMUi>k*==`gPb}YbX4pQ9Cif@WcjWm} zxaWqB8?o|R$=1|4 zBC1yO>u@5b8g5%pQU7g^uU`Rq@K1sRB&4Ym69qZI73r+LT~cyGo^#Q#=_%yB8T5V4 z24IkXwdEQHR(Bo9tp7!(aWN=8@{X*O7+gh$Q$YC6w!STi;Iq@bo6OkDsDqq!I^csL zg}b`!>o(a!cD4Hi8~rl}T)j!_SqLw#MSsn1c^rT=`_hhK8}`zN3PTztBL%?5*6J{q zOhjY;y%o|uG3!FPhn>`wxr?I7wN`={Z6g1v1K_2&WRLdqwyVEAUV*GOv+7b5kx zDT|Wk!$N(P=~i`a_e&2VeB=#1v+34aS43D~VU|YZjeqN4l=$KI1EZQSGDTVSQFuR| zREIZT?}g_0hY2esHw#vtEw)y-M@7Ng>|MM%IN+;S)pm zVmW#|IC3b{CjplqU8rpJe_Jswg0_$FHB|pAvw3=} zVVxI5kCqs$HGv!RNVJfmaJCA{>vC}Xi9EP`l$P61HbjZM@@6ludZ`p{s9#IOhdte` zxlk`c7ho3_W*)5B)HcNxp%M#3g>D>iSp=}Ksb~Kpmg4W9yt8Tk)&Td@MYe>`v-t}I zMG;ciC-sXcC`O-^2T!qP+k7M3sJ8B4RdPUBx~0+Kk<#%p(>K}l zS)A_A1%xEgowv8q@A0A^lQv1r!>itkD(EFqJ7mg8h;|Z;;L`i62P*ErVos?vX8wuRfqNwZ>|#=mWIg#>)?$ zgxxSZ!BR}1*MRhtaC{#_plQcbb0ZcWCEW?&>Qr7kTtv&tAxF8d|1&y3CYiDa4Nb#yHM+S5 z$X+`D-!8x?)tgX@hEwI-XX9+_CEP$!*`F#ywJmlgCx3p9^!s7R1a+(vQ=Sc#_-8Z> z?fS#h`liY|6Kzu;~A* zw5sE#d3I88xeZnDf(7}?e^Btd@o#(l6V~)nDL$_VD0c|WPEp-xzeaO5k+jxEcs&Wc zJ(Ec3yiHtw2i(7KxWA#k#5%^2hf}?iWD(2F#nK~1Jz|7W5;00?hrt;L5a?JR!ascn zuMc>WF3^gS0xQ@44jwZgPq5^q!OoO92(-~~c>tyDdr(Hmy97gZ`hIk|?5fbd!48+X zH(anLjpMJTrf*^bDk#;0XO$OQOYhO4FMRzw6jf_|Cfo9Y;omfNr zsMbE5)U43}Oy5(Lyhe6ChXXj{4z#9iBWj=Z5_hkS(TC};C@or@P7CISoUWFBd}96H zgp{9jd%{DsHM!hIx+jZ)Ue0gmu7ZqWHAA$7n`+vpj2rOe41rA|LQ!2am2mr)8b<@$ zS7y8a9N7Pb_5b_xY~0D2DultviIfu<3sHqGfhx<^qD=fWVT%WmYu9+L$Zsi^DU97u ztpJ`H1@VQ-N8|pYgqeju|8j-|PjL@zT|pU*4+~bI%8i+MtjOi)HKZ*>8E+ycNwrurJp1lIUu zwg+OM=RWb0qty|&*SNOv-JCqyVQQIKmisFuRciJT(ari9y&2%6ivTWSWuFsnw+SB< z3iOV699N2{zEFBxbvLT8nr$3{Bjmh8!6C%MSOW22C%{2BmHaAVrZPwRbg;C>NIR5( zr|=Jv!=z+D_xK#n3bHDQ#NT}ej+_d|lno_0UvEtO{^ChT5AiPhCcx`}{A1S9+|GBO zzwh_hIzwEARhfpGer&+!FZ2tICp;wd3{RIikSi++p!=QbHaal{l%YJlkw3RqpPX!2kI;9xQ z#$(vH4#M>zap~agEr2)sLG6xh`^^GCdDlzIRld>}t32%M-A#6>jE=02g&(CtL%E|@ zl#p$G;v$I}4!H__RYKwgJtu_OA@uR1Qj7hro3oZk*FZlOaH3nt1MGfZb;2xPMJ+7u zE}5Fdc+=<~e%&=coa+wxGA!v zfGq!+Nr7`=j^K2-AI{K_saxcCw`o+=M^ri5pYgXVzDS{2ac+ReTfE7C*&E*!wlM+G@P4l>F_ zilXqJlY00h{cx6g#cMJ*(f2^?=#Na9#W&kX0|>l6Iod7JXN9wEzE6MyQqRc0Fwr@y z*3<8~N=BvmO?TR$7x_D$%`g~nZM$gxWG|v-#++{SiITF$d15l>VwC5It4L1IQImx; zLyo8}1a>H2Pj3(wI&#(e%?aXIqfK^7pOJA z{wl_=C}IheG9sT(hof003LrzweXoovf)*I4bJ)J|`$lNr_C@$h2GRLZdOsPXWTynCRbFs5;y5Ev zfi@xwTdr26PURCf0cDP^nIL9|TX5Lgk~LJVAYv-jnv;PfmvPhS^GPVs)gqJ~PTmfC z!;?xXl}bw6NJ^WEDwT@ppHJeT!>~G{%-)S`OC0|#p=yC;wwv*zYI{p67ke-}KH!U# z94XbM7C41Uhe>>PkhsptrQPmwG-YbX%69EQ6R>^gN0mt{-V;UmHp*UN&=EN2gd~-l z$g)fHW&WGZT&R}BTIkR?e{F2vXmGE*{tVOMjTdXTMbz~MfcvKTHu(*WgrCsr z2#tYeruVA4cheRE-+5)he2Coa`M2`7Ym_`WWJ6xDked-pb!=XKHk`cTOC(E*+iwB5 zxZ8FI0zKNI9WpFGm1coA9hf>~k_E}D|JNsrbN!5Ydl?2x z12as{bp*HhR0gpD7j4o*oH4{9sMD~o|&-N|J0JA(jjvOsxo`Um^J01_C8 zMQ0WJF=so1jgmCiBpQV%#VN&SWM- zE%x5l-^b7IP%@EkC!NVUI(#4PpN=ry;`T2sB^PVWm|g!T#(=bbw~HOx)>!C(T;?Q? zOkSFZ+p${woAb3HMN8*RqcyLuxu{Y}{{)0iJ(jIy^Z=24nM}Uh<-gtnVkI@3W#@uJ ztL4f_6^|6BTaAJ1%cjk}Fl{cFP7f;*>k08f_ooRBHiW2gqR|lYUliTnimP8b0VHqr zvkeQQHvL9DuTiwpu4Tv(xM>pqhHobKuy_BB(J2#M$6o!kAAgZ{pAZZ#4akrdnqpZL zj9)eYPY*k53Zy`sXmcM0@7Qs>chS{IN=IWOVPW!m>R>LX|qndLpzWf3^rn@3WUWdw!AqQ)WtPVYywMIyu|} z&?^3M(3yAGJ=fu@8S{`Wa1>qOypn3z}d)n9mP3OW|!6S)vIm)gvYxuJ1X$UahWEWY;#h#*fO) zT5L0m85v&{0OvwPuz?p!N#_{L$1ZgjwwAxE$f@jH34z>r#9j+rh1wlhItLD~8D$~N z?|5i{QH6R3p;j#Xjd6Gee≈o2EH^CtLKbnH@km3Qv{VfUq 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

ji;*rJO zRHuj?0EwLRJO*c$l-t)L3@9J}_}_kj#8@<9Q5NADi3_YDQgdnI!^IjdDLzWwzk?Z;`#5*!@qA5k%M1XQ2z1ZdgzSvrhoi9g`$FZ_}@MeE3s_XfBS^;jpbth z?GrDTufpA)|M)nwYVFT|{40eLwibe{e||<{E9<{K2rjw%=g0p&$eDk=5#>*)F1%q$ zsnTOXQDS@MN^*szgNyQHc9c};aFb6IMs*6@GK8Qj@Pfm{Gjg|9D&$_#1R}s9}0`S*s6?MEASG8hJKDT8U%XLA{WlW1yiQKAyJET(zRqZfu7B6Jygu?R)~wyF7pFgF;P)^u>)ylUxao6hZznf zKr#XluDZ_S%b$_l@)erW0W7YSB5RaP3vxeJ-?_j(D z`CJy39A`pK{vh4@H{1L|{3=g#0C?qZ7)yJ~EPm>FyXM*6k_njA$+l0c*-bMdXs}F^#QMI#6ul>U|N) z10@XjpCvOzWUdLWs@~G>^gcwJJ`T?I1-WJ;`Fp_wnp(0>`Igi}zb!qmL@fgSuSYlF zBM{7-EwcUzRG+8wXTJ=e1?wAify`RSVm@90IZn_jo-cPs0El=LYwG}ZKS@Vqdl`L-{iG~D z1$e&Oe+5aGm{D=O2kwC_7r3WkOr&pY!@{qS?Psl4_5QDQrSP1f-faNtY6Z`u7ogiM zVhbHE1A~!8{xntt-!;Hah6b-K)4D)dUD8a%Y#ZJRv@1aWeIPJ`e)fFm1p2LWxM;pY zZla~HN?neVc{mCT>y-egLE+(-b%}V+$`U?YcN&_f8r(6jm^lBht@U>f3-DnzYKGd- z#VVKe`oqQnqlY^N$pVD7flMQa2XuMhbi}H<&tIgLOd$%$Pgy1&cGMS9V(M^yd z?o$Jl9Ravudm*th8C4;l6I$nq*44jODCO?If@WAFs>xL~IJ8>B6Zm@v4(e5{pbL$&i%cvJP~cr-3t zpZXpQw99iT)=nboQa`5u`dNPVe<$4vY51+t&-ueW*2Ybj^c%O*lW@gXz5lYq=y`44 zgxZ7E7|0=8M@h#DU3%pJJpPjun}0oF*h~}kw$ra4OL-bjqW=Q5^NuZ7;Fm43>|Dp2 zcc78)n!vYkRald8^l>=g)TvIw13!w)7FN6@e)W|DK+7wB{Oj=q|M7UlX?)HfJwZx! zvtN@9t`-u&55nxgL0>WnAzpR_sD4fQs-;Jeuue^=vH7c>IK^+j`Ab}rv=VCq1JKS- zQ@=hh(eZZxVr|40(wo@x>+wIX{ICC@3d%kDf(@0c_yw}p*}uvh9@D?8ms9l!A_sj* zP)O;#@Yid#{`D7LGXJWVBudG)-===`olyCbfC8;kRkF^n zgmS6-@7#SR8CC+(xSzaUbrQQW5}z^npAEV>~tElzxzYgT31LVT;S~T||gb+h@c=55{)^k^*Ik(?%#& z|J;CCY{Dd`f(VNQ^+N4G{%bQ`TK)GL{CY6gLk1e|?!R`>Uw@K>?BB`cuh0Bn#r}Ui l%zx|){{Qch$7NHC%km|udsYcnog_czq?Ej5!m&#?|38$TgUtW{ literal 0 HcmV?d00001 diff --git a/docs/images/gray_sort_server.png b/docs/images/gray_sort_server.png new file mode 100644 index 0000000000000000000000000000000000000000..7363c3a4854d7a133967e9d52b5ef59da782cb0c GIT binary patch literal 673307 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%0DK%x0%9Dz{_`%zIJLUaj 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%0AwwUX}rmIl;2}>%u_WjXNi-Nk62* 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