У меня есть клиент Ceph Rados для node.js версии 12.4.0.
Я хочу скопировать часть одного объекта в другой. И есть
Метод написан для этой операции. Его имя clone_range, и оно использует функцию rados_clone_range из librados.
Код ошибки -95 возвращается после задания параметров этой функции (rados_clone_range).
Что означает код ошибки -95, возвращаемый из rados_clone_range ???
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, сколько данных копировать
- @ возвращает 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