diff --git a/cmd/milvus/run.go b/cmd/milvus/run.go index 99b606d27c2d0..33d862e4ee1e5 100644 --- a/cmd/milvus/run.go +++ b/cmd/milvus/run.go @@ -5,6 +5,8 @@ import ( "fmt" "io" "os" + "os/signal" + "syscall" "go.uber.org/zap" @@ -50,6 +52,9 @@ func (c *run) execute(args []string, flags *flag.FlagSet) { c.serverType = args[2] c.formatFlags(args, flags) + // make go ignore SIGPIPE when all cgo threads set mask of SIGPIPE + signal.Ignore(syscall.SIGPIPE) + var local = false role := roles.MilvusRoles{} switch c.serverType { diff --git a/internal/core/src/storage/MinioChunkManager.cpp b/internal/core/src/storage/MinioChunkManager.cpp index d795465bb5686..30b74f1a46c23 100644 --- a/internal/core/src/storage/MinioChunkManager.cpp +++ b/internal/core/src/storage/MinioChunkManager.cpp @@ -51,15 +51,18 @@ std::mutex MinioChunkManager::client_mutex_; static void SwallowHandler(int signal) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-result" switch (signal) { case SIGPIPE: - LOG_SERVER_WARNING_ << "SIGPIPE Swallowed" << std::endl; + // cannot use log or stdio + write(1, "SIGPIPE Swallowed\n", 18); break; default: - LOG_SERVER_ERROR_ - << "Unexpected signal in SIGPIPE handler: " << signal - << std::endl; + // cannot use log or stdio + write(2, "Unexpected signal\n", 18); } +#pragma GCC diagnostic pop } /** @@ -95,6 +98,10 @@ MinioChunkManager::InitSDKAPI(RemoteStorageType type) { psa.sa_handler = SwallowHandler; psa.sa_flags = psa.sa_flags | SA_ONSTACK; sigaction(SIGPIPE, &psa, 0); + // block multiple SIGPIPE concurrently processing + sigemptyset(&psa.sa_mask); + sigaddset(&psa.sa_mask, SIGPIPE); + sigaction(SIGPIPE, &psa, 0); if (type == RemoteStorageType::GOOGLE_CLOUD) { sdk_options_.httpOptions.httpClientFactory_create_fn = []() { // auto credentials = google::cloud::oauth2_internal::GOOGLE_CLOUD_CPP_NS::GoogleDefaultCredentials(); @@ -105,6 +112,8 @@ MinioChunkManager::InitSDKAPI(RemoteStorageType type) { GOOGLE_CLIENT_FACTORY_ALLOCATION_TAG, credentials); }; } + sdk_options_.loggingOptions.logLevel = + Aws::Utils::Logging::LogLevel::Info; Aws::InitAPI(sdk_options_); } }