-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDEV-26851 : Add interface to monitor connections in Galera
- Loading branch information
1 parent
31db847
commit 9f5c99e
Showing
8 changed files
with
305 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
/* | ||
* Copyright (C) 2024-2026 Codership Oy <info@codership.com> | ||
* | ||
* This file is part of wsrep-lib. | ||
* | ||
* Wsrep-lib is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation, either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* Wsrep-lib is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with wsrep-lib. If not, see <https://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
|
||
/** @file connection_monitor_service.hpp | ||
* | ||
* Service interface for interacting with DBMS provided | ||
* connection monitor callback. | ||
*/ | ||
|
||
#ifndef WSREP_CONNECTION_MONITOR_SERVICE_HPP | ||
#define WSREP_CONNECTION_MONITOR_SERVICE_HPP | ||
|
||
#include "compiler.hpp" | ||
#include "wsrep/buffer.hpp" | ||
#include "v26/wsrep_connection_monitor_service.h" | ||
|
||
namespace wsrep | ||
{ | ||
class connection_monitor_service | ||
{ | ||
public: | ||
|
||
virtual ~connection_monitor_service() { } | ||
|
||
/** | ||
* Connection monitor connect callback. | ||
*/ | ||
virtual bool connection_monitor_connect_cb( | ||
wsrep_connection_key_t id, | ||
const wsrep::const_buffer& scheme, | ||
const wsrep::const_buffer& local_addr, | ||
const wsrep::const_buffer& remote_addr | ||
) WSREP_NOEXCEPT = 0; | ||
/** | ||
* Connection monitor disconnect callback. | ||
*/ | ||
virtual bool connection_monitor_disconnect_cb(wsrep_connection_key_t id | ||
) WSREP_NOEXCEPT=0; | ||
|
||
/** | ||
* Connection monitor SSL/TLS info callback. | ||
*/ | ||
virtual bool connection_monitor_ssl_info_cb(wsrep_connection_key_t id, | ||
const wsrep::const_buffer& ciper, | ||
const wsrep::const_buffer& subject, | ||
const wsrep::const_buffer& issuer, | ||
const wsrep::const_buffer& version | ||
) WSREP_NOEXCEPT = 0; | ||
}; | ||
} | ||
|
||
#endif // WSREP_CONNECTION_MONITOR_SERVICE_HPP |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
/* | ||
* Copyright (C) 2024-2025 Codership Oy <info@codership.com> | ||
* | ||
* This file is part of wsrep-lib. | ||
* | ||
* Wsrep-lib is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation, either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* Wsrep-lib is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with wsrep-lib. If not, see <https://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#include "connection_monitor_service_v1.hpp" | ||
#include "service_helpers.hpp" | ||
|
||
#include "wsrep/buffer.hpp" | ||
#include "v26/wsrep_connection_monitor_service.h" | ||
#include "wsrep/connection_monitor_service.hpp" | ||
|
||
#include <cassert> | ||
#include <dlfcn.h> | ||
#include <cerrno> | ||
|
||
namespace wsrep_connection_monitor_service_v1 | ||
{ | ||
// Pointer to connection monitor service implementation provided by | ||
// the application. | ||
static wsrep::connection_monitor_service* connection_monitor_service_impl{ 0 }; | ||
static std::atomic<size_t> use_count; | ||
|
||
// | ||
// connection monitor service callbacks | ||
// | ||
|
||
void connection_monitor_connect_cb( | ||
wsrep_connection_monitor_context_t*, | ||
wsrep_connection_key_t id, | ||
const wsrep_buf_t* scheme, | ||
const wsrep_buf_t* local_address, | ||
const wsrep_buf_t* remote_address | ||
) | ||
{ | ||
assert(connection_monitor_service_impl); | ||
wsrep::const_buffer scheme_value(scheme->ptr, scheme->len); | ||
wsrep::const_buffer remote_addr(remote_address->ptr, remote_address->len); | ||
wsrep::const_buffer local_addr(local_address->ptr, local_address->len); | ||
connection_monitor_service_impl->connection_monitor_connect_cb( | ||
id, | ||
scheme_value, | ||
local_addr, | ||
remote_addr); | ||
} | ||
|
||
void connection_monitor_disconnect_cb( | ||
wsrep_connection_monitor_context_t*, | ||
wsrep_connection_key_t id | ||
) | ||
{ | ||
assert(connection_monitor_service_impl); | ||
connection_monitor_service_impl->connection_monitor_disconnect_cb(id); | ||
} | ||
|
||
void connection_monitor_ssl_info_cb( | ||
wsrep_connection_monitor_context_t*, | ||
wsrep_connection_key_t id, | ||
const wsrep_buf_t* cipher, | ||
const wsrep_buf_t* certificate_subject, | ||
const wsrep_buf_t* certificate_issuer, | ||
const wsrep_buf_t* version) | ||
{ | ||
assert(connection_monitor_service_impl); | ||
wsrep::const_buffer ssl_cipher(cipher->ptr, cipher->len); | ||
wsrep::const_buffer cert_sub(certificate_subject->ptr, certificate_subject->len); | ||
wsrep::const_buffer cert_iss(certificate_issuer->ptr, certificate_issuer->len); | ||
wsrep::const_buffer vers(version->ptr, version->len); | ||
connection_monitor_service_impl->connection_monitor_ssl_info_cb( | ||
id, ssl_cipher, cert_sub, cert_iss, vers); | ||
} | ||
|
||
static wsrep_connection_monitor_service_v1_t connection_monitor_service_callbacks | ||
= { connection_monitor_connect_cb, | ||
connection_monitor_disconnect_cb, | ||
connection_monitor_ssl_info_cb, | ||
0 }; | ||
} | ||
|
||
int wsrep::connection_monitor_service_v1_probe(void* dlh) | ||
{ | ||
typedef int (*init_fn)(wsrep_connection_monitor_service_v1_t*); | ||
typedef void (*deinit_fn)(); | ||
if (wsrep_impl::service_probe<init_fn>( | ||
dlh, WSREP_CONNECTION_MONITOR_SERVICE_INIT_FUNC_V1, "connection monitor service v1") || | ||
wsrep_impl::service_probe<deinit_fn>( | ||
dlh, WSREP_CONNECTION_MONITOR_SERVICE_DEINIT_FUNC_V1, "connection monitor service v1")) | ||
{ | ||
wsrep::log_warning() << "Provider does not support connection monitor service v1"; | ||
return 1; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
int wsrep::connection_monitor_service_v1_init(void* dlh, | ||
wsrep::connection_monitor_service* connection_service) | ||
{ | ||
if (not (dlh && connection_service)) return EINVAL; | ||
typedef int (*init_fn)(wsrep_connection_monitor_service_v1_t*); | ||
wsrep_connection_monitor_service_v1::connection_monitor_service_impl = connection_service; | ||
int ret(0); | ||
if ((ret = wsrep_impl::service_init<init_fn>( | ||
dlh, WSREP_CONNECTION_MONITOR_SERVICE_INIT_FUNC_V1, | ||
&wsrep_connection_monitor_service_v1::connection_monitor_service_callbacks, | ||
"connection monitor service v1"))) | ||
{ | ||
wsrep_connection_monitor_service_v1::connection_monitor_service_impl = 0; | ||
} | ||
else | ||
{ | ||
++wsrep_connection_monitor_service_v1::use_count; | ||
} | ||
return ret; | ||
} | ||
|
||
void wsrep::connection_monitor_service_v1_deinit(void* dlh) | ||
{ | ||
typedef int (*deinit_fn)(); | ||
wsrep_impl::service_deinit<deinit_fn>( | ||
dlh, WSREP_CONNECTION_MONITOR_SERVICE_DEINIT_FUNC_V1, "connection monitor service v1"); | ||
assert(wsrep_connection_monitor_service_v1::use_count > 0); | ||
--wsrep_connection_monitor_service_v1::use_count; | ||
if (wsrep_connection_monitor_service_v1::use_count == 0) | ||
{ | ||
wsrep_connection_monitor_service_v1::connection_monitor_service_impl = 0; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/* | ||
* Copyright (C) 2024-2025 Codership Oy <info@codership.com> | ||
* | ||
* This file is part of wsrep-lib. | ||
* | ||
* Wsrep-lib is free software: you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation, either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* Wsrep-lib is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with wsrep-lib. If not, see <https://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#ifndef WSREP_CONNECTION_MONITOR_SERVICE_V1_HPP | ||
#define WSREP_CONNECTION_MONITOR_SERVICE_V1_HPP | ||
|
||
namespace wsrep | ||
{ | ||
class connection_monitor_service; | ||
/** | ||
* Probe connection_monitor_service_v1 support in loaded library. | ||
* | ||
* @param dlh Handle returned by dlopen(). | ||
* | ||
* @return Zero on success, non-zero system error code on failure. | ||
*/ | ||
int connection_monitor_service_v1_probe(void *dlh); | ||
|
||
/** | ||
* Initialize the connection_monitor service. | ||
* | ||
* @param dlh Handle returned by dlopen(). | ||
* @param connection_monitor_service Pointer to | ||
* wsrep::connection_monitor_service implementation. | ||
* | ||
* @return Zero on success, non-zero system error code on failure. | ||
*/ | ||
int connection_monitor_service_v1_init(void* dlh, | ||
wsrep::connection_monitor_service* connection_monitor_service); | ||
|
||
/** | ||
* Deinitialize the connection monitor service. | ||
* | ||
* @params dlh Handler returned by dlopen(). | ||
*/ | ||
void connection_monitor_service_v1_deinit(void* dlh); | ||
|
||
} | ||
|
||
#endif // WSREP_CONNECTION_MONITOR_SERVICE_V1_HPP |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Submodule v26
updated
3 files
+1 −0 | CONTRIBUTORS.txt | |
+64 −2 | wsrep_api.h | |
+134 −0 | wsrep_connection_monitor_service.h |