summaryrefslogtreecommitdiffstats
path: root/source3
diff options
context:
space:
mode:
authorShekhar Amlekar <samlekar@in.ibm.com>2014-01-16 11:10:56 -0800
committerJeremy Allison <jra@samba.org>2014-01-18 01:11:32 +0100
commitdad72a3b7ae310f8049cd76681d9d9d89ce6da52 (patch)
treed0675d1a27de63af7fbb04b85a166989236504f3 /source3
parentde899754ac201c8a63646e1bc684f2a6a6e5c821 (diff)
downloadsamba-dad72a3b7ae310f8049cd76681d9d9d89ce6da52.tar.gz
samba-dad72a3b7ae310f8049cd76681d9d9d89ce6da52.tar.xz
samba-dad72a3b7ae310f8049cd76681d9d9d89ce6da52.zip
s3: rpc_server/srvsvc: Avoiding the loop around locking tdb traversal.
The current code for determining the number of open files iterates over the session list and for each session it traverses the locking tdb to get the open files. This scales badly for a large server with many sessions and open files. Instead, get the list of sessions first, and then determine the number of open files on all sessions in a single traversal of locking tdb. Signed-off-by: Shekhar Amlekar <samlekar@in.ibm.com> Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Andreas Schneider <asn@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Sat Jan 18 01:11:32 CET 2014 on sn-devel-104
Diffstat (limited to 'source3')
-rw-r--r--source3/rpc_server/srvsvc/srv_srvsvc_nt.c55
1 files changed, 6 insertions, 49 deletions
diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
index e901550f611..f6db6fc2611 100644
--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
@@ -54,12 +54,6 @@ struct file_enum_count {
struct srvsvc_NetFileCtr3 *ctr3;
};
-struct sess_file_count {
- struct server_id pid;
- uid_t uid;
- int count;
-};
-
struct sess_file_info {
struct srvsvc_NetSessCtr1 *ctr;
struct sessionid *session_list;
@@ -812,38 +806,6 @@ static WERROR init_srv_sess_info_0(struct pipes_struct *p,
return WERR_OK;
}
-/*******************************************************************
-********************************************************************/
-
-static void sess_file_fn( const struct share_mode_entry *e,
- const char *sharepath, const char *fname,
- void *data )
-{
- struct sess_file_count *sess = (struct sess_file_count *)data;
-
- if (serverid_equal(&e->pid, &sess->pid) && (sess->uid == e->uid)) {
- sess->count++;
- }
-
- return;
-}
-
-/*******************************************************************
-********************************************************************/
-
-static int net_count_files( uid_t uid, struct server_id pid )
-{
- struct sess_file_count s_file_cnt;
-
- s_file_cnt.count = 0;
- s_file_cnt.uid = uid;
- s_file_cnt.pid = pid;
-
- share_mode_forall( sess_file_fn, &s_file_cnt );
-
- return s_file_cnt.count;
-}
-
/***********************************************************************
* find out the session on which this file is open and bump up its count
**********************************************************************/
@@ -936,25 +898,15 @@ static WERROR init_srv_sess_info_1(struct pipes_struct *p,
W_ERROR_HAVE_NO_MEMORY(ctr1->array);
for (num_entries = 0; resume_handle < *total_entries; num_entries++, resume_handle++) {
- uint32 num_files;
uint32 connect_time;
- struct passwd *pw = getpwnam(session_list[resume_handle].username);
bool guest;
- if ( !pw ) {
- DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n",
- session_list[resume_handle].username));
- num_files = 0;
- } else {
- num_files = net_count_files(pw->pw_uid, session_list[resume_handle].pid);
- }
-
connect_time = (uint32_t)(now - session_list[resume_handle].connect_start);
guest = strequal( session_list[resume_handle].username, lp_guestaccount() );
ctr1->array[num_entries].client = session_list[resume_handle].remote_machine;
ctr1->array[num_entries].user = session_list[resume_handle].username;
- ctr1->array[num_entries].num_open = num_files;
+ ctr1->array[num_entries].num_open = 0;/* computed later */
ctr1->array[num_entries].time = connect_time;
ctr1->array[num_entries].idle_time = 0;
ctr1->array[num_entries].user_flags = guest;
@@ -962,6 +914,11 @@ static WERROR init_srv_sess_info_1(struct pipes_struct *p,
ctr1->count = num_entries;
+ /* count open files on all sessions in single tdb traversal */
+ net_count_files_for_all_sess(ctr1, session_list,
+ resume_handle_p ? *resume_handle_p : 0,
+ num_entries);
+
if (resume_handle_p) {
if (*resume_handle_p >= *total_entries) {
*resume_handle_p = 0;