从 rados_clone_range 返回的 -95 错误代码是什么意思?
What is the meaning of -95 error code that is returned from rados_clone_range?
我有 node.js 版本 12.4.0 的 Ceph rados 客户端。
我想将一个对象的一部分复制到另一个对象。还有一个
为此操作编写的方法。它的名字是clone_range,它使用librados的rados_clone_range函数。
错误代码 -95 returns 为该函数提供参数后 (rados_clone_range)。
从rados_clone_range返回的-95错误代码是什么意思???
librados.h
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())。
- @param io 克隆数据的上下文
- @param dst 目标对象的名称
- @param dst_off 目标对象内的偏移量(以字节为单位)
- @param src 源对象的名字
- @param src_off 源对象中的偏移量(以字节为单位)
- @param len 要复制多少数据
- @returns 成功时为 0,失败时为负错误代码
*/
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));
}
example.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
原来的错误代码是(95) Operation not supported
。在返回之前,它对该值取负以避免一些混淆。
也如指定的那样here,它表示EOPNOTSUPP(-95, "Operation not supported on transport endpoint")
。它是 rados-java 但错误代码可能相同。
我有 node.js 版本 12.4.0 的 Ceph rados 客户端。
我想将一个对象的一部分复制到另一个对象。还有一个 为此操作编写的方法。它的名字是clone_range,它使用librados的rados_clone_range函数。
错误代码 -95 returns 为该函数提供参数后 (rados_clone_range)。
从rados_clone_range返回的-95错误代码是什么意思???
librados.h
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())。
- @param io 克隆数据的上下文
- @param dst 目标对象的名称
- @param dst_off 目标对象内的偏移量(以字节为单位)
- @param src 源对象的名字
- @param src_off 源对象中的偏移量(以字节为单位)
- @param len 要复制多少数据
- @returns 成功时为 0,失败时为负错误代码 */
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));
}
example.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
原来的错误代码是(95) Operation not supported
。在返回之前,它对该值取负以避免一些混淆。
也如指定的那样here,它表示EOPNOTSUPP(-95, "Operation not supported on transport endpoint")
。它是 rados-java 但错误代码可能相同。