]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Refactor RPC client private data setup
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 9 Aug 2012 11:31:34 +0000 (12:31 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 15 Aug 2012 09:59:10 +0000 (10:59 +0100)
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: Daniel P. Berrange <berrange@redhat.com>
daemon/libvirtd.c
daemon/remote.c
daemon/remote.h
src/libvirt_private.syms
src/lxc/lxc_controller.c
src/rpc/virnetserver.c
src/rpc/virnetserver.h
src/rpc/virnetserverclient.c
src/rpc/virnetserverclient.h

index fa9e7e8e97cb0fdb1e7dcdf553ef8a2cd7a9dccf..24e20f8153045109013952b52b48131ae52b5cc4 100644 (file)
@@ -1196,6 +1196,7 @@ int main(int argc, char **argv) {
                                 !!config->keepalive_required,
                                 config->mdns_adv ? config->mdns_name : NULL,
                                 remoteClientInitHook,
+                                remoteClientFreeFunc,
                                 NULL))) {
         ret = VIR_DAEMON_ERR_INIT;
         goto cleanup;
index 832307e3565aa35593fc4507e6bad7de98e650c5..851bcc1cfa25d3d0f2cdbc53532c5cce825edce2 100644 (file)
@@ -631,7 +631,7 @@ verify(ARRAY_CARDINALITY(domainEventCallbacks) == VIR_DOMAIN_EVENT_ID_LAST);
  * We keep the libvirt connection open until any async
  * jobs have finished, then clean it up elsewhere
  */
-static void remoteClientFreeFunc(void *data)
+void remoteClientFreeFunc(void *data)
 {
     struct daemonClientPrivate *priv = data;
 
@@ -663,31 +663,28 @@ static void remoteClientCloseFunc(virNetServerClientPtr client)
 }
 
 
-int remoteClientInitHook(virNetServerPtr srv ATTRIBUTE_UNUSED,
-                         virNetServerClientPtr client,
-                         void *opaque ATTRIBUTE_UNUSED)
+void *remoteClientInitHook(virNetServerClientPtr client,
+                           void *opaque ATTRIBUTE_UNUSED)
 {
     struct daemonClientPrivate *priv;
     int i;
 
     if (VIR_ALLOC(priv) < 0) {
         virReportOOMError();
-        return -1;
+        return NULL;
     }
 
     if (virMutexInit(&priv->lock) < 0) {
         VIR_FREE(priv);
         virReportOOMError();
-        return -1;
+        return NULL;
     }
 
     for (i = 0 ; i < VIR_DOMAIN_EVENT_ID_LAST ; i++)
         priv->domainEventCallbackID[i] = -1;
 
-    virNetServerClientSetPrivateData(client, priv,
-                                     remoteClientFreeFunc);
     virNetServerClientSetCloseHook(client, remoteClientCloseFunc);
-    return 0;
+    return priv;
 }
 
 /*----- Functions. -----*/
index 9f662cb132386ba7ce7845340b1e3212a38971fd..28064946674e4e04c6890391a3f2f93523bc97ed 100644 (file)
@@ -35,8 +35,8 @@ extern size_t remoteNProcs;
 extern virNetServerProgramProc qemuProcs[];
 extern size_t qemuNProcs;
 
-int remoteClientInitHook(virNetServerPtr srv,
-                         virNetServerClientPtr client,
-                         void *opaque);
+void remoteClientFreeFunc(void *data);
+void *remoteClientInitHook(virNetServerClientPtr client,
+                           void *opaque);
 
 #endif /* __LIBVIRTD_REMOTE_H__ */
index a859810a2ce0adfb6146086705519a3f1fe2e551..e5d358220cbbaaa7511de8e01b6525a7f7400df5 100644 (file)
@@ -1524,7 +1524,6 @@ virNetServerClientSendMessage;
 virNetServerClientSetCloseHook;
 virNetServerClientSetDispatcher;
 virNetServerClientSetIdentity;
-virNetServerClientSetPrivateData;
 virNetServerClientStartKeepAlive;
 virNetServerClientWantClose;
 
index cb9fa41294a8cfa1a06aa141051a9e370de94aa9..4c3c17fe2cb3384ede1fd31b888dc4bd30e23a4b 100644 (file)
@@ -578,16 +578,26 @@ static void virLXCControllerClientCloseHook(virNetServerClientPtr client)
     }
 }
 
