#include <rados/librados.h>
+#define DEBUG_RADOS 0
+
+#define DPRINTF(fmt, ...)\
+ do { if (DEBUG_RADOS) { printf("debug: " fmt, ## __VA_ARGS__); } } while (0)
+
MODULE = PVE::RADOS PACKAGE = PVE::RADOS
-rados_t
-pve_rados_create()
-PROTOTYPE:
+rados_t
+pve_rados_create(user)
+SV *user
+PROTOTYPE: $
CODE:
-{
- rados_t clu = NULL;
- int ret = rados_create(&clu, NULL);
-
+{
+ char *u = NULL;
+ rados_t clu = NULL;
+
+ if (SvOK(user)) {
+ u = SvPV_nolen(user);
+ }
+
+ int ret = rados_create(&clu, u);
+
if (ret == 0)
RETVAL = clu;
else {
- warn("rados_create failed (ret=%d)\n", ret);
+ die("rados_create failed - %s\n", strerror(-ret));
RETVAL = NULL;
}
}
OUTPUT: RETVAL
void
-pve_rados_conf_set(cluster, key, value)
+pve_rados_conf_set(cluster, key, value)
rados_t cluster
char *key
char *value
PROTOTYPE: $$$
CODE:
{
+ DPRINTF("pve_rados_conf_set %s = %s\n", key, value);
+
int res = rados_conf_set(cluster, key, value);
- if (res < 0) {
+ if (res < 0) {
die("rados_conf_set failed - %s\n", strerror(-res));
}
}
+void
+pve_rados_conf_read_file(cluster, path)
+rados_t cluster
+SV *path
+PROTOTYPE: $$
+CODE:
+{
+ char *p = NULL;
+
+ if (SvOK(path)) {
+ p = SvPV_nolen(path);
+ }
+
+ DPRINTF("pve_rados_conf_read_file %s\n", p);
+ int res = rados_conf_read_file(cluster, p);
+ if (res < 0) {
+ die("rados_conf_read_file failed - %s\n", strerror(-res));
+ }
+}
void
-pve_rados_connect(cluster)
+pve_rados_connect(cluster)
rados_t cluster
PROTOTYPE: $
CODE:
{
- rados_conf_read_file(cluster, NULL);
-
+ DPRINTF("pve_rados_connect\n");
+
int res = rados_connect(cluster);
if (res < 0) {
die("rados_connect failed - %s\n", strerror(-res));
}
void
-pve_rados_shutdown(cluster)
+pve_rados_shutdown(cluster)
rados_t cluster
PROTOTYPE: $
CODE:
{
+ DPRINTF("pve_rados_shutdown");
rados_shutdown(cluster);
}
-SV *
-pve_rados_mon_command(cluster, cmds)
+HV *
+pve_rados_mon_command(cluster, cmds)
rados_t cluster
AV *cmds
PROTOTYPE: $$
die("too many arguments");
}
cmd[cmdlen] = SvPV_nolen(arg);
+ DPRINTF("pve_rados_mon_command%zd %s\n", cmdlen, cmd[cmdlen]);
cmdlen++;
- }
+ }
- int ret = rados_mon_command(cluster, cmd, cmdlen,
- NULL, 0,
- &outbuf, &outbuflen,
- &outs, &outslen);
+ int ret = rados_mon_command(
+ cluster,
+ cmd,
+ cmdlen,
+ NULL,
+ 0,
+ &outbuf,
+ &outbuflen,
+ &outs,
+ &outslen
+ );
- if (ret < 0) {
- die("mon_command failed - %s\n", outs);
- rados_buffer_free(outs);
- }
-
- RETVAL = newSVpv(outbuf, outbuflen);
+ HV * rh = (HV *)sv_2mortal((SV *)newHV());
+
+ (void)hv_store(rh, "return_code", 11, newSViv(ret), 0);
+ (void)hv_store(rh, "status_message", 14, newSVpv(outs, outslen), 0);
+ (void)hv_store(rh, "data", 4, newSVpv(outbuf, outbuflen), 0);
+ RETVAL = rh;
rados_buffer_free(outbuf);
+ rados_buffer_free(outs);
}
OUTPUT: RETVAL
-HV *
-pve_rados_cluster_stat(cluster)
+HV *
+pve_rados_cluster_stat(cluster)
rados_t cluster
PROTOTYPE: $
CODE:
{
struct rados_cluster_stat_t result;
+
+ DPRINTF("pve_rados_cluster_stat");
+
int ret = rados_cluster_stat(cluster, &result);
-
+
if(ret != 0) {
warn("rados_cluster_stat failed (ret=%d)\n", ret);
XSRETURN_UNDEF;
}
HV * rh = (HV *)sv_2mortal((SV *)newHV());
- SV **t;
- t = hv_store(rh, "kb", 2, newSViv(result.kb), 0);
- t = hv_store(rh, "kb_used", 7, newSViv(result.kb_used), 0);
- t = hv_store(rh, "kb_avail", 8, newSViv(result.kb_avail), 0);
- t = hv_store(rh, "num_objects", 11, newSViv(result.num_objects), 0);
+ (void)hv_store(rh, "kb", 2, newSViv(result.kb), 0);
+ (void)hv_store(rh, "kb_used", 7, newSViv(result.kb_used), 0);
+ (void)hv_store(rh, "kb_avail", 8, newSViv(result.kb_avail), 0);
+ (void)hv_store(rh, "num_objects", 11, newSViv(result.num_objects), 0);
RETVAL = rh;
}