diff options
author | Stefan Metzmacher <metze@samba.org> | 2018-07-24 10:56:34 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2018-07-25 17:49:06 +0200 |
commit | 0c97226356f2ba5f01a58d361371055caf11e2a7 (patch) | |
tree | d2017285c42f119516b553d96877bf817890c985 | |
parent | 2be7518ae5a3c046f5fca04ecc83f9f7044eac74 (diff) | |
download | samba-0c97226356f2ba5f01a58d361371055caf11e2a7.tar.gz |
smbd: introduce sconn->sync_thread_pool
This just simulates a threadpool, but executes the
job functions inline (blocking) in the main thread.
This will be used to work arround some OS limitations,
e.g. if per thread credentials or per thread working directory
are not supported.
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
-rw-r--r-- | source3/smbd/globals.h | 1 | ||||
-rw-r--r-- | source3/smbd/msdfs.c | 12 | ||||
-rw-r--r-- | source3/smbd/process.c | 16 |
3 files changed, 28 insertions, 1 deletions
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index e75ec5408f3..19a130e64f6 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -939,6 +939,7 @@ struct smbd_server_connection { } locks; } smb2; + struct pthreadpool_tevent *sync_thread_pool; struct pthreadpool_tevent *raw_thread_pool; struct smbXsrv_client *client; diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index c74de7acf88..bf9b3abee4a 100644 --- a/source3/smbd/msdfs.c +++ b/source3/smbd/msdfs.c @@ -32,6 +32,7 @@ #include "libcli/security/security.h" #include "librpc/gen_ndr/ndr_dfsblobs.h" #include "lib/tsocket/tsocket.h" +#include "lib/pthreadpool/pthreadpool_tevent.h" /********************************************************************** Parse a DFS pathname of the form \hostname\service\reqpath @@ -251,6 +252,7 @@ static NTSTATUS create_conn_struct_as_root(TALLOC_CTX *ctx, const char *vfs_user; struct smbd_server_connection *sconn; const char *servicename = lp_const_servicename(snum); + int ret; sconn = talloc_zero(ctx, struct smbd_server_connection); if (sconn == NULL) { @@ -274,6 +276,16 @@ static NTSTATUS create_conn_struct_as_root(TALLOC_CTX *ctx, return NT_STATUS_NO_MEMORY; } + /* + * We only provide sync threadpools. + */ + ret = pthreadpool_tevent_init(sconn, 0, &sconn->sync_thread_pool); + if (ret != 0) { + TALLOC_FREE(sconn); + return NT_STATUS_NO_MEMORY; + } + sconn->raw_thread_pool = sconn->sync_thread_pool; + sconn->msg_ctx = msg; conn = conn_new(sconn); diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 8e1fceab0aa..35b5f4df385 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -3907,6 +3907,7 @@ void smbd_process(struct tevent_context *ev_ctx, const char *locaddr = NULL; const char *remaddr = NULL; int ret; + size_t max_threads; NTSTATUS status; struct timeval tv = timeval_current(); NTTIME now = timeval_to_nttime(&tv); @@ -3952,7 +3953,20 @@ void smbd_process(struct tevent_context *ev_ctx, ret = pthreadpool_tevent_init(sconn, lp_aio_max_threads(), &sconn->raw_thread_pool); if (ret != 0) { - exit_server("pthreadpool_tevent_init() failed."); + exit_server("pthreadpool_tevent_init(raw) failed."); + } + + max_threads = pthreadpool_tevent_max_threads(sconn->raw_thread_pool); + if (max_threads == 0) { + /* + * We only have a sync pool, no need to create a 2nd one. + */ + sconn->sync_thread_pool = sconn->raw_thread_pool; + } else { + ret = pthreadpool_tevent_init(sconn, 0, &sconn->sync_thread_pool); + if (ret != 0) { + exit_server("pthreadpool_tevent_init(sync) failed."); + } } if (lp_server_max_protocol() >= PROTOCOL_SMB2_02) { |