-static int virLXCControllerClientHook(virNetServerPtr server ATTRIBUTE_UNUSED,
-                                      virNetServerClientPtr client,
-                                      void *opaque)
+static void virLXCControllerClientPrivateFree(void *data)
+{
+    VIR_FREE(data);
+}
+
+static void *virLXCControllerClientPrivateNew(virNetServerClientPtr client,
+                                              void *opaque)
 {
     virLXCControllerPtr ctrl = opaque;
-    virNetServerClientSetPrivateData(client, ctrl, NULL);
+    int *dummy;
+
+    if (VIR_ALLOC(dummy) < 0) {
+        virReportOOMError();
+        return NULL;
+    }
+
     virNetServerClientSetCloseHook(client, virLXCControllerClientCloseHook);
     VIR_DEBUG("Got new client %p", client);
     ctrl->client = client;
-    return 0;
+    return dummy;
 }
 
 
@@ -605,7 +615,8 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl)
     if (!(ctrl->server = virNetServerNew(0, 0, 0, 1,
                                          -1, 0, false,
                                          NULL,
-                                         virLXCControllerClientHook,
+                                         virLXCControllerClientPrivateNew,
+                                         virLXCControllerClientPrivateFree,
                                          ctrl)))
         goto error;
 
index c3eb2e5d9c61a5fbfb3affc842db82f9afe5e8b9..03cf0b7475794c96894f9deaae8e632071865613 100644 (file)
@@ -104,8 +104,9 @@ struct _virNetServer {
     virNetServerAutoShutdownFunc autoShutdownFunc;
     void *autoShutdownOpaque;
 
-    virNetServerClientInitHook clientInitHook;
-    void *clientInitOpaque;
+    virNetServerClientPrivNew clientPrivNew;
+    virFreeCallback clientPrivFree;
+    void *clientPrivOpaque;
 };
 
 
@@ -281,16 +282,15 @@ static int virNetServerDispatchNewClient(virNetServerServicePtr svc,
                                          virNetServerServiceGetAuth(svc),
                                          virNetServerServiceIsReadonly(svc),
                                          virNetServerServiceGetMaxRequests(svc),
-                                         virNetServerServiceGetTLSContext(svc))))
+                                         virNetServerServiceGetTLSContext(svc),
+                                         srv->clientPrivNew,
+                                         srv->clientPrivFree,
+                                         srv->clientPrivOpaque)))
         goto error;
 
     if (virNetServerClientInit(client) < 0)
         goto error;
 
