提交 39b5e4d4 编写于 作者: D Daniel P. Berrange

Refactor RPC client private data setup

Currently there is a hook function that is invoked when a
new client connection comes in, which allows an app to
setup private data. This setup will make it difficult to
serialize client state during process re-exec(). Change to
a model where the app registers a callback when creating
the virNetServerPtr instance, which is used to allocate
the client private data immediately during virNetClientPtr
construction.
Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
上级 07143d84
...@@ -1196,6 +1196,7 @@ int main(int argc, char **argv) { ...@@ -1196,6 +1196,7 @@ int main(int argc, char **argv) {
!!config->keepalive_required, !!config->keepalive_required,
config->mdns_adv ? config->mdns_name : NULL, config->mdns_adv ? config->mdns_name : NULL,
remoteClientInitHook, remoteClientInitHook,
remoteClientFreeFunc,
NULL))) { NULL))) {
ret = VIR_DAEMON_ERR_INIT; ret = VIR_DAEMON_ERR_INIT;
goto cleanup; goto cleanup;
......
...@@ -631,7 +631,7 @@ verify(ARRAY_CARDINALITY(domainEventCallbacks) == VIR_DOMAIN_EVENT_ID_LAST); ...@@ -631,7 +631,7 @@ verify(ARRAY_CARDINALITY(domainEventCallbacks) == VIR_DOMAIN_EVENT_ID_LAST);
* We keep the libvirt connection open until any async * We keep the libvirt connection open until any async
* jobs have finished, then clean it up elsewhere * jobs have finished, then clean it up elsewhere
*/ */
static void remoteClientFreeFunc(void *data) void remoteClientFreeFunc(void *data)
{ {
struct daemonClientPrivate *priv = data; struct daemonClientPrivate *priv = data;
...@@ -663,31 +663,28 @@ static void remoteClientCloseFunc(virNetServerClientPtr client) ...@@ -663,31 +663,28 @@ static void remoteClientCloseFunc(virNetServerClientPtr client)
} }
int remoteClientInitHook(virNetServerPtr srv ATTRIBUTE_UNUSED, void *remoteClientInitHook(virNetServerClientPtr client,
virNetServerClientPtr client, void *opaque ATTRIBUTE_UNUSED)
void *opaque ATTRIBUTE_UNUSED)
{ {
struct daemonClientPrivate *priv; struct daemonClientPrivate *priv;
int i; int i;
if (VIR_ALLOC(priv) < 0) { if (VIR_ALLOC(priv) < 0) {
virReportOOMError(); virReportOOMError();
return -1; return NULL;
} }
if (virMutexInit(&priv->lock) < 0) { if (virMutexInit(&priv->lock) < 0) {
VIR_FREE(priv); VIR_FREE(priv);
virReportOOMError(); virReportOOMError();
return -1; return NULL;
} }
for (i = 0 ; i < VIR_DOMAIN_EVENT_ID_LAST ; i++) for (i = 0 ; i < VIR_DOMAIN_EVENT_ID_LAST ; i++)
priv->domainEventCallbackID[i] = -1; priv->domainEventCallbackID[i] = -1;
virNetServerClientSetPrivateData(client, priv,
remoteClientFreeFunc);
virNetServerClientSetCloseHook(client, remoteClientCloseFunc); virNetServerClientSetCloseHook(client, remoteClientCloseFunc);
return 0; return priv;
} }
/*----- Functions. -----*/ /*----- Functions. -----*/
......
...@@ -35,8 +35,8 @@ extern size_t remoteNProcs; ...@@ -35,8 +35,8 @@ extern size_t remoteNProcs;
extern virNetServerProgramProc qemuProcs[]; extern virNetServerProgramProc qemuProcs[];
extern size_t qemuNProcs; extern size_t qemuNProcs;
int remoteClientInitHook(virNetServerPtr srv, void remoteClientFreeFunc(void *data);
virNetServerClientPtr client, void *remoteClientInitHook(virNetServerClientPtr client,
void *opaque); void *opaque);
#endif /* __LIBVIRTD_REMOTE_H__ */ #endif /* __LIBVIRTD_REMOTE_H__ */
...@@ -1524,7 +1524,6 @@ virNetServerClientSendMessage; ...@@ -1524,7 +1524,6 @@ virNetServerClientSendMessage;
virNetServerClientSetCloseHook; virNetServerClientSetCloseHook;
virNetServerClientSetDispatcher; virNetServerClientSetDispatcher;
virNetServerClientSetIdentity; virNetServerClientSetIdentity;
virNetServerClientSetPrivateData;
virNetServerClientStartKeepAlive; virNetServerClientStartKeepAlive;
virNetServerClientWantClose; virNetServerClientWantClose;
......
...@@ -578,16 +578,26 @@ static void virLXCControllerClientCloseHook(virNetServerClientPtr client) ...@@ -578,16 +578,26 @@ static void virLXCControllerClientCloseHook(virNetServerClientPtr client)
} }
} }
static int virLXCControllerClientHook(virNetServerPtr server ATTRIBUTE_UNUSED, static void virLXCControllerClientPrivateFree(void *data)
virNetServerClientPtr client, {
void *opaque) VIR_FREE(data);
}
static void *virLXCControllerClientPrivateNew(virNetServerClientPtr client,
void *opaque)
{ {
virLXCControllerPtr ctrl = opaque; virLXCControllerPtr ctrl = opaque;
virNetServerClientSetPrivateData(client, ctrl, NULL); int *dummy;
if (VIR_ALLOC(dummy) < 0) {
virReportOOMError();
return NULL;
}
virNetServerClientSetCloseHook(client, virLXCControllerClientCloseHook); virNetServerClientSetCloseHook(client, virLXCControllerClientCloseHook);
VIR_DEBUG("Got new client %p", client); VIR_DEBUG("Got new client %p", client);
ctrl->client = client; ctrl->client = client;
return 0; return dummy;
} }
...@@ -605,7 +615,8 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl) ...@@ -605,7 +615,8 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl)
if (!(ctrl->server = virNetServerNew(0, 0, 0, 1, if (!(ctrl->server = virNetServerNew(0, 0, 0, 1,
-1, 0, false, -1, 0, false,
NULL, NULL,
virLXCControllerClientHook, virLXCControllerClientPrivateNew,
virLXCControllerClientPrivateFree,
ctrl))) ctrl)))
goto error; goto error;
......
...@@ -104,8 +104,9 @@ struct _virNetServer { ...@@ -104,8 +104,9 @@ struct _virNetServer {
virNetServerAutoShutdownFunc autoShutdownFunc; virNetServerAutoShutdownFunc autoShutdownFunc;
void *autoShutdownOpaque; void *autoShutdownOpaque;
virNetServerClientInitHook clientInitHook; virNetServerClientPrivNew clientPrivNew;
void *clientInitOpaque; virFreeCallback clientPrivFree;
void *clientPrivOpaque;
}; };
...@@ -281,16 +282,15 @@ static int virNetServerDispatchNewClient(virNetServerServicePtr svc, ...@@ -281,16 +282,15 @@ static int virNetServerDispatchNewClient(virNetServerServicePtr svc,
virNetServerServiceGetAuth(svc), virNetServerServiceGetAuth(svc),
virNetServerServiceIsReadonly(svc), virNetServerServiceIsReadonly(svc),
virNetServerServiceGetMaxRequests(svc), virNetServerServiceGetMaxRequests(svc),
virNetServerServiceGetTLSContext(svc)))) virNetServerServiceGetTLSContext(svc),
srv->clientPrivNew,
srv->clientPrivFree,
srv->clientPrivOpaque)))
goto error; goto error;
if (virNetServerClientInit(client) < 0) if (virNetServerClientInit(client) < 0)
goto error; goto error;
if (srv->clientInitHook &&
srv->clientInitHook(srv, client, srv->clientInitOpaque) < 0)
goto error;
if (VIR_EXPAND_N(srv->clients, srv->nclients, 1) < 0) { if (VIR_EXPAND_N(srv->clients, srv->nclients, 1) < 0) {
virReportOOMError(); virReportOOMError();
goto error; goto error;
...@@ -352,8 +352,9 @@ virNetServerPtr virNetServerNew(size_t min_workers, ...@@ -352,8 +352,9 @@ virNetServerPtr virNetServerNew(size_t min_workers,
unsigned int keepaliveCount, unsigned int keepaliveCount,
bool keepaliveRequired, bool keepaliveRequired,
const char *mdnsGroupName, const char *mdnsGroupName,
virNetServerClientInitHook clientInitHook, virNetServerClientPrivNew clientPrivNew,
void *opaque) virFreeCallback clientPrivFree,
void *clientPrivOpaque)
{ {
virNetServerPtr srv; virNetServerPtr srv;
struct sigaction sig_action; struct sigaction sig_action;
...@@ -376,8 +377,9 @@ virNetServerPtr virNetServerNew(size_t min_workers, ...@@ -376,8 +377,9 @@ virNetServerPtr virNetServerNew(size_t min_workers,
srv->keepaliveCount = keepaliveCount; srv->keepaliveCount = keepaliveCount;
srv->keepaliveRequired = keepaliveRequired; srv->keepaliveRequired = keepaliveRequired;
srv->sigwrite = srv->sigread = -1; srv->sigwrite = srv->sigread = -1;
srv->clientInitHook = clientInitHook; srv->clientPrivNew = clientPrivNew;
srv->clientInitOpaque = opaque; srv->clientPrivFree = clientPrivFree;
srv->clientPrivOpaque = clientPrivOpaque;
srv->privileged = geteuid() == 0 ? true : false; srv->privileged = geteuid() == 0 ? true : false;
if (mdnsGroupName && if (mdnsGroupName &&
......
...@@ -32,10 +32,6 @@ ...@@ -32,10 +32,6 @@
# include "virnetserverservice.h" # include "virnetserverservice.h"
# include "virobject.h" # include "virobject.h"
typedef int (*virNetServerClientInitHook)(virNetServerPtr srv,
virNetServerClientPtr client,
void *opaque);
virNetServerPtr virNetServerNew(size_t min_workers, virNetServerPtr virNetServerNew(size_t min_workers,
size_t max_workers, size_t max_workers,
size_t priority_workers, size_t priority_workers,
...@@ -44,8 +40,9 @@ virNetServerPtr virNetServerNew(size_t min_workers, ...@@ -44,8 +40,9 @@ virNetServerPtr virNetServerNew(size_t min_workers,
unsigned int keepaliveCount, unsigned int keepaliveCount,
bool keepaliveRequired, bool keepaliveRequired,
const char *mdnsGroupName, const char *mdnsGroupName,
virNetServerClientInitHook clientInitHook, virNetServerClientPrivNew clientPrivNew,
void *opaque); virFreeCallback clientPrivFree,
void *clientPrivOpaque);
typedef int (*virNetServerAutoShutdownFunc)(virNetServerPtr srv, void *opaque); typedef int (*virNetServerAutoShutdownFunc)(virNetServerPtr srv, void *opaque);
......
...@@ -97,7 +97,7 @@ struct _virNetServerClient ...@@ -97,7 +97,7 @@ struct _virNetServerClient
void *dispatchOpaque; void *dispatchOpaque;
void *privateData; void *privateData;
virNetServerClientFreeFunc privateDataFreeFunc; virFreeCallback privateDataFreeFunc;
virNetServerClientCloseFunc privateDataCloseFunc; virNetServerClientCloseFunc privateDataCloseFunc;
virKeepAlivePtr keepalive; virKeepAlivePtr keepalive;
...@@ -340,7 +340,10 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock, ...@@ -340,7 +340,10 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
int auth, int auth,
bool readonly, bool readonly,
size_t nrequests_max, size_t nrequests_max,
virNetTLSContextPtr tls) virNetTLSContextPtr tls,
virNetServerClientPrivNew privNew,
virFreeCallback privFree,
void *privOpaque)
{ {
virNetServerClientPtr client; virNetServerClientPtr client;
...@@ -378,6 +381,14 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock, ...@@ -378,6 +381,14 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
} }
client->nrequests = 1; client->nrequests = 1;
if (privNew) {
if (!(client->privateData = privNew(client, privOpaque))) {
virObjectUnref(client);
goto error;
}
client->privateDataFreeFunc = privFree;
}
PROBE(RPC_SERVER_CLIENT_NEW, PROBE(RPC_SERVER_CLIENT_NEW,
"client=%p sock=%p", "client=%p sock=%p",
client, client->sock); client, client->sock);
...@@ -507,22 +518,6 @@ const char *virNetServerClientGetIdentity(virNetServerClientPtr client) ...@@ -507,22 +518,6 @@ const char *virNetServerClientGetIdentity(virNetServerClientPtr client)
return identity; return identity;
} }
void virNetServerClientSetPrivateData(virNetServerClientPtr client,
void *opaque,
virNetServerClientFreeFunc ff)
{
virNetServerClientLock(client);
if (client->privateData &&
client->privateDataFreeFunc)
client->privateDataFreeFunc(client->privateData);
client->privateData = opaque;
client->privateDataFreeFunc = ff;
virNetServerClientUnlock(client);
}
void *virNetServerClientGetPrivateData(virNetServerClientPtr client) void *virNetServerClientGetPrivateData(virNetServerClientPtr client)
{ {
......
...@@ -39,11 +39,17 @@ typedef int (*virNetServerClientFilterFunc)(virNetServerClientPtr client, ...@@ -39,11 +39,17 @@ typedef int (*virNetServerClientFilterFunc)(virNetServerClientPtr client,
virNetMessagePtr msg, virNetMessagePtr msg,
void *opaque); void *opaque);
typedef void *(*virNetServerClientPrivNew)(virNetServerClientPtr client,
void *opaque);
virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock, virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
int auth, int auth,
bool readonly, bool readonly,
size_t nrequests_max, size_t nrequests_max,
virNetTLSContextPtr tls); virNetTLSContextPtr tls,
virNetServerClientPrivNew privNew,
virFreeCallback privFree,
void *privOpaque);
int virNetServerClientAddFilter(virNetServerClientPtr client, int virNetServerClientAddFilter(virNetServerClientPtr client,
virNetServerClientFilterFunc func, virNetServerClientFilterFunc func,
...@@ -74,11 +80,6 @@ const char *virNetServerClientGetIdentity(virNetServerClientPtr client); ...@@ -74,11 +80,6 @@ const char *virNetServerClientGetIdentity(virNetServerClientPtr client);
int virNetServerClientGetUNIXIdentity(virNetServerClientPtr client, int virNetServerClientGetUNIXIdentity(virNetServerClientPtr client,
uid_t *uid, gid_t *gid, pid_t *pid); uid_t *uid, gid_t *gid, pid_t *pid);
typedef void (*virNetServerClientFreeFunc)(void *data);
void virNetServerClientSetPrivateData(virNetServerClientPtr client,
void *opaque,
virNetServerClientFreeFunc ff);
void *virNetServerClientGetPrivateData(virNetServerClientPtr client); void *virNetServerClientGetPrivateData(virNetServerClientPtr client);
typedef void (*virNetServerClientCloseFunc)(virNetServerClientPtr client); typedef void (*virNetServerClientCloseFunc)(virNetServerClientPtr client);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册