tools: rados put /dev/null should write() and not create()

In the rados.cc special case to handle put an empty objects, use
write_full() instead of create().

A special case was introduced 6843a0b81f
to create() an object if the rados put file is empty. Prior to this fix
an attempt to rados put an empty file was a noop. The problem with this
fix is that it is not idempotent. rados put an empty file twice would
fail the second time and rados put a file with one byte would succeed as
expected.

Signed-off-by: Loic Dachary <loic-201408@dachary.org>
This commit is contained in:
Loic Dachary 2014-10-02 09:23:55 +02:00
parent b038969b7c
commit 50e80407f3

View File

@ -431,10 +431,9 @@ static int do_put(IoCtx& io_ctx, const char *objname, const char *infile, int op
goto out;
}
if (count == 0) {
if (!offset) {
ret = io_ctx.create(oid, true);
if (!offset) { // in case we have to create an empty object
ret = io_ctx.write_full(oid, indata); // indata is empty
if (ret < 0) {
cerr << "WARNING: could not create object: " << oid << std::endl;
goto out;
}
}