-    if (srv->clientInitHook &&
-        srv->clientInitHook(srv, client, srv->clientInitOpaque) < 0)
-        goto error;
-
     if (VIR_EXPAND_N(srv->clients, srv->nclients, 1) < 0) {
         virReportOOMError();
         goto error;
@@ -352,8 +352,9 @@ virNetServerPtr virNetServerNew(size_t min_workers,
                                 unsigned int keepaliveCount,
                                 bool keepaliveRequired,
                                 const char *mdnsGroupName,
-                                virNetServerClientInitHook clientInitHook,
-                                void *opaque)
+                                virNetServerClientPrivNew clientPrivNew,
+                                virFreeCallback clientPrivFree,
+                                void *clientPrivOpaque)
 {
     virNetServerPtr srv;
     struct sigaction sig_action;
@@ -376,8 +377,9 @@ virNetServerPtr virNetServerNew(size_t min_workers,
     srv->keepaliveCount = keepaliveCount;
     srv->keepaliveRequired = keepaliveRequired;
     srv->sigwrite = srv->sigread = -1;
-    srv->clientInitHook = clientInitHook;
-    srv->clientInitOpaque = opaque;
+    srv->clientPrivNew = clientPrivNew;
+    srv->clientPrivFree = clientPrivFree;
+    srv->clientPrivOpaque = clientPrivOpaque;
     srv->privileged = geteuid() == 0 ? true : false;
 
     if (mdnsGroupName &&
index 7dc52ca8ca55a4aad253226e3e4ae5e82153c289..918807297a0a8b6d900ae3290bed1ab0cf480393 100644 (file)
 # include "virnetserverservice.h"
 # include "virobject.h"
 
-typedef int (*virNetServerClientInitHook)(virNetServerPtr srv,
-                                          virNetServerClientPtr client,
-                                          void *opaque);
-
 virNetServerPtr virNetServerNew(size_t min_workers,
                                 size_t max_workers,
                                 size_t priority_workers,
@@ -44,8 +40,9 @@ virNetServerPtr virNetServerNew(size_t min_workers,
                                 unsigned int keepaliveCount,
                                 bool keepaliveRequired,
                                 const char *mdnsGroupName,
-                                virNetServerClientInitHook clientInitHook,
-                                void *opaque);
+                                virNetServerClientPrivNew clientPrivNew,
+                                virFreeCallback clientPrivFree,
+                                void *clientPrivOpaque);
 
 typedef int (*virNetServerAutoShutdownFunc)(virNetServerPtr srv, void *opaque);
 
index 9f033c8841d9ba0359ff383c47ea40492aa37c15..c9703fd8c6ee2edb8cc3aa7d2e8523dbc1b6e111 100644 (file)
@@ -97,7 +97,7 @@ struct _virNetServerClient
     void *dispatchOpaque;
 
     void *privateData;
-    virNetServerClientFreeFunc privateDataFreeFunc;
+    virFreeCallback privateDataFreeFunc;
     virNetServerClientCloseFunc privateDataCloseFunc;
 
     virKeepAlivePtr keepalive;
@@ -340,7 +340,10 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
                                             int auth,
                                             bool readonly,
                                             size_t nrequests_max,
-                                            virNetTLSContextPtr tls)
+                                            virNetTLSContextPtr tls,
+                                            virNetServerClientPrivNew privNew,
+                                            virFreeCallback privFree,
+                                            void *privOpaque)
 {
     virNetServerClientPtr client;
 
@@ -378,6 +381,14 @@ virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
     }
     client->nrequests = 1;
 
+    if (privNew) {
+        if (!(client->privateData = privNew(client, privOpaque))) {
+            virObjectUnref(client);
+            goto error;
+        }
+        client->privateDataFreeFunc = privFree;
+    }
+
     PROBE(RPC_SERVER_CLIENT_NEW,
           "client=%p sock=%p",
           client, client->sock);
@@ -507,22 +518,6 @@ const char *virNetServerClientGetIdentity(virNetServerClientPtr client)
     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)
 {
index a1ff19b2d9b15e83a7cf4b7a722b5b4c4ff2f776..f950c61702ffb0d866e9f9cd21d262417551bcc0 100644 (file)
@@ -39,11 +39,17 @@ typedef int (*virNetServerClientFilterFunc)(virNetServerClientPtr client,
                                             virNetMessagePtr msg,
                                             void *opaque);
 
+typedef void *(*virNetServerClientPrivNew)(virNetServerClientPtr client,
+                                           void *opaque);
+
 virNetServerClientPtr virNetServerClientNew(virNetSocketPtr sock,
                                             int auth,
                                             bool readonly,
                                             size_t nrequests_max,
-                                            virNetTLSContextPtr tls);
+                                            virNetTLSContextPtr tls,
+                                            virNetServerClientPrivNew privNew,
+                                            virFreeCallback privFree,
+                                            void *privOpaque);
 
 int virNetServerClientAddFilter(virNetServerClientPtr client,
                                 virNetServerClientFilterFunc func,
@@ -74,11 +80,6 @@ const char *virNetServerClientGetIdentity(virNetServerClientPtr client);
 int virNetServerClientGetUNIXIdentity(virNetServerClientPtr client,
                                       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);
 
 typedef void (*virNetServerClientCloseFunc)(virNetServerClientPtr client);