Skip to content

Instantly share code, notes, and snippets.

@tahmmee
Created January 6, 2015 23:03
Show Gist options
  • Save tahmmee/ca297dc337f2ea672e18 to your computer and use it in GitHub Desktop.
Save tahmmee/ca297dc337f2ea672e18 to your computer and use it in GitHub Desktop.
orilly
void rollback_after_deletes(){
TEST_INIT();
memleak_start();
int r;
int i, j, n=100;
int expected_doc_count = 0;
int rb_seqnum;
char keybuf[256], metabuf[256], bodybuf[256];
int val2;
fdb_file_handle *dbfile;
fdb_iterator *it;
fdb_kvs_handle *kv1, *mirror_kv1;
fdb_kvs_info info;
fdb_config fconfig = fdb_get_default_config();
fdb_kvs_config kvs_config = fdb_get_default_kvs_config();
fdb_doc **doc = alca(fdb_doc*, n);
fdb_doc *rdoc, *vdoc;
fdb_status status;
r = system(SHELL_DEL" dummy* > errorlog.txt");
(void)r;
fconfig.wal_threshold = 1024;
fconfig.flags = FDB_OPEN_FLAG_CREATE;
fconfig.compaction_threshold = 10;
fdb_open(&dbfile, "./dummy1", &fconfig);
fdb_kvs_open(dbfile, &kv1, "kv1", &kvs_config);
//BUG fdb_kvs_open(dbfile, &mirror_kv1, "mirror", &kvs_config);
fdb_kvs_open(dbfile, &mirror_kv1, NULL, &kvs_config);
// set n docs
for(i=0;i<n;++i){
sprintf(keybuf, "key%d", i);
fdb_doc_create(&doc[i], (void*)keybuf, strlen(keybuf),
NULL, 0, NULL, 0);
fdb_set(kv1, doc[i]);
fdb_set(mirror_kv1, doc[i]);
}
// commit
fdb_commit(dbfile, FDB_COMMIT_NORMAL);
// delete subset of recently loaded docs
for(i=0;i<n/2;i++){
fdb_del(kv1, doc[i]);
fdb_del(mirror_kv1, doc[i]);
}
// commit
fdb_commit(dbfile, FDB_COMMIT_NORMAL);
// save seqnum
rb_seqnum = info.last_seqnum;
for (j=0;j<10;++j){
// load some more docs but stop mirroring
for(i=0;i<n;++i){
sprintf(keybuf, "key%d", n+i);
fdb_doc_create(&doc[i], (void*)keybuf, strlen(keybuf),
NULL, 0, NULL, 0);
fdb_set(kv1, doc[i]);
if( n%2 == 0){
fdb_del(kv1, doc[i]);
}
}
// commit
fdb_commit(dbfile, FDB_COMMIT_NORMAL);
}
// rollback
status = fdb_rollback(&kv1, rb_seqnum);
TEST_CHK(status == FDB_RESULT_SUCCESS);
fdb_get_kvs_info(kv1, &info);
TEST_CHK(info.doc_count == expected_doc_count);
fdb_get_kvs_info(mirror_kv1, &info);
TEST_CHK(info.doc_count == expected_doc_count);
status = fdb_iterator_sequence_init(mirror_kv1, &it, 0, 0, FDB_ITR_NONE);
TEST_CHK(status == FDB_RESULT_SUCCESS);
do {
status = fdb_iterator_get_metaonly(it, &rdoc);
TEST_CHK(status == FDB_RESULT_SUCCESS);
fdb_doc_create(&vdoc, rdoc->key, rdoc->keylen,
rdoc->meta, rdoc->metalen,
rdoc->body, rdoc->bodylen);
status = fdb_get(kv1, vdoc);
TEST_CHK(rdoc->deleted == vdoc->deleted);
if (rdoc->deleted){
TEST_CHK(status == FDB_RESULT_KEY_NOT_FOUND);
} else {
TEST_CHK(status == FDB_RESULT_SUCCESS);
}
} while (fdb_iterator_next(it) != FDB_RESULT_ITERATOR_FAIL);
//TODO investigate rollback with manual wal flush jawn be failin
// TODO: segfaults on use of kvname
fdb_kvs_close(kv1);
fdb_close(dbfile);
fdb_shutdown();
memleak_end();
TEST_RESULT("iterator set del docs");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment