Skip to content

Commit b1c150d

Browse files
committedDec 31, 2014
add state on rados and ioctx
1 parent b18212f commit b1c150d

File tree

3 files changed

+115
-2
lines changed

3 files changed

+115
-2
lines changed
 

‎example.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
var rados = require('./build/Release/rados');
22

3-
// EXEMPLE FILE
3+
// EXAMPLE FILE
44

55
//==================================
66
// Connect to cluster
@@ -79,7 +79,7 @@ ioctx.aio_flush_async(function (err) {
7979

8080
process.exit(code=0)
8181

82-
// OTHER EXEMPLES
82+
// OTHER EXAMPLES
8383

8484
// Read Sync file in chunks
8585
var file = "testfile";

‎rados.cc

+105
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,28 @@ void Ioctx::Init(Handle<Object> target) {
9090
NanNew<FunctionTemplate>(constructor)->GetFunction());
9191
}
9292

93+
bool Rados::verify_ioctx_required() {
94+
if ( this->state == 3 ) {
95+
return true;
96+
} else {
97+
NanThrowError("Cluster not connected");
98+
return false;
99+
}
100+
}
101+
102+
bool Ioctx::verify_required() {
103+
if ( this->rados->verify_ioctx_required() ) {
104+
if ( this->state == 1 ) {
105+
return true;
106+
} else {
107+
NanThrowError("Ioctx not initialized");
108+
return false;
109+
}
110+
} else {
111+
return false;
112+
}
113+
}
114+
93115

94116
NAN_METHOD(Rados::New) {
95117
NanScope();
@@ -110,9 +132,11 @@ NAN_METHOD(Rados::New) {
110132
if ( rados_create2(&obj->cluster, *cluster_name, *user_name, flags) != 0 ) {
111133
NanThrowError("create rados cluster failed");
112134
}
135+
obj->state = 1;
113136
if ( rados_conf_read_file(obj->cluster, *conffile) != 0 ) {
114137
NanThrowError("read conffile failed");
115138
}
139+
obj->state = 2;
116140

117141
obj->Wrap(args.This());
118142
NanReturnValue(args.This());
@@ -129,10 +153,15 @@ NAN_METHOD(Ioctx::New) {
129153

130154
Ioctx* obj = new Ioctx();
131155
Rados* cluster = ObjectWrap::Unwrap<Rados>(args[0]->ToObject());
156+
if ( !cluster->verify_ioctx_required() ) {
157+
NanReturnNull();
158+
}
132159
String::Utf8Value pool(args[1]);
133160
if ( rados_ioctx_create(cluster->cluster, *pool, &obj->ioctx) != 0 ) {
134161
NanThrowError("create Ioctx failed");
135162
}
163+
obj->rados = cluster;
164+
obj->state = 1;
136165

137166
obj->Wrap(args.This());
138167
NanReturnThis();
@@ -144,8 +173,17 @@ NAN_METHOD(Rados::connect) {
144173

145174
Rados* obj = ObjectWrap::Unwrap<Rados>(args.This());
146175

176+
if ( obj->state != 2 ) {
177+
NanThrowError("Cluster should be in configured state.");
178+
NanReturnNull();
179+
}
180+
147181
int err = rados_connect(obj->cluster);
148182

183+
if (err == 0) {
184+
obj->state = 3;
185+
}
186+
149187
NanReturnValue(NanNew<Number>(-err));
150188
}
151189

@@ -209,8 +247,12 @@ NAN_METHOD(Ioctx::destroy) {
209247
NanScope();
210248

211249
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
250+
if ( !obj->verify_required() ) {
251+
NanReturnNull();
252+
}
212253

213254
rados_ioctx_destroy(obj->ioctx);
255+
obj->state = 0;
214256

215257
NanReturnNull();
216258
}
@@ -225,6 +267,9 @@ NAN_METHOD(Ioctx::snap_create) {
225267
}
226268

227269
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
270+
if ( !obj->verify_required() ) {
271+
NanReturnNull();
272+
}
228273
String::Utf8Value snapname(args[0]);
229274

230275
int err = rados_ioctx_snap_create(obj->ioctx, *snapname);
@@ -242,6 +287,9 @@ NAN_METHOD(Ioctx::snap_remove) {
242287
}
243288

244289
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
290+
if ( !obj->verify_required() ) {
291+
NanReturnNull();
292+
}
245293
String::Utf8Value snapname(args[0]);
246294

247295
int err = rados_ioctx_snap_remove(obj->ioctx, *snapname);
@@ -260,6 +308,9 @@ NAN_METHOD(Ioctx::snap_rollback) {
260308
}
261309

262310
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
311+
if ( !obj->verify_required() ) {
312+
NanReturnNull();
313+
}
263314
String::Utf8Value oid(args[0]);
264315
String::Utf8Value snapname(args[1]);
265316

@@ -278,6 +329,9 @@ NAN_METHOD(Ioctx::read) {
278329
}
279330

280331
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
332+
if ( !obj->verify_required() ) {
333+
NanReturnNull();
334+
}
281335
String::Utf8Value oid(args[0]);
282336
size_t size;
283337
if (args[1]->IsNumber()) {
@@ -312,6 +366,9 @@ NAN_METHOD(Ioctx::write) {
312366
}
313367

314368
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
369+
if ( !obj->verify_required() ) {
370+
NanReturnNull();
371+
}
315372
String::Utf8Value oid(args[0]);
316373
char* buffer = Buffer::Data(args[1]);
317374
size_t size = args[2]->IsNumber() ? args[2]->Uint32Value() : Buffer::Length(args[1]);
@@ -333,6 +390,9 @@ NAN_METHOD(Ioctx::write_full) {
333390
}
334391

335392
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
393+
if ( !obj->verify_required() ) {
394+
NanReturnNull();
395+
}
336396
String::Utf8Value oid(args[0]);
337397
char* buffer = Buffer::Data(args[1]);
338398
size_t size = args[2]->IsNumber() ? args[2]->Uint32Value() : Buffer::Length(args[1]);
@@ -356,6 +416,9 @@ NAN_METHOD(Ioctx::clone_range) {
356416
}
357417

358418
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
419+
if ( !obj->verify_required() ) {
420+
NanReturnNull();
421+
}
359422
String::Utf8Value dst(args[0]);
360423
uint64_t dst_off = args[1]->Uint32Value();
361424
String::Utf8Value src(args[2]);
@@ -378,6 +441,9 @@ NAN_METHOD(Ioctx::append) {
378441
}
379442

380443
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
444+
if ( !obj->verify_required() ) {
445+
NanReturnNull();
446+
}
381447
String::Utf8Value oid(args[0]);
382448
char* buffer = Buffer::Data(args[1]);
383449
size_t size = args[2]->IsNumber() ? args[2]->Uint32Value() : Buffer::Length(args[1]);
@@ -397,6 +463,9 @@ NAN_METHOD(Ioctx::remove) {
397463
}
398464

399465
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
466+
if ( !obj->verify_required() ) {
467+
NanReturnNull();
468+
}
400469
String::Utf8Value oid(args[0]);
401470

402471
int err = rados_remove(obj->ioctx, *oid);
@@ -415,6 +484,9 @@ NAN_METHOD(Ioctx::trunc) {
415484
}
416485

417486
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
487+
if ( !obj->verify_required() ) {
488+
NanReturnNull();
489+
}
418490
String::Utf8Value oid(args[0]);
419491
size_t size = args[1]->Uint32Value();
420492

@@ -434,6 +506,9 @@ NAN_METHOD(Ioctx::getxattr) {
434506
}
435507

436508
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
509+
if ( !obj->verify_required() ) {
510+
NanReturnNull();
511+
}
437512
String::Utf8Value oid(args[0]);
438513
String::Utf8Value name(args[1]);
439514
size_t size;
@@ -471,6 +546,9 @@ NAN_METHOD(Ioctx::setxattr) {
471546
}
472547

473548
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
549+
if ( !obj->verify_required() ) {
550+
NanReturnNull();
551+
}
474552
String::Utf8Value oid(args[0]);
475553
String::Utf8Value name(args[1]);
476554
String::Utf8Value buffer(args[2]);
@@ -492,6 +570,9 @@ NAN_METHOD(Ioctx::rmxattr) {
492570
}
493571

494572
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
573+
if ( !obj->verify_required() ) {
574+
NanReturnNull();
575+
}
495576
String::Utf8Value oid(args[0]);
496577
String::Utf8Value name(args[1]);
497578

@@ -510,6 +591,9 @@ NAN_METHOD(Ioctx::getxattrs) {
510591
}
511592

512593
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
594+
if ( !obj->verify_required() ) {
595+
NanReturnNull();
596+
}
513597
String::Utf8Value oid(args[0]);
514598
rados_xattrs_iter_t iter;
515599

@@ -548,6 +632,9 @@ NAN_METHOD(Ioctx::stat) {
548632
}
549633

550634
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
635+
if ( !obj->verify_required() ) {
636+
NanReturnNull();
637+
}
551638
String::Utf8Value oid(args[0]);
552639
uint64_t psize;
553640
time_t pmtime;
@@ -618,6 +705,9 @@ NAN_METHOD(Ioctx::aio_read) {
618705
}
619706

620707
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
708+
if ( !obj->verify_required() ) {
709+
NanReturnNull();
710+
}
621711
String::Utf8Value oid(args[0]);
622712
size_t size;
623713
if (args[1]->IsNumber()) {
@@ -676,6 +766,9 @@ NAN_METHOD(Ioctx::aio_write) {
676766
}
677767

678768
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
769+
if ( !obj->verify_required() ) {
770+
NanReturnNull();
771+
}
679772
String::Utf8Value oid(args[0]);
680773
char* buffer = Buffer::Data(args[1]);
681774
size_t size = args[2]->IsNumber() ? args[2]->Uint32Value() : Buffer::Length(args[1]);
@@ -722,6 +815,9 @@ NAN_METHOD(Ioctx::aio_append) {
722815
}
723816

724817
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
818+
if ( !obj->verify_required() ) {
819+
NanReturnNull();
820+
}
725821
String::Utf8Value oid(args[0]);
726822
char* buffer = Buffer::Data(args[1]);
727823
size_t size = args[2]->IsNumber() ? args[2]->Uint32Value() : Buffer::Length(args[1]);
@@ -767,6 +863,9 @@ NAN_METHOD(Ioctx::aio_write_full) {
767863
}
768864

769865
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
866+
if ( !obj->verify_required() ) {
867+
NanReturnNull();
868+
}
770869
String::Utf8Value oid(args[0]);
771870
char* buffer = Buffer::Data(args[1]);
772871
size_t size = args[2]->IsNumber() ? args[2]->Uint32Value() : Buffer::Length(args[1]);
@@ -804,6 +903,9 @@ NAN_METHOD(Ioctx::aio_flush) {
804903
NanScope();
805904

806905
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
906+
if ( !obj->verify_required() ) {
907+
NanReturnNull();
908+
}
807909

808910
int err = rados_aio_flush(obj->ioctx);
809911

@@ -820,6 +922,9 @@ NAN_METHOD(Ioctx::aio_flush_async) {
820922
}
821923

822924
Ioctx* obj = ObjectWrap::Unwrap<Ioctx>(args.This());
925+
if ( !obj->verify_required() ) {
926+
NanReturnNull();
927+
}
823928

824929
AsyncData *asyncdata = new AsyncData;
825930
rados_completion_t *comp = new rados_completion_t;

‎rados.h

+8
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@ class Rados : public node::ObjectWrap {
1414
static void Init(v8::Handle<v8::Object> target);
1515
rados_t cluster;
1616

17+
bool verify_ioctx_required();
18+
1719
private:
1820
Rados();
1921
~Rados();
2022

23+
uint state; // 0:nonexistent, 1:created, 2:configured, 3:connected, 4:destroyed
24+
2125
static NAN_METHOD(New);
2226
static NAN_METHOD(connect);
2327
static NAN_METHOD(shutdown);
@@ -46,6 +50,10 @@ class Ioctx : public node::ObjectWrap {
4650
int err;
4751
rados_completion_t* comp;
4852
} AsyncData;
53+
54+
Rados* rados;
55+
uint state; // 0:nonexistent, 1:connected, 2:destroyed
56+
bool verify_required();
4957

5058
static void callback_complete(uv_work_t *req);
5159
static void wait_complete(uv_work_t *req);

0 commit comments

Comments
 (0)
Please sign in to comment.