All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joaquim Rocha <joaquim.rocha@cern.ch>
To: ceph-devel <ceph-devel@vger.kernel.org>
Subject: Possible bug when getting batched xattrs
Date: Fri, 17 Oct 2014 11:28:17 +0200	[thread overview]
Message-ID: <5440E131.2020501@cern.ch> (raw)

[-- Attachment #1: Type: text/plain, Size: 792 bytes --]

Hi,

I need to get a list of xattrs from one object (so I'm batching them in 
one ObjectReadOperation) but I don't know in advance if all of those 
xattrs exist.

I was expecting to figure out the ones that don't exist from the return 
code of each getxattr call but I have however noticed that as soon one 
nonexistent xattr is processed, its return code gets correctly set to 
-ENODATA but the remaining xattrs are never checked. And what is worse, 
the remaining getxattr op's return codes get assigned to 0.

I am attaching a small test case I've quickly written that proves the 
case. (I am using Ceph 0.80.5)

Could you confirm that this is not the intended behavior (that all read 
op's calls should be processed)?


Thank you in advance,

--
Joaquim Rocha
http://www.joaquimrocha.com

[-- Attachment #2: test-rados-xattrs.cpp --]
[-- Type: text/x-c++src, Size: 1533 bytes --]

#include <rados/librados.hpp>
#include <sstream>
#include <cstdio>
#include <sys/errno.h>

int main(int argc, char **argv)
{
  if (argc < 5)
  {
    fprintf(stdout, "Usage: %s CONFIGURATION_FILE POOL_NAME OBJ_NAME "
                    "ONE_EXISTING_XATTRIBUTE \n",
            argv[0]);

    return EINVAL;
  }

  librados::Rados rados;

  char *conf = argv[1];
  char *pool = argv[2];
  char *obj = argv[3];
  char *xattr = argv[4];

  rados.init(0);
  rados.conf_read_file(conf);
  rados.connect();

  librados::IoCtx ioctx;
  rados.ioctx_create(pool, ioctx);

  const size_t numXAttrs(5);
  librados::bufferlist buffs[numXAttrs];
  int xattrRets[numXAttrs];

  librados::ObjectReadOperation op;

  fprintf(stdout, "Ret codes before the op: \n");

  for (size_t i = 0; i < numXAttrs; i++)
  {
    xattrRets[i] = -1;
    fprintf(stdout, "  RET#%d: %d\n", i, xattrRets[i]);
  }

  fprintf(stdout, "\n--------\nData and ret codes after the op: \n");

  for (size_t i = 0; i < numXAttrs; i++)
  {
    std::stringstream stream;

    if (i == 0)
      stream << xattr;
    else
      stream << "nonexistent-xattr" << i;

    op.getxattr(stream.str().c_str(), &buffs[i], &xattrRets[i]);
  }

  ioctx.operate(obj, &op, 0);

  for (size_t i = 0; i < numXAttrs; i++)
  {
    librados::bufferlist *buff = &buffs[i];
    std::string value;

    if (buff->length() > 0)
      value = std::string(buff->c_str(), buff->length());

    fprintf(stdout, "  RET#%d: %s %d\n", i, value.c_str(), xattrRets[i]);
  }

  rados.shutdown();

  return 0;
}

             reply	other threads:[~2014-10-17  9:33 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-17  9:28 Joaquim Rocha [this message]
2014-10-17 11:01 ` Possible bug when getting batched xattrs Sebastien Ponce
2014-10-17 14:02 ` Sage Weil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5440E131.2020501@cern.ch \
    --to=joaquim.rocha@cern.ch \
    --cc=ceph-devel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.