mirror of
https://github.com/samba-team/samba.git
synced 2025-03-09 08:58:35 +03:00
s3: Add connections_forall_read()
In a cluster, this makes a large difference: For r/w traverse, we have to do a fetch_locked on every record which for most users of connections_forall is just overkill.
This commit is contained in:
parent
3deba6349c
commit
8bebb380e8
@ -431,6 +431,10 @@ int connections_forall(int (*fn)(struct db_record *rec,
|
|||||||
const struct connections_data *data,
|
const struct connections_data *data,
|
||||||
void *private_data),
|
void *private_data),
|
||||||
void *private_data);
|
void *private_data);
|
||||||
|
int connections_forall_read(int (*fn)(const struct connections_key *key,
|
||||||
|
const struct connections_data *data,
|
||||||
|
void *private_data),
|
||||||
|
void *private_data);
|
||||||
bool connections_init(bool rw);
|
bool connections_init(bool rw);
|
||||||
|
|
||||||
/* The following definitions come from lib/dbwrap_util.c */
|
/* The following definitions come from lib/dbwrap_util.c */
|
||||||
|
@ -121,6 +121,48 @@ int connections_forall(int (*fn)(struct db_record *rec,
|
|||||||
return ctx->traverse(ctx, conn_traverse_fn, (void *)&state);
|
return ctx->traverse(ctx, conn_traverse_fn, (void *)&state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct conn_traverse_read_state {
|
||||||
|
int (*fn)(const struct connections_key *key,
|
||||||
|
const struct connections_data *data,
|
||||||
|
void *private_data);
|
||||||
|
void *private_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int connections_forall_read_fn(struct db_record *rec,
|
||||||
|
void *private_data)
|
||||||
|
{
|
||||||
|
struct conn_traverse_read_state *state =
|
||||||
|
(struct conn_traverse_read_state *)private_data;
|
||||||
|
|
||||||
|
if ((rec->key.dsize != sizeof(struct connections_key))
|
||||||
|
|| (rec->value.dsize != sizeof(struct connections_data))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return state->fn((const struct connections_key *)rec->key.dptr,
|
||||||
|
(const struct connections_data *)rec->value.dptr,
|
||||||
|
state->private_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int connections_forall_read(int (*fn)(const struct connections_key *key,
|
||||||
|
const struct connections_data *data,
|
||||||
|
void *private_data),
|
||||||
|
void *private_data)
|
||||||
|
{
|
||||||
|
struct db_context *ctx;
|
||||||
|
struct conn_traverse_read_state state;
|
||||||
|
|
||||||
|
ctx = connections_db_ctx(false);
|
||||||
|
if (ctx == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.fn = fn;
|
||||||
|
state.private_data = private_data;
|
||||||
|
|
||||||
|
return ctx->traverse_read(ctx, connections_forall_read_fn,
|
||||||
|
(void *)&state);
|
||||||
|
}
|
||||||
|
|
||||||
bool connections_init(bool rw)
|
bool connections_init(bool rw)
|
||||||
{
|
{
|
||||||
return (connections_db_ctx(rw) != NULL);
|
return (connections_db_ctx(rw) != NULL);
|
||||||
|
@ -1356,8 +1356,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
|
|||||||
a new session setup with VC==0 is ignored.
|
a new session setup with VC==0 is ignored.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int shutdown_other_smbds(struct db_record *rec,
|
static int shutdown_other_smbds(const struct connections_key *key,
|
||||||
const struct connections_key *key,
|
|
||||||
const struct connections_data *crec,
|
const struct connections_data *crec,
|
||||||
void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
@ -1394,7 +1393,7 @@ static void setup_new_vc_session(void)
|
|||||||
invalidate_all_vuids();
|
invalidate_all_vuids();
|
||||||
#endif
|
#endif
|
||||||
if (lp_reset_on_zero_vc()) {
|
if (lp_reset_on_zero_vc()) {
|
||||||
connections_forall(shutdown_other_smbds,
|
connections_forall_read(shutdown_other_smbds,
|
||||||
CONST_DISCARD(void *,
|
CONST_DISCARD(void *,
|
||||||
client_addr(get_client_fd(),addr,sizeof(addr))));
|
client_addr(get_client_fd(),addr,sizeof(addr))));
|
||||||
}
|
}
|
||||||
|
@ -151,8 +151,7 @@ static int collect_pid(struct db_record *rec, void *private_data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int show_share_parseable(struct db_record *rec,
|
static int show_share_parseable(const struct connections_key *key,
|
||||||
const struct connections_key *key,
|
|
||||||
const struct connections_data *crec,
|
const struct connections_data *crec,
|
||||||
void *state)
|
void *state)
|
||||||
{
|
{
|
||||||
@ -205,7 +204,7 @@ static int net_status_shares_parseable(struct net_context *c, int argc, const ch
|
|||||||
db->traverse_read(db, collect_pid, &ids);
|
db->traverse_read(db, collect_pid, &ids);
|
||||||
TALLOC_FREE(db);
|
TALLOC_FREE(db);
|
||||||
|
|
||||||
connections_forall(show_share_parseable, &ids);
|
connections_forall_read(show_share_parseable, &ids);
|
||||||
|
|
||||||
SAFE_FREE(ids.entries);
|
SAFE_FREE(ids.entries);
|
||||||
|
|
||||||
|
@ -259,8 +259,7 @@ cleanup:
|
|||||||
ptrace(PTRACE_DETACH, pid, NULL, NULL);
|
ptrace(PTRACE_DETACH, pid, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stack_trace_connection(struct db_record *rec,
|
static int stack_trace_connection(const struct connections_key *key,
|
||||||
const struct connections_key *key,
|
|
||||||
const struct connections_data *crec,
|
const struct connections_data *crec,
|
||||||
void *priv)
|
void *priv)
|
||||||
{
|
{
|
||||||
@ -291,7 +290,7 @@ static bool do_daemon_stack_trace(struct messaging_context *msg_ctx,
|
|||||||
*/
|
*/
|
||||||
print_stack_trace(dest, &count);
|
print_stack_trace(dest, &count);
|
||||||
} else {
|
} else {
|
||||||
connections_forall(stack_trace_connection, &count);
|
connections_forall_read(stack_trace_connection, &count);
|
||||||
}
|
}
|
||||||
|
|
||||||
return True;
|
return True;
|
||||||
|
@ -232,8 +232,7 @@ static void print_brl(struct file_id id,
|
|||||||
TALLOC_FREE(share_mode);
|
TALLOC_FREE(share_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int traverse_fn1(struct db_record *rec,
|
static int traverse_fn1(const struct connections_key *key,
|
||||||
const struct connections_key *key,
|
|
||||||
const struct connections_data *crec,
|
const struct connections_data *crec,
|
||||||
void *state)
|
void *state)
|
||||||
{
|
{
|
||||||
@ -447,7 +446,7 @@ static int traverse_sessionid(struct db_record *db, void *state)
|
|||||||
d_printf("\nService pid machine Connected at\n");
|
d_printf("\nService pid machine Connected at\n");
|
||||||
d_printf("-------------------------------------------------------\n");
|
d_printf("-------------------------------------------------------\n");
|
||||||
|
|
||||||
connections_forall(traverse_fn1, NULL);
|
connections_forall_read(traverse_fn1, NULL);
|
||||||
|
|
||||||
d_printf("\n");
|
d_printf("\n");
|
||||||
|
|
||||||
|
@ -182,8 +182,7 @@ static void print_share_mode(const struct share_mode_entry *e,
|
|||||||
|
|
||||||
|
|
||||||
/* kill off any connections chosen by the user */
|
/* kill off any connections chosen by the user */
|
||||||
static int traverse_fn1(struct db_record *rec,
|
static int traverse_fn1(const struct connections_key *key,
|
||||||
const struct connections_key *key,
|
|
||||||
const struct connections_data *crec,
|
const struct connections_data *crec,
|
||||||
void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
@ -199,8 +198,7 @@ static int traverse_fn1(struct db_record *rec,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* traversal fn for showing machine connections */
|
/* traversal fn for showing machine connections */
|
||||||
static int traverse_fn2(struct db_record *rec,
|
static int traverse_fn2(const struct connections_key *key,
|
||||||
const struct connections_key *key,
|
|
||||||
const struct connections_data *crec,
|
const struct connections_data *crec,
|
||||||
void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
@ -224,8 +222,7 @@ static int traverse_fn2(struct db_record *rec,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* traversal fn for showing share connections */
|
/* traversal fn for showing share connections */
|
||||||
static int traverse_fn3(struct db_record *rec,
|
static int traverse_fn3(const struct connections_key *key,
|
||||||
const struct connections_key *key,
|
|
||||||
const struct connections_data *crec,
|
const struct connections_data *crec,
|
||||||
void *private_data)
|
void *private_data)
|
||||||
{
|
{
|
||||||
@ -325,7 +322,7 @@ void status_page(void)
|
|||||||
PID_or_Machine = 0;
|
PID_or_Machine = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
connections_forall(traverse_fn1, NULL);
|
connections_forall_read(traverse_fn1, NULL);
|
||||||
|
|
||||||
initPid2Machine ();
|
initPid2Machine ();
|
||||||
|
|
||||||
@ -415,7 +412,7 @@ void status_page(void)
|
|||||||
}
|
}
|
||||||
printf("</tr>\n");
|
printf("</tr>\n");
|
||||||
|
|
||||||
connections_forall(traverse_fn2, NULL);
|
connections_forall_read(traverse_fn2, NULL);
|
||||||
|
|
||||||
printf("</table><p>\n");
|
printf("</table><p>\n");
|
||||||
|
|
||||||
@ -424,7 +421,7 @@ void status_page(void)
|
|||||||
printf("<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n\n",
|
printf("<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n\n",
|
||||||
_("Share"), _("User"), _("Group"), _("PID"), _("Client"), _("Date"));
|
_("Share"), _("User"), _("Group"), _("PID"), _("Client"), _("Date"));
|
||||||
|
|
||||||
connections_forall(traverse_fn3, NULL);
|
connections_forall_read(traverse_fn3, NULL);
|
||||||
|
|
||||||
printf("</table><p>\n");
|
printf("</table><p>\n");
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user