mirror of
https://github.com/samba-team/samba.git
synced 2025-02-02 09:47:23 +03:00
s3: Add "smbcontrol winbindd ip-dropped <local-ip>"
This is supposed to improve the winbind reconnect time after an ip address has been moved away from a box. Any kind of HA scenario will benefit from this, because winbindd does not have to wait for the TCP timeout to kick in when a local IP address has been dropped and DC replies are not received anymore.
This commit is contained in:
parent
10f0c785c7
commit
bad98e37e7
@ -83,6 +83,7 @@ interface messaging
|
|||||||
MSG_WINBIND_FAILED_TO_GO_ONLINE = 0x0407,
|
MSG_WINBIND_FAILED_TO_GO_ONLINE = 0x0407,
|
||||||
MSG_WINBIND_VALIDATE_CACHE = 0x0408,
|
MSG_WINBIND_VALIDATE_CACHE = 0x0408,
|
||||||
MSG_WINBIND_DUMP_DOMAIN_LIST = 0x0409,
|
MSG_WINBIND_DUMP_DOMAIN_LIST = 0x0409,
|
||||||
|
MSG_WINBIND_IP_DROPPED = 0x040A,
|
||||||
|
|
||||||
/* event messages */
|
/* event messages */
|
||||||
MSG_DUMP_EVENT_LIST = 0x0500,
|
MSG_DUMP_EVENT_LIST = 0x0500,
|
||||||
|
@ -726,6 +726,22 @@ static bool do_closeshare(struct messaging_context *msg_ctx,
|
|||||||
strlen(argv[1]) + 1);
|
strlen(argv[1]) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Tell winbindd an IP got dropped */
|
||||||
|
|
||||||
|
static bool do_ip_dropped(struct messaging_context *msg_ctx,
|
||||||
|
const struct server_id pid,
|
||||||
|
const int argc, const char **argv)
|
||||||
|
{
|
||||||
|
if (argc != 2) {
|
||||||
|
fprintf(stderr, "Usage: smbcontrol <dest> ip-dropped "
|
||||||
|
"<ip-address>\n");
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
return send_message(msg_ctx, pid, MSG_WINBIND_IP_DROPPED, argv[1],
|
||||||
|
strlen(argv[1]) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* force a blocking lock retry */
|
/* force a blocking lock retry */
|
||||||
|
|
||||||
static bool do_lockretry(struct messaging_context *msg_ctx,
|
static bool do_lockretry(struct messaging_context *msg_ctx,
|
||||||
@ -1196,6 +1212,7 @@ static const struct {
|
|||||||
{ "debuglevel", do_debuglevel, "Display current debuglevels" },
|
{ "debuglevel", do_debuglevel, "Display current debuglevels" },
|
||||||
{ "printnotify", do_printnotify, "Send a print notify message" },
|
{ "printnotify", do_printnotify, "Send a print notify message" },
|
||||||
{ "close-share", do_closeshare, "Forcibly disconnect a share" },
|
{ "close-share", do_closeshare, "Forcibly disconnect a share" },
|
||||||
|
{ "ip-dropped", do_ip_dropped, "Tell winbind that an IP got dropped" },
|
||||||
{ "lockretry", do_lockretry, "Force a blocking lock retry" },
|
{ "lockretry", do_lockretry, "Force a blocking lock retry" },
|
||||||
{ "brl-revalidate", do_brl_revalidate, "Revalidate all brl entries" },
|
{ "brl-revalidate", do_brl_revalidate, "Revalidate all brl entries" },
|
||||||
{ "samsync", do_samsync, "Initiate SAM synchronisation" },
|
{ "samsync", do_samsync, "Initiate SAM synchronisation" },
|
||||||
|
@ -1062,6 +1062,10 @@ void winbindd_register_handlers(void)
|
|||||||
MSG_WINBIND_DUMP_DOMAIN_LIST,
|
MSG_WINBIND_DUMP_DOMAIN_LIST,
|
||||||
winbind_msg_dump_domain_list);
|
winbind_msg_dump_domain_list);
|
||||||
|
|
||||||
|
messaging_register(winbind_messaging_context(), NULL,
|
||||||
|
MSG_WINBIND_IP_DROPPED,
|
||||||
|
winbind_msg_ip_dropped_parent);
|
||||||
|
|
||||||
/* Register handler for MSG_DEBUG. */
|
/* Register handler for MSG_DEBUG. */
|
||||||
messaging_register(winbind_messaging_context(), NULL,
|
messaging_register(winbind_messaging_context(), NULL,
|
||||||
MSG_DEBUG,
|
MSG_DEBUG,
|
||||||
|
@ -2567,3 +2567,36 @@ NTSTATUS cm_connect_netlogon(struct winbindd_domain *domain,
|
|||||||
*cli = conn->netlogon_pipe;
|
*cli = conn->netlogon_pipe;
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void winbind_msg_ip_dropped(struct messaging_context *msg_ctx,
|
||||||
|
void *private_data,
|
||||||
|
uint32_t msg_type,
|
||||||
|
struct server_id server_id,
|
||||||
|
DATA_BLOB *data)
|
||||||
|
{
|
||||||
|
struct winbindd_domain *domain;
|
||||||
|
|
||||||
|
if ((data == NULL)
|
||||||
|
|| (data->data == NULL)
|
||||||
|
|| (data->length == 0)
|
||||||
|
|| (data->data[data->length-1] != '\0')
|
||||||
|
|| !is_ipaddress((char *)data->data)) {
|
||||||
|
DEBUG(1, ("invalid msg_ip_dropped message\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (domain = domain_list(); domain != NULL; domain = domain->next) {
|
||||||
|
char sockaddr[INET6_ADDRSTRLEN];
|
||||||
|
if (domain->conn.cli == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (domain->conn.cli->fd == -1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
client_socket_addr(domain->conn.cli->fd, sockaddr,
|
||||||
|
sizeof(sockaddr));
|
||||||
|
if (strequal(sockaddr, (char *)data->data)) {
|
||||||
|
close(domain->conn.cli->fd);
|
||||||
|
domain->conn.cli->fd = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1295,6 +1295,10 @@ static bool fork_domain_child(struct winbindd_child *child)
|
|||||||
MSG_DUMP_EVENT_LIST, child_msg_dump_event_list);
|
MSG_DUMP_EVENT_LIST, child_msg_dump_event_list);
|
||||||
messaging_register(winbind_messaging_context(), NULL,
|
messaging_register(winbind_messaging_context(), NULL,
|
||||||
MSG_DEBUG, debug_message);
|
MSG_DEBUG, debug_message);
|
||||||
|
messaging_register(winbind_messaging_context(), NULL,
|
||||||
|
MSG_WINBIND_IP_DROPPED,
|
||||||
|
winbind_msg_ip_dropped);
|
||||||
|
|
||||||
|
|
||||||
primary_domain = find_our_domain();
|
primary_domain = find_our_domain();
|
||||||
|
|
||||||
@ -1486,3 +1490,21 @@ static bool fork_domain_child(struct winbindd_child *child)
|
|||||||
TALLOC_FREE(frame);
|
TALLOC_FREE(frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void winbind_msg_ip_dropped_parent(struct messaging_context *msg_ctx,
|
||||||
|
void *private_data,
|
||||||
|
uint32_t msg_type,
|
||||||
|
struct server_id server_id,
|
||||||
|
DATA_BLOB *data)
|
||||||
|
{
|
||||||
|
struct winbindd_child *child;
|
||||||
|
|
||||||
|
winbind_msg_ip_dropped(msg_ctx, private_data, msg_type,
|
||||||
|
server_id, data);
|
||||||
|
|
||||||
|
|
||||||
|
for (child = winbindd_children; child != NULL; child = child->next) {
|
||||||
|
messaging_send_buf(msg_ctx, pid_to_procid(child->pid),
|
||||||
|
msg_type, data->data, data->length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -296,6 +296,16 @@ void winbind_msg_dump_domain_list(struct messaging_context *msg_ctx,
|
|||||||
uint32_t msg_type,
|
uint32_t msg_type,
|
||||||
struct server_id server_id,
|
struct server_id server_id,
|
||||||
DATA_BLOB *data);
|
DATA_BLOB *data);
|
||||||
|
void winbind_msg_ip_dropped(struct messaging_context *msg_ctx,
|
||||||
|
void *private_data,
|
||||||
|
uint32_t msg_type,
|
||||||
|
struct server_id server_id,
|
||||||
|
DATA_BLOB *data);
|
||||||
|
void winbind_msg_ip_dropped_parent(struct messaging_context *msg_ctx,
|
||||||
|
void *private_data,
|
||||||
|
uint32_t msg_type,
|
||||||
|
struct server_id server_id,
|
||||||
|
DATA_BLOB *data);
|
||||||
bool winbindd_reinit_after_fork(const char *logfilename);
|
bool winbindd_reinit_after_fork(const char *logfilename);
|
||||||
struct winbindd_domain *wb_child_domain(void);
|
struct winbindd_domain *wb_child_domain(void);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user