mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
Keeper binary with different entrypoint
This commit is contained in:
parent
7f0f0d6257
commit
6b47171f2c
@ -276,10 +276,7 @@ def parse_env_variables(
|
|||||||
if is_release_build(debug_build, package_type, sanitizer, coverage):
|
if is_release_build(debug_build, package_type, sanitizer, coverage):
|
||||||
cmake_flags.append("-DSPLIT_DEBUG_SYMBOLS=ON")
|
cmake_flags.append("-DSPLIT_DEBUG_SYMBOLS=ON")
|
||||||
result.append("WITH_PERFORMANCE=1")
|
result.append("WITH_PERFORMANCE=1")
|
||||||
if is_cross_arm:
|
|
||||||
cmake_flags.append("-DBUILD_STANDALONE_KEEPER=1")
|
cmake_flags.append("-DBUILD_STANDALONE_KEEPER=1")
|
||||||
else:
|
|
||||||
result.append("BUILD_MUSL_KEEPER=1")
|
|
||||||
elif package_type == "fuzzers":
|
elif package_type == "fuzzers":
|
||||||
cmake_flags.append("-DENABLE_FUZZING=1")
|
cmake_flags.append("-DENABLE_FUZZING=1")
|
||||||
cmake_flags.append("-DENABLE_PROTOBUF=1")
|
cmake_flags.append("-DENABLE_PROTOBUF=1")
|
||||||
|
@ -66,18 +66,18 @@ else()
|
|||||||
message(STATUS "Library bridge mode: OFF")
|
message(STATUS "Library bridge mode: OFF")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_CLICKHOUSE_KEEPER)
|
|
||||||
message(STATUS "ClickHouse keeper mode: ON")
|
|
||||||
else()
|
|
||||||
message(STATUS "ClickHouse keeper mode: OFF")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ENABLE_CLICKHOUSE_KEEPER_CONVERTER)
|
if (ENABLE_CLICKHOUSE_KEEPER_CONVERTER)
|
||||||
message(STATUS "ClickHouse keeper-converter mode: ON")
|
message(STATUS "ClickHouse keeper-converter mode: ON")
|
||||||
else()
|
else()
|
||||||
message(STATUS "ClickHouse keeper-converter mode: OFF")
|
message(STATUS "ClickHouse keeper-converter mode: OFF")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (ENABLE_CLICKHOUSE_KEEPER)
|
||||||
|
message(STATUS "ClickHouse keeper mode: ON")
|
||||||
|
else()
|
||||||
|
message(STATUS "ClickHouse keeper mode: OFF")
|
||||||
|
endif()
|
||||||
|
|
||||||
if (ENABLE_CLICKHOUSE_KEEPER_CLIENT)
|
if (ENABLE_CLICKHOUSE_KEEPER_CLIENT)
|
||||||
message(STATUS "ClickHouse keeper-client mode: ON")
|
message(STATUS "ClickHouse keeper-client mode: ON")
|
||||||
else()
|
else()
|
||||||
@ -131,10 +131,6 @@ add_subdirectory (static-files-disk-uploader)
|
|||||||
add_subdirectory (su)
|
add_subdirectory (su)
|
||||||
add_subdirectory (disks)
|
add_subdirectory (disks)
|
||||||
|
|
||||||
if (ENABLE_CLICKHOUSE_KEEPER)
|
|
||||||
add_subdirectory (keeper)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ENABLE_CLICKHOUSE_KEEPER_CONVERTER)
|
if (ENABLE_CLICKHOUSE_KEEPER_CONVERTER)
|
||||||
add_subdirectory (keeper-converter)
|
add_subdirectory (keeper-converter)
|
||||||
endif()
|
endif()
|
||||||
@ -143,6 +139,10 @@ if (ENABLE_CLICKHOUSE_KEEPER_CLIENT)
|
|||||||
add_subdirectory (keeper-client)
|
add_subdirectory (keeper-client)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (ENABLE_CLICKHOUSE_KEEPER)
|
||||||
|
add_subdirectory (keeper)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (ENABLE_CLICKHOUSE_ODBC_BRIDGE)
|
if (ENABLE_CLICKHOUSE_ODBC_BRIDGE)
|
||||||
add_subdirectory (odbc-bridge)
|
add_subdirectory (odbc-bridge)
|
||||||
endif ()
|
endif ()
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
set(CLICKHOUSE_KEEPER_SOURCES
|
set(CLICKHOUSE_KEEPER_SOURCES
|
||||||
|
keeper_main.cpp
|
||||||
Keeper.cpp
|
Keeper.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -8,6 +9,9 @@ set (CLICKHOUSE_KEEPER_LINK
|
|||||||
clickhouse_common_io
|
clickhouse_common_io
|
||||||
clickhouse_common_zookeeper
|
clickhouse_common_zookeeper
|
||||||
daemon
|
daemon
|
||||||
|
clickhouse-keeper-converter-lib
|
||||||
|
clickhouse-keeper-client-lib
|
||||||
|
clickhouse_functions
|
||||||
dbms
|
dbms
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -17,199 +21,11 @@ install(FILES keeper_config.xml DESTINATION "${CLICKHOUSE_ETC_DIR}/clickhouse-ke
|
|||||||
|
|
||||||
if (BUILD_STANDALONE_KEEPER)
|
if (BUILD_STANDALONE_KEEPER)
|
||||||
# Straight list of all required sources
|
# Straight list of all required sources
|
||||||
set(CLICKHOUSE_KEEPER_STANDALONE_SOURCES
|
clickhouse_add_executable(clickhouse-keeper ${CLICKHOUSE_KEEPER_SOURCES})
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperReconfiguration.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/RaftServerConfig.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/ACLMap.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/Changelog.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/CoordinationSettings.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/FourLetterCommand.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/InMemoryLogStore.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperConnectionStats.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperDispatcher.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperLogStore.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperServer.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperContext.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperFeatureFlags.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperSnapshotManager.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperSnapshotManagerS3.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperStateMachine.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperContext.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperStateManager.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperStorage.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperConstants.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperAsynchronousMetrics.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/KeeperCommon.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/SessionExpiryQueue.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/SummingStateMachine.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/WriteBufferFromNuraftBuffer.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/ZooKeeperDataReader.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Core/SettingsFields.cpp
|
target_link_libraries(clickhouse-keeper PUBLIC ${CLICKHOUSE_KEEPER_LINK})
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Core/BaseSettings.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Core/ServerSettings.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Core/Field.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Core/SettingsEnums.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Core/ServerUUID.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Core/UUID.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Core/BackgroundSchedulePool.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/IO/ReadBuffer.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/HTTPPathHints.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/KeeperTCPHandler.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/TCPServer.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/NotFoundHandler.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/ProtocolServerAdapter.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/CertificateReloader.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/PrometheusRequestHandler.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/PrometheusMetricsWriter.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/waitServersToFinish.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/ServerType.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/HTTPRequestHandlerFactoryMain.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/KeeperReadinessHandler.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/CloudPlacementInfo.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/HTTP/HTTPServer.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/HTTP/ReadHeaders.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/HTTP/HTTPServerConnection.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/HTTP/HTTPServerRequest.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/HTTP/HTTPServerResponse.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/HTTP/HTTPServerConnectionFactory.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Server/HTTP/WriteBufferFromHTTPServerResponse.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CachedCompressedReadBuffer.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CheckingCompressedReadBuffer.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CompressedReadBufferBase.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CompressedReadBuffer.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CompressedReadBufferFromFile.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CompressedWriteBuffer.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CompressionCodecEncrypted.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CompressionCodecLZ4.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CompressionCodecMultiple.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CompressionCodecNone.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CompressionCodecZSTD.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/CompressionFactory.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/ICompressionCodec.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Compression/LZ4_decompress_faster.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/CurrentThread.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/NamedCollections/NamedCollections.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/NamedCollections/NamedCollectionConfiguration.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/Jemalloc.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/ZooKeeper/IKeeper.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/ZooKeeper/TestKeeper.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/ZooKeeper/ZooKeeperCommon.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/ZooKeeper/ZooKeeperConstants.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/ZooKeeper/ZooKeeper.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/ZooKeeper/ZooKeeperImpl.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/ZooKeeper/ZooKeeperIO.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/ZooKeeper/ZooKeeperLock.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Common/ZooKeeper/ZooKeeperNodeCache.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/registerDisks.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IDisk.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/DiskFactory.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/DiskSelector.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/DiskLocal.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/DiskLocalCheckThread.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/LocalDirectorySyncGuard.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/TemporaryFileOnDisk.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/loadLocalDiskConfig.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/DiskType.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/IObjectStorage.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/MetadataOperationsHolder.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/MetadataStorageFromPlainObjectStorageOperations.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/MetadataStorageFromPlainObjectStorage.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/MetadataStorageFromPlainRewritableObjectStorage.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/MetadataStorageFromDisk.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/MetadataStorageTransactionState.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/DiskObjectStorageMetadata.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/MetadataStorageFromDiskTransactionOperations.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/DiskObjectStorage.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/DiskObjectStorageTransaction.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/DiskObjectStorageRemoteMetadataRestoreHelper.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/ObjectStorageIteratorAsync.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/ObjectStorageIterator.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/StoredObject.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/S3/S3ObjectStorage.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/S3/S3Capabilities.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/S3/diskSettings.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/S3/DiskS3Utils.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/CommonPathPrefixKeyGenerator.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/ObjectStorageFactory.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/MetadataStorageFactory.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/ObjectStorages/RegisterDiskObjectStorage.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IO/createReadBufferFromFileBase.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IO/ReadBufferFromRemoteFSGather.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IO/IOUringReader.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IO/getIOUringReader.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IO/WriteBufferFromTemporaryFile.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IO/WriteBufferWithFinalizeCallback.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IO/AsynchronousBoundedReadBuffer.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IO/getThreadPoolReader.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IO/ThreadPoolRemoteFSReader.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Disks/IO/ThreadPoolReader.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Daemon/BaseDaemon.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Daemon/SentryWriter.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Daemon/GraphiteWriter.cpp
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/../../src/Daemon/GitHash.generated.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/Standalone/Context.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/Standalone/Settings.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Coordination/Standalone/ThreadStatusExt.cpp
|
|
||||||
|
|
||||||
Keeper.cpp
|
|
||||||
clickhouse-keeper.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
# List of resources for clickhouse-keeper client
|
|
||||||
if (ENABLE_CLICKHOUSE_KEEPER_CLIENT)
|
|
||||||
list(APPEND CLICKHOUSE_KEEPER_STANDALONE_SOURCES
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../programs/keeper-client/KeeperClient.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../programs/keeper-client/Commands.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../programs/keeper-client/Parser.cpp
|
|
||||||
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Client/LineReader.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../../src/Client/ReplxxLineReader.cpp
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
clickhouse_add_executable(clickhouse-keeper ${CLICKHOUSE_KEEPER_STANDALONE_SOURCES})
|
|
||||||
|
|
||||||
# Remove some redundant dependencies
|
|
||||||
target_compile_definitions (clickhouse-keeper PRIVATE -DCLICKHOUSE_KEEPER_STANDALONE_BUILD)
|
|
||||||
target_compile_definitions (clickhouse-keeper PUBLIC -DWITHOUT_TEXT_LOG)
|
|
||||||
|
|
||||||
if (ENABLE_CLICKHOUSE_KEEPER_CLIENT AND TARGET ch_rust::skim)
|
|
||||||
target_link_libraries(clickhouse-keeper PRIVATE ch_rust::skim)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_link_libraries(clickhouse-keeper
|
|
||||||
PRIVATE
|
|
||||||
ch_contrib::abseil_swiss_tables
|
|
||||||
ch_contrib::nuraft
|
|
||||||
ch_contrib::lz4
|
|
||||||
ch_contrib::zstd
|
|
||||||
ch_contrib::cityhash
|
|
||||||
ch_contrib::jemalloc
|
|
||||||
common ch_contrib::double_conversion
|
|
||||||
ch_contrib::dragonbox_to_chars
|
|
||||||
pcg_random
|
|
||||||
ch_contrib::pdqsort
|
|
||||||
ch_contrib::miniselect
|
|
||||||
clickhouse_common_config_no_zookeeper_log
|
|
||||||
loggers_no_text_log
|
|
||||||
clickhouse_common_io
|
|
||||||
clickhouse_parsers # Otherwise compression will not built. FIXME.
|
|
||||||
)
|
|
||||||
|
|
||||||
set_target_properties(clickhouse-keeper PROPERTIES RUNTIME_OUTPUT_DIRECTORY ../)
|
set_target_properties(clickhouse-keeper PROPERTIES RUNTIME_OUTPUT_DIRECTORY ../)
|
||||||
|
|
||||||
if (SPLIT_DEBUG_SYMBOLS)
|
if (SPLIT_DEBUG_SYMBOLS)
|
||||||
clickhouse_split_debug_symbols(TARGET clickhouse-keeper DESTINATION_DIR ${CMAKE_CURRENT_BINARY_DIR}/../${SPLITTED_DEBUG_SYMBOLS_DIR} BINARY_PATH ../clickhouse-keeper)
|
clickhouse_split_debug_symbols(TARGET clickhouse-keeper DESTINATION_DIR ${CMAKE_CURRENT_BINARY_DIR}/../${SPLITTED_DEBUG_SYMBOLS_DIR} BINARY_PATH ../clickhouse-keeper)
|
||||||
else()
|
else()
|
||||||
|
@ -75,16 +75,6 @@ int mainEntryClickHouseKeeper(int argc, char ** argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CLICKHOUSE_KEEPER_STANDALONE_BUILD
|
|
||||||
|
|
||||||
// Weak symbols don't work correctly on Darwin
|
|
||||||
// so we have a stub implementation to avoid linker errors
|
|
||||||
void collectCrashLog(
|
|
||||||
Int32, UInt64, const String &, const StackTrace &)
|
|
||||||
{}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
|
443
programs/keeper/keeper_main.cpp
Normal file
443
programs/keeper/keeper_main.cpp
Normal file
@ -0,0 +1,443 @@
|
|||||||
|
#include <csignal>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include <new>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <tuple>
|
||||||
|
#include <string_view>
|
||||||
|
#include <utility> /// pair
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "config_tools.h"
|
||||||
|
|
||||||
|
#include <Common/StringUtils.h>
|
||||||
|
#include <Common/getHashOfLoadedBinary.h>
|
||||||
|
#include <Common/IO.h>
|
||||||
|
|
||||||
|
#include <base/phdr_cache.h>
|
||||||
|
#include <base/coverage.h>
|
||||||
|
|
||||||
|
|
||||||
|
int mainEntryClickHouseKeeper(int argc, char ** argv);
|
||||||
|
#if ENABLE_CLICKHOUSE_KEEPER_CONVERTER
|
||||||
|
int mainEntryClickHouseKeeperConverter(int argc, char ** argv);
|
||||||
|
#endif
|
||||||
|
#if ENABLE_CLICKHOUSE_KEEPER_CLIENT
|
||||||
|
int mainEntryClickHouseKeeperClient(int argc, char ** argv);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
using MainFunc = int (*)(int, char**);
|
||||||
|
|
||||||
|
/// Add an item here to register new application
|
||||||
|
std::pair<std::string_view, MainFunc> clickhouse_applications[] =
|
||||||
|
{
|
||||||
|
// keeper
|
||||||
|
{"keeper", mainEntryClickHouseKeeper},
|
||||||
|
#if ENABLE_CLICKHOUSE_KEEPER_CONVERTER
|
||||||
|
{"converter", mainEntryClickHouseKeeperConverter},
|
||||||
|
{"keeper-converter", mainEntryClickHouseKeeperConverter},
|
||||||
|
#endif
|
||||||
|
#if ENABLE_CLICKHOUSE_KEEPER_CLIENT
|
||||||
|
{"client", mainEntryClickHouseKeeperClient},
|
||||||
|
{"keeper-client", mainEntryClickHouseKeeperClient},
|
||||||
|
#endif
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
int printHelp(int, char **)
|
||||||
|
{
|
||||||
|
std::cerr << "Use one of the following commands:" << std::endl;
|
||||||
|
for (auto & application : clickhouse_applications)
|
||||||
|
std::cerr << "clickhouse " << application.first << " [args] " << std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
enum class InstructionFail : uint8_t
|
||||||
|
{
|
||||||
|
NONE = 0,
|
||||||
|
SSE3 = 1,
|
||||||
|
SSSE3 = 2,
|
||||||
|
SSE4_1 = 3,
|
||||||
|
SSE4_2 = 4,
|
||||||
|
POPCNT = 5,
|
||||||
|
AVX = 6,
|
||||||
|
AVX2 = 7,
|
||||||
|
AVX512 = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
auto instructionFailToString(InstructionFail fail)
|
||||||
|
{
|
||||||
|
switch (fail)
|
||||||
|
{
|
||||||
|
#define ret(x) return std::make_tuple(STDERR_FILENO, x, sizeof(x) - 1)
|
||||||
|
case InstructionFail::NONE:
|
||||||
|
ret("NONE");
|
||||||
|
case InstructionFail::SSE3:
|
||||||
|
ret("SSE3");
|
||||||
|
case InstructionFail::SSSE3:
|
||||||
|
ret("SSSE3");
|
||||||
|
case InstructionFail::SSE4_1:
|
||||||
|
ret("SSE4.1");
|
||||||
|
case InstructionFail::SSE4_2:
|
||||||
|
ret("SSE4.2");
|
||||||
|
case InstructionFail::POPCNT:
|
||||||
|
ret("POPCNT");
|
||||||
|
case InstructionFail::AVX:
|
||||||
|
ret("AVX");
|
||||||
|
case InstructionFail::AVX2:
|
||||||
|
ret("AVX2");
|
||||||
|
case InstructionFail::AVX512:
|
||||||
|
ret("AVX512");
|
||||||
|
#undef ret
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sigjmp_buf jmpbuf;
|
||||||
|
|
||||||
|
[[noreturn]] void sigIllCheckHandler(int, siginfo_t *, void *)
|
||||||
|
{
|
||||||
|
siglongjmp(jmpbuf, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check if necessary SSE extensions are available by trying to execute some sse instructions.
|
||||||
|
/// If instruction is unavailable, SIGILL will be sent by kernel.
|
||||||
|
void checkRequiredInstructionsImpl(volatile InstructionFail & fail)
|
||||||
|
{
|
||||||
|
#if defined(__SSE3__)
|
||||||
|
fail = InstructionFail::SSE3;
|
||||||
|
__asm__ volatile ("addsubpd %%xmm0, %%xmm0" : : : "xmm0");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SSSE3__)
|
||||||
|
fail = InstructionFail::SSSE3;
|
||||||
|
__asm__ volatile ("pabsw %%xmm0, %%xmm0" : : : "xmm0");
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SSE4_1__)
|
||||||
|
fail = InstructionFail::SSE4_1;
|
||||||
|
__asm__ volatile ("pmaxud %%xmm0, %%xmm0" : : : "xmm0");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SSE4_2__)
|
||||||
|
fail = InstructionFail::SSE4_2;
|
||||||
|
__asm__ volatile ("pcmpgtq %%xmm0, %%xmm0" : : : "xmm0");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// Defined by -msse4.2
|
||||||
|
#if defined(__POPCNT__)
|
||||||
|
fail = InstructionFail::POPCNT;
|
||||||
|
{
|
||||||
|
uint64_t a = 0;
|
||||||
|
uint64_t b = 0;
|
||||||
|
__asm__ volatile ("popcnt %1, %0" : "=r"(a) :"r"(b) :);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__AVX__)
|
||||||
|
fail = InstructionFail::AVX;
|
||||||
|
__asm__ volatile ("vaddpd %%ymm0, %%ymm0, %%ymm0" : : : "ymm0");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__AVX2__)
|
||||||
|
fail = InstructionFail::AVX2;
|
||||||
|
__asm__ volatile ("vpabsw %%ymm0, %%ymm0" : : : "ymm0");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__AVX512__)
|
||||||
|
fail = InstructionFail::AVX512;
|
||||||
|
__asm__ volatile ("vpabsw %%zmm0, %%zmm0" : : : "zmm0");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fail = InstructionFail::NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Macros to avoid using strlen(), since it may fail if SSE is not supported.
|
||||||
|
#define writeError(data) do \
|
||||||
|
{ \
|
||||||
|
static_assert(__builtin_constant_p(data)); \
|
||||||
|
if (!writeRetry(STDERR_FILENO, data, sizeof(data) - 1)) \
|
||||||
|
_Exit(1); \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
/// Check SSE and others instructions availability. Calls exit on fail.
|
||||||
|
/// This function must be called as early as possible, even before main, because static initializers may use unavailable instructions.
|
||||||
|
void checkRequiredInstructions()
|
||||||
|
{
|
||||||
|
struct sigaction sa{};
|
||||||
|
struct sigaction sa_old{};
|
||||||
|
sa.sa_sigaction = sigIllCheckHandler;
|
||||||
|
sa.sa_flags = SA_SIGINFO;
|
||||||
|
auto signal = SIGILL;
|
||||||
|
if (sigemptyset(&sa.sa_mask) != 0
|
||||||
|
|| sigaddset(&sa.sa_mask, signal) != 0
|
||||||
|
|| sigaction(signal, &sa, &sa_old) != 0)
|
||||||
|
{
|
||||||
|
/// You may wonder about strlen.
|
||||||
|
/// Typical implementation of strlen is using SSE4.2 or AVX2.
|
||||||
|
/// But this is not the case because it's compiler builtin and is executed at compile time.
|
||||||
|
|
||||||
|
writeError("Can not set signal handler\n");
|
||||||
|
_Exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
volatile InstructionFail fail = InstructionFail::NONE;
|
||||||
|
|
||||||
|
if (sigsetjmp(jmpbuf, 1))
|
||||||
|
{
|
||||||
|
writeError("Instruction check fail. The CPU does not support ");
|
||||||
|
if (!std::apply(writeRetry, instructionFailToString(fail)))
|
||||||
|
_Exit(1);
|
||||||
|
writeError(" instruction set.\n");
|
||||||
|
_Exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
checkRequiredInstructionsImpl(fail);
|
||||||
|
|
||||||
|
if (sigaction(signal, &sa_old, nullptr))
|
||||||
|
{
|
||||||
|
writeError("Can not set signal handler\n");
|
||||||
|
_Exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Checker
|
||||||
|
{
|
||||||
|
Checker()
|
||||||
|
{
|
||||||
|
checkRequiredInstructions();
|
||||||
|
}
|
||||||
|
} checker
|
||||||
|
#ifndef OS_DARWIN
|
||||||
|
__attribute__((init_priority(101))) /// Run before other static initializers.
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(USE_MUSL)
|
||||||
|
/// NOTE: We will migrate to full static linking or our own dynamic loader to make this code obsolete.
|
||||||
|
void checkHarmfulEnvironmentVariables(char ** argv)
|
||||||
|
{
|
||||||
|
std::initializer_list<const char *> harmful_env_variables = {
|
||||||
|
/// The list is a selection from "man ld-linux".
|
||||||
|
"LD_PRELOAD",
|
||||||
|
"LD_LIBRARY_PATH",
|
||||||
|
"LD_ORIGIN_PATH",
|
||||||
|
"LD_AUDIT",
|
||||||
|
"LD_DYNAMIC_WEAK",
|
||||||
|
/// The list is a selection from "man dyld" (osx).
|
||||||
|
"DYLD_LIBRARY_PATH",
|
||||||
|
"DYLD_FALLBACK_LIBRARY_PATH",
|
||||||
|
"DYLD_VERSIONED_LIBRARY_PATH",
|
||||||
|
"DYLD_INSERT_LIBRARIES",
|
||||||
|
};
|
||||||
|
|
||||||
|
bool require_reexec = false;
|
||||||
|
for (const auto * var : harmful_env_variables)
|
||||||
|
{
|
||||||
|
if (const char * value = getenv(var); value && value[0]) // NOLINT(concurrency-mt-unsafe)
|
||||||
|
{
|
||||||
|
/// NOTE: setenv() is used over unsetenv() since unsetenv() marked as harmful
|
||||||
|
if (setenv(var, "", true)) // NOLINT(concurrency-mt-unsafe) // this is safe if not called concurrently
|
||||||
|
{
|
||||||
|
fmt::print(stderr, "Cannot override {} environment variable", var);
|
||||||
|
_exit(1);
|
||||||
|
}
|
||||||
|
require_reexec = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (require_reexec)
|
||||||
|
{
|
||||||
|
/// Use execvp() over execv() to search in PATH.
|
||||||
|
///
|
||||||
|
/// This should be safe, since:
|
||||||
|
/// - if argv[0] is relative path - it is OK
|
||||||
|
/// - if argv[0] has only basename, the it will search in PATH, like shell will do.
|
||||||
|
///
|
||||||
|
/// Also note, that this (search in PATH) because there is no easy and
|
||||||
|
/// portable way to get absolute path of argv[0].
|
||||||
|
/// - on linux there is /proc/self/exec and AT_EXECFN
|
||||||
|
/// - but on other OSes there is no such thing (especially on OSX).
|
||||||
|
///
|
||||||
|
/// And since static linking will be done someday anyway,
|
||||||
|
/// let's not pollute the code base with special cases.
|
||||||
|
int error = execvp(argv[0], argv);
|
||||||
|
_exit(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(SANITIZE_COVERAGE)
|
||||||
|
__attribute__((no_sanitize("coverage")))
|
||||||
|
void dumpCoverage()
|
||||||
|
{
|
||||||
|
/// A user can request to dump the coverage information into files at exit.
|
||||||
|
/// This is useful for non-server applications such as clickhouse-format or clickhouse-client,
|
||||||
|
/// that cannot introspect it with SQL functions at runtime.
|
||||||
|
|
||||||
|
/// The CLICKHOUSE_WRITE_COVERAGE environment variable defines a prefix for a filename 'prefix.pid'
|
||||||
|
/// containing the list of addresses of covered .
|
||||||
|
|
||||||
|
/// The format is even simpler than Clang's "sancov": an array of 64-bit addresses, native byte order, no header.
|
||||||
|
|
||||||
|
if (const char * coverage_filename_prefix = getenv("CLICKHOUSE_WRITE_COVERAGE")) // NOLINT(concurrency-mt-unsafe)
|
||||||
|
{
|
||||||
|
auto dump = [](const std::string & name, auto span)
|
||||||
|
{
|
||||||
|
/// Write only non-zeros.
|
||||||
|
std::vector<uintptr_t> data;
|
||||||
|
data.reserve(span.size());
|
||||||
|
for (auto addr : span)
|
||||||
|
if (addr)
|
||||||
|
data.push_back(addr);
|
||||||
|
|
||||||
|
int fd = ::open(name.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0400);
|
||||||
|
if (-1 == fd)
|
||||||
|
{
|
||||||
|
writeError("Cannot open a file to write the coverage data\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!writeRetry(fd, reinterpret_cast<const char *>(data.data()), data.size() * sizeof(data[0])))
|
||||||
|
writeError("Cannot write the coverage data to a file\n");
|
||||||
|
if (0 != ::close(fd))
|
||||||
|
writeError("Cannot close the file with coverage data\n");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
dump(fmt::format("{}.{}", coverage_filename_prefix, getpid()), getCumulativeCoverage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isClickhouseApp(std::string_view app_suffix, std::vector<char *> & argv)
|
||||||
|
{
|
||||||
|
/// Use app if the first arg 'app' is passed (the arg should be quietly removed)
|
||||||
|
if (argv.size() >= 2)
|
||||||
|
{
|
||||||
|
auto first_arg = argv.begin() + 1;
|
||||||
|
|
||||||
|
/// 'clickhouse --client ...' and 'clickhouse client ...' are Ok
|
||||||
|
if (*first_arg == app_suffix
|
||||||
|
|| (std::string_view(*first_arg).starts_with("--") && std::string_view(*first_arg).substr(2) == app_suffix))
|
||||||
|
{
|
||||||
|
argv.erase(first_arg);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Don't allow dlopen in the main ClickHouse binary, because it is harmful and insecure.
|
||||||
|
/// We don't use it. But it can be used by some libraries for implementation of "plugins".
|
||||||
|
/// We absolutely discourage the ancient technique of loading
|
||||||
|
/// 3rd-party uncontrolled dangerous libraries into the process address space,
|
||||||
|
/// because it is insane.
|
||||||
|
|
||||||
|
#if !defined(USE_MUSL)
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
void * dlopen(const char *, int)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void * dlmopen(long, const char *, int) // NOLINT
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dlclose(void *)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * dlerror()
|
||||||
|
{
|
||||||
|
return "ClickHouse does not allow dynamic library loading";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// Prevent messages from JeMalloc in the release build.
|
||||||
|
/// Some of these messages are non-actionable for the users, such as:
|
||||||
|
/// <jemalloc>: Number of CPUs detected is not deterministic. Per-CPU arena disabled.
|
||||||
|
#if USE_JEMALLOC && defined(NDEBUG) && !defined(SANITIZER)
|
||||||
|
extern "C" void (*malloc_message)(void *, const char *s);
|
||||||
|
__attribute__((constructor(0))) void init_je_malloc_message() { malloc_message = [](void *, const char *){}; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// This allows to implement assert to forbid initialization of a class in static constructors.
|
||||||
|
/// Usage:
|
||||||
|
///
|
||||||
|
/// extern bool inside_main;
|
||||||
|
/// class C { C() { assert(inside_main); } };
|
||||||
|
bool inside_main = false;
|
||||||
|
|
||||||
|
int main(int argc_, char ** argv_)
|
||||||
|
{
|
||||||
|
inside_main = true;
|
||||||
|
SCOPE_EXIT({ inside_main = false; });
|
||||||
|
|
||||||
|
/// PHDR cache is required for query profiler to work reliably
|
||||||
|
/// It also speed up exception handling, but exceptions from dynamically loaded libraries (dlopen)
|
||||||
|
/// will work only after additional call of this function.
|
||||||
|
/// Note: we forbid dlopen in our code.
|
||||||
|
updatePHDRCache();
|
||||||
|
|
||||||
|
#if !defined(USE_MUSL)
|
||||||
|
checkHarmfulEnvironmentVariables(argv_);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// This is used for testing. For example,
|
||||||
|
/// clickhouse-local should be able to run a simple query without throw/catch.
|
||||||
|
if (getenv("CLICKHOUSE_TERMINATE_ON_ANY_EXCEPTION")) // NOLINT(concurrency-mt-unsafe)
|
||||||
|
DB::terminate_on_any_exception = true;
|
||||||
|
|
||||||
|
/// Reset new handler to default (that throws std::bad_alloc)
|
||||||
|
/// It is needed because LLVM library clobbers it.
|
||||||
|
std::set_new_handler(nullptr);
|
||||||
|
|
||||||
|
std::vector<char *> argv(argv_, argv_ + argc_);
|
||||||
|
|
||||||
|
/// Print a basic help if nothing was matched
|
||||||
|
MainFunc main_func = mainEntryClickHouseKeeper;
|
||||||
|
|
||||||
|
if (isClickhouseApp("help", argv))
|
||||||
|
{
|
||||||
|
main_func = printHelp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (auto & application : clickhouse_applications)
|
||||||
|
{
|
||||||
|
if (isClickhouseApp(application.first, argv))
|
||||||
|
{
|
||||||
|
main_func = application.second;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int exit_code = main_func(static_cast<int>(argv.size()), argv.data());
|
||||||
|
|
||||||
|
#if defined(SANITIZE_COVERAGE)
|
||||||
|
dumpCoverage();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return exit_code;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user