We use pg_stat_t information to determine pg create targeting.
Fixes: #7481
Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
librados c api for object operations and a few bug fixes
Reviewed-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Loic Dachary <loic@dachary.org>
Reviewed-by: Sage Weil <sage.weil@inktank.com>
This is simpler than checking actingbackfill
since it may not yet be filled in.
Fixes: #7470
Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
Both acting_up_affected and start_peering_interval need
to consider primary changes as well as acting/up changes.
Fixes: #7469
Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
A new option to the radosgw-admin gc list command that dumps *all* gc
entries, and not just the expired ones. This is useful for debugging.
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
Define a new manifest structure. The idea is that the manifest defines a
set of rules for structuring the object parts. There are a few terms to
note:
- head: the head part of the object, which is the part that contains
the first chunk of data. An object might not have a head (as in the
case of multipart-part objects.
- stripe: data portion of a single rgw object that resides on a single
rados object.
- part: a collection of stripes that make a contiguous part of an
object. A regular object will only have one part (although might have
many stripes), a multipart object might have many parts. Each part
has a fixed stripe size, although the last stripe of a part might
be smaller than that. Consecutive parts may be merged if their stripe
value is the same.
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
Now that return values are actually set by the osd and client, fix up
the tests that were checking the old behavior.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
ctx->modify no longer implies that the operation is a write,
if it ever did. These days op->may_write() is checked reliably
on the OSD, so just use that instead.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Since the vector of OSDOps used by the reply is the same
as the one processed by do_osd_ops() now, any output data
needs to be cleared for writes. To be compatible with current behavior,
allow writes that aren't applying anything or have failed to return data
still.
Add a new parameter to the MOSDOpReply constructor to determine
whether the output data should be cleared. Clear it for successful
writes, and remove a redundant result < 0 -> result > 0 check in the
process. This was caught by ceph_test_cls_hello and its
writes_dont_return_data method.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
This takes care of things that can fail before transaction is
executed, like omap comparison. Getting individual rvals from a
transaction requires more refactoring, so I'm leaving it for a later
cleanup.
Fixes: #6483
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
There's no need to copy it, and if we refer to the same vector from
the original MOSDOp, we can modify rvals for individual ops, since the
MOSDOp ops vector is copied to the MOSDOpReply when it is constructed.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Reading past the end of a pointer returned by string.data() in c++98
is undefined. While we're fixing this, also allow comparison of xattrs
containing null bytes.
Fixes: #7250
Backport: dumpling
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
This covers the many recent changes leading up to the firefly release,
including the c object operations api.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Create an iterator type similar to XattrIter for returning results.
It just wraps the std::map to preserve sorting.
When getting omap keys or values, use an extra callback to set up the
iterator, and default optional parameters to the empty string.
Since it's hard to test read or write omap ops in isolation, combine
them all in the c read ops test case.
One difference between this and the c++ api is that omap_cmp only
allows one assertion per sub-op, for simplicity of the
interface. Multiple omap_cmp operations can still be added to the same
op to get the same effect.
Fixes: #7194
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Only implement string xattr comparison by since integer xattr
comparison assumes ceph-encoded integers in little-endian 64 bit
format, which should not be exposed to librados users.
Add an extra callback for getxattr so that we can initialize the
iterator.
Fixes: #7193
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
The librados C api needs to do extra things like converting c++ data
structures or setting lengths, but some objecter operations already
have out_handlers that librados shouldn't override.
Add a method that chains contexts together by using a new context that
calls both the original and the newly added one.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Add two versions: one that allocates a buffer of the appropriate
length for the user, but relies on the user to free it, and one that
uses a user-supplied buffer but may fail if it is too short.
Reuse the bufferlist -> buffer conversion context added for reads into
the user supplied buffer.
The librados-allocated buffer can be handled just like librados
allocated buffers used by the various command functions, so just reuse
do_out_buffer() for them.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Do the usual bufferlist to buffer conversion in a callback from the
objecter before the librados user gets called.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
The c api will need this to be able to set the output buffer length
and potentially copy from bufferlist to buffer.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Nothing special needed here, just copying the input buffer and passing
things through. Don't allow output data since it's not usually
available for writes and unreliable when it is.
Fixes: #7195
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Move flag validation to a static function so it can be shared with the
c++ api. Refer to the new C constants from the c++ api so that it's
easy to keep them in sync.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
The c++ api did not include these in the sync versions of the calls,
so add a flags argument to the IoCtxImpl functions for those, with
default arguments to avoid changing the many many callers.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
This constant was just added in the public header to match the
operations in rados.h, and was not included in a stable release yet.
NOP is misleading, since it's actually uninterpreted anywhere, and
using it would always return EIO from the OSD. It's not particularly
useful, so just remove it. Adding a cmpxattr with FAIL_OK is
equivalent.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
The doxygen end section of watch notify was accidentally moved when
these were added, so fix that at the same time.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
These tests can either use the standard RadosTest, with one pool, or a
new test case with two pools.
The new test case has to copy a couple lines in static methods
(working around lack of virtual static methods is more complex than
it's worth here), but the rest is straight forward. Rename
base_pool_name and base_ioctx to pool_name and ioctx to match the
member variables of the parent class RadosTest.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Split these into two categories, self-managed and pool snapshots,
since they are mutually exclusive for a single pool. Remove snapshots
and objects at the end of tests, regardless of pass/fail, so the same
pool can be reused.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
These tests don't have any special requirements on their ioctx and
pools, so they can also run much faster by using different namespaces
per test instead of new pools. For the few tests that do depend on
namespace, reset the ioctx to the default namespace.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
This mirrors the c++ version, connect_cluster_pp(), and removes the
same code from create_one_pool().
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Using a test case allows us to remove a boatload of boilerplate code
in all the tests, and focus them more on what they're actually
testing.
Create one for C tests, and one for C++ tests, with the same
functionality:
- create a pool when the test case starts
- between individual tests, create an ioctx and set its namespace uniquely
- delete objects from the default namespace during individual test teardown
- delete the pool only when the whole test case is finished
In gtest, a test case is the whole set of tests declared as part of
the same class using TEST_F(). Many tests create and delete individual
pools, but this is unnecessary for independent operation in most
cases, since we can use namespaces for that now. Since pool creation
and deletion dominates test run time, using these test cases makes
running many of the tests much faster.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
This way it doesn't have to be compiled many times, and it's easier
to add new general functionality to new files without adding those
.cc files to every test program.
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Just before sending an op, prepare_mutate_op() is called, creating a
new Op. prepare_read_op() already copied over all the out-params
correctly, but for write operations the individual op return value
pointers were not copied, so they would not be filled in. With this
fixed, librados users can get the per-op return codes again.
Partially fixes: #6483
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>