remote: use a separate connection for interface APIs

Reviewed-by: John Ferlan <jferlan@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2018-03-22 11:16:25 +00:00
parent 6f9750012c
commit cb712443b7
3 changed files with 29 additions and 1 deletions

View File

@ -74,6 +74,7 @@ struct daemonClientPrivate {
* called, it will be set back to NULL if that succeeds.
*/
virConnectPtr conn;
virConnectPtr interfaceConn;
daemonClientStreamPtr streams;
};

View File

@ -1745,6 +1745,8 @@ void remoteClientFree(void *data)
if (priv->conn)
virConnectClose(priv->conn);
if (priv->interfaceConn)
virConnectClose(priv->interfaceConn);
VIR_FREE(priv);
}
@ -1817,6 +1819,8 @@ remoteDispatchConnectOpen(virNetServerPtr server ATTRIBUTE_UNUSED,
if (priv->conn == NULL)
goto cleanup;
priv->interfaceConn = virObjectRef(priv->conn);
/* force update the @readonly attribute which was inherited from the
* virNetServerService object - this is important for sockets that are RW
* by default, but do accept RO flags, e.g. TCP

View File

@ -111,9 +111,32 @@ sub name_to_TypeName {
}
sub get_conn_arg {
my $proc = shift;
my $args = shift;
my $rets = shift;
if ($structprefix eq "admin") {
return "priv->dmn";
}
my @types;
push @types, @{$args} if $args;
push @types, @{$rets} if $rets;
# This correctly detects most APIs
foreach my $type (@types) {
if ($type =~ /remote_nonnull_interface/) {
return "priv->interfaceConn";
}
}
# This is for the few virConnect APIs that
# return things which aren't objects. eg list
# of pool names, or number of pools.
if ($proc =~ /Connect.*Interface/ || $proc =~ /InterfaceChange/) {
return "priv->interfaceConn";
}
return "priv->conn";
}
@ -481,7 +504,7 @@ elsif ($mode eq "server") {
my @free_list = ();
my @free_list_on_error = ("virNetMessageSaveError(rerr);");
my $conn = get_conn_arg();
my $conn = get_conn_arg($call->{ProcName}, $call->{args_members}, $call->{ret_members});
# handle arguments to the function
if ($argtype ne "void") {