On 29.03.2016 09:51, Erik Skultety wrote: > Since threadpool increments the current number of threads according to current > load, i.e. how many jobs are waiting in the queue. The count however, is > constrained by max and min limits of workers. The logic of this new API works > like this: > 1) setting the minimum > a) When the limit is increased, depending on the current number of > threads, new threads are possibly spawned if the current number of > threads is less than the new minimum limit > b) Decreasing the minimum limit has no possible effect on the current > number of threads > 2) setting the maximum > a) Icreasing the maximum limit has no immediate effect on the current > number of threads, it only allows the threadpool to spawn more > threads when new jobs, that would otherwise end up queued, arrive. > b) Decreasing the maximum limit may affect the current number of > threads, if the current number of threads is less than the new > maximum limit. Since there may be some ongoing time-consuming jobs > that would effectively block this API from killing any threads. > Therefore, this API is asynchronous with best-effort execution, > i.e. the necessary number of workers will be terminated once they > finish their previous job, unless other workers had already > terminated, decreasing the limit to the requested value. > 3) setting priority workers > - both increase and decrease in count of these workers have an > immediate impact on the current number of workers, new ones will be > spawned or some of them get terminated respectively. > --- > daemon/admin.c | 43 +++++++++++++++++++++++ > daemon/admin_server.c | 43 +++++++++++++++++++++++ > daemon/admin_server.h | 5 +++ > include/libvirt/libvirt-admin.h | 5 +++ > src/admin/admin_protocol.x | 13 ++++++- > src/admin/admin_remote.c | 34 ++++++++++++++++++ > src/admin_protocol-structs | 9 +++++ > src/libvirt-admin.c | 37 ++++++++++++++++++++ > src/libvirt_admin_private.syms | 1 + > src/libvirt_admin_public.syms | 1 + > src/libvirt_private.syms | 1 + > src/rpc/virnetserver.c | 15 ++++++++ > src/util/virthreadpool.c | 77 +++++++++++++++++++++++++++++++++++++++-- > src/util/virthreadpool.h | 5 +++ > 14 files changed, 285 insertions(+), 4 deletions(-) > > diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c > index c528f79..9b31ad2 100644 > --- a/src/libvirt-admin.c > +++ b/src/libvirt-admin.c > @@ -720,3 +720,40 @@ virAdmServerGetThreadPoolParameters(virAdmServerPtr srv, > virDispatchError(NULL); > return -1; > } > + > +/** > + * virAdmServerSetThreadPoolParameters: > + * @srv: a valid server object reference > + * @params: pointer to threadpool parameter objects > + * @nparams: number of parameters in @params > + * @flags: bitwise-OR of extra flags virAdmServerSetThreadPoolParametersFlags > + * > + * Change server threadpool parameters according to @params. Note that some > + * tunables are read-only, thus any attempt to set them will result in a > + * failure. > + * > + * Returns 0 on success, -1 in case of an error. > + */ > +int > +virAdmServerSetThreadPoolParameters(virAdmServerPtr srv, > + virTypedParameterPtr params, > + int nparams, > + unsigned int flags) > +{ > + VIR_DEBUG("srv=%p, params=%p, nparams=%x, flags=%x", > + srv, params, nparams, flags); > + > + virResetLastError(); > + > + virCheckAdmServerReturn(srv, NULL); Function is returning an int, not a pointer. > + virCheckNonNullArgGoto(params, error); > + > + if (remoteAdminServerSetThreadPoolParameters(srv, params, > + nparams, flags) < 0) > + goto error; > + > + return 0; > + error: > + virDispatchError(NULL); > + return -1; > +} Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list