[libvirt] [PATCH v2] storage backend: Add sheepdog support
Eric Blake
eblake at redhat.com
Wed Jun 20 16:01:40 UTC 2012
On 06/14/2012 05:14 AM, Sebastian Wiedenroth wrote:
>
> This patch brings support to manage sheepdog pools and volumes to libvirt.
> It uses the "collie" command-line utility that comes with sheepdog for that.
>
Picking up where I left off yesterday...
> tests/Makefile.am | 13 ++
> tests/storagebackendsheepdogtest.c | 196 ++++++++++++++++
The built executable should be ignored in .gitignore. But thanks for
adding tests!
> +if test "$with_storage_sheepdog" = "yes" || test "$with_storage_sheepdog" = "check"; then
> + AC_PATH_PROG([COLLIE], [collie], [], [$PATH:/sbin:/usr/sbin])
> +
> + if test "$with_storage_sheepdog" = "yes" ; then
> + if test -z "$COLLIE" ; then AC_MSG_ERROR([We need collie for Sheepdog storage driver]) ; fi
I didn't mention this yesterday, but I find it easier to avoid one-liner
'if...fi' and instead use multiple lines - it's easier to see the
nesting if the fi always lines up with the if above it. Besides, that
also avoids going over 80 columns.
> + else
> + if test -z "$COLLIE" ; then with_storage_sheepdog=no ; fi
> +
> + if test "$with_storage_sheepdog" = "check" ; then with_storage_sheepdog=yes ; fi
> + fi
> +
> + if test "$with_storage_sheepdog" = "yes" ; then
> + AC_DEFINE_UNQUOTED([WITH_STORAGE_SHEEPDOG], 1, [whether Sheepdog backend for storage driver is enabled])
Another long line issue; autoconf lets you start arguments on a new line.
> +static int
> +virStorageBackendSheepdogDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED,
Now back to where I left off.
> + virStoragePoolObjPtr pool,
> + virStorageVolDefPtr vol,
> + unsigned int flags)
> +{
> +
> + virCheckFlags(0, -1);
> +
> + virCommandPtr cmd = virCommandNew(COLLIE);
> +
> + virCommandAddArgList(cmd, "vdi", "delete", vol->name, NULL);
Another instance where these two lines can be merged into one with
virCommandNewArgList. I won't point out any more.
> +int
> +virStorageBackendSheepdogParseVdiList(virStorageVolDefPtr vol,
> + char *output)
> +{
> + /* example output:
> + * s test 1 10 0 0 1336556634 7c2b25
> + * s test 2 10 0 0 1336557203 7c2b26
> + * = test 3 10 0 0 1336557216 7c2b27
> + */
It might also help to call out another comment describing the fields
represented in that output, as in:
type name id capacity allocation extra1 extra2
> +
> + /* skip name */
> + while (*p != '\0'
> + && (*p != ' ' || (*p == ' ' && (*(p - 1) == '\\'))))
> + ++p;
This won't work if "\\" is a valid escape for a trailing backslash as
the last byte in the name. If you are going to handle backslash escapes
as part of a name, you have to skip all backslash escapes rather than
just searching for the first space not preceded by a backslash.
> + VIR_FREE(vol->target.path);
> + if (virAsprintf(&vol->target.path, "sheepdog:%s", vol->name) == -1) {
> + virReportOOMError();
> + goto cleanup;
> + }
> +
> +
> +
> +cleanup:
Lots of whitespace between lines here.
> diff --git a/tests/storagebackendsheepdogtest.c b/tests/storagebackendsheepdogtest.c
> new file mode 100644
> index 0000000..a8f62a4
> --- /dev/null
> +++ b/tests/storagebackendsheepdogtest.c
> @@ -0,0 +1,196 @@
> +#include <config.h>
Missing a copyright notice. Yeah, we aren't all that great in the tests
directory (and I need to audit the entire source tree for improvements),
but that's no excuse for new additions.
> + output = strdup(test.output);
> + if(!output) {
> + goto cleanup;
> + }
Formatting: space after 'if'. Also, for this one-liner, {} can be omitted.
> +
> + ret = virStorageBackendSheepdogParseNodeInfo(pool, output);
> +
> + if (ret != test.expected_return)
> + goto cleanup;
> +
> + if (ret != 0) {
> + ret = 0;
> + goto cleanup;
> + }
Why are you quitting the test early but still reporting success? Oh, I
see, because you use ret for two orthogonal purposes (checking expected
parse results, and returning test results). I would have written:
if (virStorageBackendSheepdogParseNodeInfo(pool, output) !=
test.expected_return)
goto cleanup;
if (test.expected_return) {
ret = 0;
goto cleanup;
}
so that ret is only being used for test results.
> +
> + if (pool->capacity == test.expected_capacity
> + && pool->allocation == test.expected_allocation)
Style - libvirt prefers '&&' on the end of the first line, not the start
of the second line.
> +static int
> +test_vdi_list_parser(collie_test test, char *poolxml, char *volxml)
> +{
> + output = strdup(test.output);
> + if(!output) {
Style: space after 'if'.
> +++ b/tests/storagevolxml2xmlout/vol-sheepdog.xml
> @@ -0,0 +1,17 @@
> +<volume>
> + <name>test2</name>
> + <key>(null)</key>
Is this the sign of an accidental NULL pointer dereference which would
bite us on non-glibc platforms? Can we provide a non-NULL key instead?
Overall, I think my findings are relatively minor, but I would prefer if
you could polish up my findings and post a v3 to save me some time.
--
Eric Blake eblake at redhat.com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120620/4127b615/attachment-0001.sig>
More information about the libvir-list
mailing list