File 0002-lxc-implement-connectGetAllDomainStats.patch of Package libvirt
xxxxxxxxxx
1
From 1a2be7098cf5acfd893153abb52b65e69631dcec Mon Sep 17 00:00:00 2001
2
From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= <cbosdonnat@suse.com>
3
Date: Tue, 2 Jan 2018 14:44:39 +0100
4
Subject: [PATCH 2/3] lxc: implement connectGetAllDomainStats
5
6
LXC containers can also provide some statistics. Allow users to fetch
7
them using the existing API.
8
---
9
src/lxc/lxc_driver.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++
10
1 file changed, 138 insertions(+)
11
12
Index: libvirt-7.1.0/src/lxc/lxc_driver.c
13
===================================================================
14
--- libvirt-7.1.0.orig/src/lxc/lxc_driver.c
15
+++ libvirt-7.1.0/src/lxc/lxc_driver.c
16
17
#include "netdev_bandwidth_conf.h"
18
#include "virsocket.h"
19
#include "virutil.h"
20
+#include "viralloc.h"
21
+#include "domain_stats.h"
22
23
#define VIR_FROM_THIS VIR_FROM_LXC
24
25
26
return ret;
27
}
28
29
+static int
30
+lxcDomainGetStatsCpu(virDomainObjPtr dom,
31
+ virTypedParamListPtr params)
32
+{
33
+ virLXCDomainObjPrivatePtr priv = dom->privateData;
34
+ return virCgroupGetStatsCpu(priv->cgroup, params);
35
+}
36
+
37
+typedef int
38
+(*lxcDomainGetStatsFunc)(virDomainObjPtr dom,
39
+ virTypedParamListPtr params);
40
+
41
+
42
+struct lxcDomainGetStatsWorker {
43
+ lxcDomainGetStatsFunc func;
44
+ unsigned int stats;
45
+};
46
+
47
+static struct lxcDomainGetStatsWorker lxcDomainGetStatsWorkers[] = {
48
+ { virDomainStatsGetState, VIR_DOMAIN_STATS_STATE },
49
+ { lxcDomainGetStatsCpu, VIR_DOMAIN_STATS_CPU_TOTAL },
50
+ { virDomainStatsGetInterface, VIR_DOMAIN_STATS_INTERFACE },
51
+ { NULL, 0 }
52
+};
53
+
54
+static int
55
+lxcDomainGetStats(virConnectPtr conn,
56
+ virDomainObjPtr dom,
57
+ unsigned int stats,
58
+ virDomainStatsRecordPtr *record)
59
+{
60
+ g_autofree virDomainStatsRecordPtr tmp = g_new0(virDomainStatsRecord, 1);
61
+ g_autoptr(virTypedParamList) params = g_new0(virTypedParamList, 1);
62
+ size_t i;
63
+
64
+ for (i = 0; lxcDomainGetStatsWorkers[i].func; i++) {
65
+ if (stats & lxcDomainGetStatsWorkers[i].stats) {
66
+ if (lxcDomainGetStatsWorkers[i].func(dom, params) < 0)
67
+ return -1;
68
+ }
69
+ }
70
+
71
+ if (!(tmp->dom = virGetDomain(conn, dom->def->name,
72
+ dom->def->uuid, dom->def->id)))
73
+ return -1;
74
+
75
+ tmp->nparams = virTypedParamListStealParams(params, &tmp->params);
76
+ *record = g_steal_pointer(&tmp);
77
+ return 0;
78
+}
79
+
80
+static int
81
+lxcConnectGetAllDomainStats(virConnectPtr conn,
82
+ virDomainPtr *doms,
83
+ unsigned int ndoms,
84
+ unsigned int stats,
85
+ virDomainStatsRecordPtr **retStats,
86
+ unsigned int flags)
87
+{
88
+ virLXCDriverPtr driver = conn->privateData;
89
+ virDomainObjPtr *vms = NULL;
90
+ virDomainObjPtr vm;
91
+ size_t nvms;
92
+ virDomainStatsRecordPtr *tmpstats = NULL;
93
+ int nstats = 0;
94
+ size_t i;
95
+ int ret = -1;
96
+ unsigned int lflags = flags & (VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
97
+ VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
98
+ VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE);
99
+
100
+ virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
101
+ VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
102
+ VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE, -1);
103
+
104
+ if (virConnectGetAllDomainStatsEnsureACL(conn) < 0)
105
+ return -1;
106
+
107
+ /* TODO Check stats support */
108
+
109
+ if (ndoms) {
110
+ if (virDomainObjListConvert(driver->domains, conn, doms, ndoms, &vms,
111
+ &nvms, virConnectGetAllDomainStatsCheckACL,
112
+ lflags, true) < 0)
113
+ return -1;
114
+ } else {
115
+ if (virDomainObjListCollect(driver->domains, conn, &vms, &nvms,
116
+ virConnectGetAllDomainStatsCheckACL,
117
+ lflags) < 0)
118
+ return -1;
119
+ }
120
+
121
+ tmpstats = g_new0(virDomainStatsRecordPtr, nvms + 1);
122
+
123
+ for (i = 0; i < nvms; i++) {
124
+ virDomainStatsRecordPtr tmp = NULL;
125
+ vm = vms[i];
126
+
127
+ virObjectLock(vm);
128
+
129
+ if (lxcDomainGetStats(conn, vm, stats, &tmp) < 0) {
130
+ virObjectUnlock(vm);
131
+ goto cleanup;
132
+ }
133
+
134
+ if (tmp)
135
+ tmpstats[nstats++] = tmp;
136
+
137
+ virObjectUnlock(vm);
138
+ }
139
+
140
+ *retStats = tmpstats;
141
+ tmpstats = NULL;
142
+
143
+ ret = nstats;
144
+
145
+ cleanup:
146
+ virDomainStatsRecordListFree(tmpstats);
147
+ virObjectListFreeCount(vms, nvms);
148
+
149
+ return ret;
150
+}
151
152
/* Function Tables */
153
static virHypervisorDriver lxcHypervisorDriver = {
154
155
.nodeGetFreePages = lxcNodeGetFreePages, /* 1.2.6 */
156
.nodeAllocPages = lxcNodeAllocPages, /* 1.2.9 */
157
.domainHasManagedSaveImage = lxcDomainHasManagedSaveImage, /* 1.2.13 */
158
+ .connectGetAllDomainStats = lxcConnectGetAllDomainStats, /* 3.11.0 */
159
};
160
161
static virConnectDriver lxcConnectDriver = {
162