Our secret driver divides secrets into two groups: ephemeral
(stored only in memory) and persistent (stored on disk). Now, the
aim of ephemeral secrets is to define them shortly before being
used and then undefine them. But 'shortly before being used' is a
very vague time frame. And since we default to socket activation
and thus pass '--timeout 120' to every daemon it may happen that
just defined ephemeral secret is gone among with the virtsecretd.
This is no problem for persistent secrets as their definition
(and value) is restored when the virtsecretd starts again, but
ephemeral secrets can't be restored.
Therefore, we could view ephemeral secrets as active objects that
the daemon manages and thus inhibit automatic shutdown (just like
hypervisor daemons do when a guest is running).
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/secret/secret_driver.c | 35 +++++++++++++++++++++++++++++++++--
1 file changed, 33 insertions(+), 2 deletions(-)
diff --git a/src/secret/secret_driver.c b/src/secret/secret_driver.c
index bd981a8ace..c38cd6f651 100644
--- a/src/secret/secret_driver.c
+++ b/src/secret/secret_driver.c
@@ -66,6 +66,10 @@ struct _virSecretDriverState {
/* Immutable pointer, self-locking APIs */
virObjectEventState *secretEventState;
+
+ /* Immutable pointers. Caller must provide locking */
+ virStateInhibitCallback inhibitCallback;
+ void *inhibitOpaque;
};
static virSecretDriverState *driver;
@@ -86,6 +90,23 @@ secretObjFromSecret(virSecretPtr secret)
}
+static bool
+secretNumOfEphemeralSecretsHelper(virConnectPtr conn G_GNUC_UNUSED,
+ virSecretDef *def)
+{
+ return def->isephemeral;
+}
+
+
+static int
+secretNumOfEphemeralSecrets(void)
+{
+ return virSecretObjListNumOfSecrets(driver->secrets,
+ secretNumOfEphemeralSecretsHelper,
+ NULL);
+}
+
+
/* Driver functions */
static int
@@ -266,6 +287,10 @@ secretDefineXML(virConnectPtr conn,
cleanup:
virSecretDefFree(def);
virSecretObjEndAPI(&obj);
+
+ if (secretNumOfEphemeralSecrets() > 0)
+ driver->inhibitCallback(true, driver->inhibitOpaque);
+
virObjectEventStateQueue(driver->secretEventState, event);
return ret;
@@ -424,6 +449,10 @@ secretUndefine(virSecretPtr secret)
cleanup:
virSecretObjEndAPI(&obj);
+
+ if (secretNumOfEphemeralSecrets() == 0)
+ driver->inhibitCallback(false, driver->inhibitOpaque);
+
virObjectEventStateQueue(driver->secretEventState, event);
return ret;
@@ -463,8 +492,8 @@ static int
secretStateInitialize(bool privileged,
const char *root,
bool monolithic G_GNUC_UNUSED,
- virStateInhibitCallback callback G_GNUC_UNUSED,
- void *opaque G_GNUC_UNUSED)
+ virStateInhibitCallback callback,
+ void *opaque)
{
VIR_LOCK_GUARD lock = virLockGuardLock(&mutex);
@@ -473,6 +502,8 @@ secretStateInitialize(bool privileged,
driver->lockFD = -1;
driver->secretEventState = virObjectEventStateNew();
driver->privileged = privileged;
+ driver->inhibitCallback = callback;
+ driver->inhibitOpaque = opaque;
if (root) {
driver->embeddedRoot = g_strdup(root);
--
2.38.2