首页 > 解决方案 > rados_clone_range返回的-95错误码是什么意思?

问题描述

我有 node.js 版本 12.4.0 的 Ceph rados 客户端。

我想将一个对象的一部分复制到另一个对象。并且有一个为此操作编写的方法。它的名字是 clone_range,它使用了 librados 的 rados_clone_range 函数。

向此函数 (rados_clone_range) 提供参数后返回错误代码 -95。

rados_clone_range返回的-95错误码是什么意思???

库文件

 CEPH_RADOS_API int rados_clone_range(rados_ioctx_t io, const char       *dst,
                                           uint64_t dst_off, const char *src,
                                           uint64_t src_off, size_t len);

/* 有效地将一个对象的一部分复制到另一个对象 如果 OSD 上的底层文件系统支持它,这将是一个写时复制克隆。src 和 dest 对象必须在同一个 pg 中。为了确保这一点,io 上下文应该有一个定位键集(请参阅 rados_ioctx_locator_set_key())。

rados.cc

NAN_METHOD(Ioctx::clone_range) {
      if (info.Length() < 2 || !info[0]->IsString() || !info[1]->IsString()) {
        return Nan::ThrowError("Bad argument.");
      }

      Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(info.Holder());
      if ( !obj->require_created() ) {
        info.GetReturnValue().Set(Nan::Null());
        return;
      }``

      Nan::Utf8String dst(info[0]);
      Nan::Utf8String src(info[1]);
      uint64_t dst_off = info[2]->IsNumber() ? info[2]->IntegerValue(Nan::GetCurrentContext()).FromJust() : 0;
      uint64_t src_off = info[3]->IsNumber() ? info[3]->IntegerValue(Nan::GetCurrentContext()).FromJust() : 0;
      size_t size = info[4]->IsNumber() ? info[4]->Uint32Value(Nan::GetCurrentContext()).FromJust() : 1;

      int err = rados_clone_range(obj->ioctx, *dst, dst_off, *src, src_off, size);
      //0 on success
      //my err is -95


      info.GetReturnValue().Set(Nan::New<Number>(err));

    }

例子.js

var rados = require('./build/Release/rados');

 var cluster = new rados.Rados( "ceph", "client.admin", "/etc/ceph/ceph.conf");

console.log("RADOS - NEW " + cluster)
var err = cluster.connect();
if (err) {
    // On connection error
    console.log("Error " + err);
    throw err;
}

var ioctx = new rados.Ioctx(cluster, "testpool");


ioctx.write("dst_data", Buffer.from("1234567890ABCDE"));
ioctx.write("src_data", Buffer.from("12345CDE"));

console.log("\n" + "CLONE_RANGE = " + ioctx.clone_range("src_data", "dst_data"))          ///// output: -95

标签: node.jsrangeclonecephradosgw

解决方案


原始错误代码是(95) Operation not supported. 在返回之前,它会否定该值以避免一些混乱。

也如此处指定,它说EOPNOTSUPP(-95, "Operation not supported on transport endpoint")。它是 rados-java,但错误代码可能相同。


推荐阅读