Skip to content

Commit ac3bd66

Browse files
authored
feat: add support for rocksdb (#31)
* add basic support for rocksdb * add basic get/put operation * Add support for the rocksdb * commit changes to binding * work on feedback
1 parent b11a5e8 commit ac3bd66

File tree

9 files changed

+666
-1
lines changed

9 files changed

+666
-1
lines changed

.vscode/settings.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"cSpell.words": [
3+
"leveldb",
4+
"rocksdb",
5+
"writebatch"
6+
]
7+
}

bench/rocksdb.bench.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import {describe, bench, beforeAll, afterAll} from "@chainsafe/benchmark";
2+
import * as fs from "node:fs";
3+
import * as rocksdb from "../src/rocksdb.ts";
4+
import { intToBytes } from "../src/bytes.ts";
5+
6+
describe("rocksdb", () => {
7+
let dbPath: string;
8+
let db: rocksdb.DB;
9+
beforeAll(() => {
10+
dbPath = fs.mkdtempSync("db");
11+
db = rocksdb.dbOpen(dbPath, {create_if_missing: true});
12+
});
13+
afterAll(() => {
14+
rocksdb.dbClose(db);
15+
fs.rmSync(dbPath, {recursive: true, force: true});
16+
});
17+
18+
19+
for (const n of [1, 10, 100, 1000, 10000]) {
20+
bench({
21+
id: `set ${n} entries`,
22+
beforeEach: () => new Uint8Array(1000),
23+
fn: (val) => {
24+
for (let i = 0; i < n; i++) {
25+
rocksdb.dbPut(db, intToBytes(i, 4, "le"), val);
26+
}
27+
},
28+
});
29+
30+
bench({
31+
id: `batch set ${n} entries`,
32+
beforeEach: () => new Uint8Array(1000),
33+
fn: (val) => {
34+
const batch = [];
35+
for (let i = 0; i < n; i++) {
36+
batch.push({key: intToBytes(i, 4, "le"), value: val});
37+
}
38+
rocksdb.dbBatchPut(db, batch);
39+
},
40+
});
41+
42+
bench({
43+
id: `get ${n} entries`,
44+
before: () => {
45+
const val = new Uint8Array(1000);
46+
const batch = [];
47+
for (let i = 0; i < n; i++) {
48+
batch.push({key: intToBytes(i, 4, "le"), value: val});
49+
}
50+
rocksdb.dbBatchPut(db, batch);
51+
},
52+
fn: () => {
53+
for (let i = 0; i < n; i++) {
54+
rocksdb.dbGet(db, intToBytes(i, 4, "le"));
55+
}
56+
},
57+
});
58+
59+
bench({
60+
id: `iterate ${n} entries`,
61+
before: () => {
62+
const val = new Uint8Array(1000);
63+
const batch = [];
64+
for (let i = 0; i < n; i++) {
65+
batch.push({key: intToBytes(i, 4, "le"), value: val});
66+
}
67+
rocksdb.dbBatchPut(db, batch);
68+
},
69+
fn: () => {
70+
const iter = rocksdb.dbIterator(db);
71+
rocksdb.iteratorSeekToFirst(iter);
72+
for (let i = 0; i < n; i++) {
73+
rocksdb.iteratorKey(iter);
74+
rocksdb.iteratorNext(iter);
75+
}
76+
rocksdb.iteratorDestroy(iter);
77+
},
78+
});
79+
}
80+
});

build.zig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ pub fn build(b: *std.Build) void {
2121
.target = target,
2222
});
2323

24+
const dep_rocksdb = b.dependency("rocksdb", .{
25+
.optimize = optimize,
26+
.target = target,
27+
});
28+
2429
const dep_snappy = b.dependency("snappy", .{
2530
.optimize = optimize,
2631
.target = target,
@@ -75,6 +80,7 @@ pub fn build(b: *std.Build) void {
7580
module_lodestar_z_bun.addImport("hashtree", dep_hashtree.module("hashtree"));
7681
module_lodestar_z_bun.addImport("lmdb", dep_lmdb.module("lmdb"));
7782
module_lodestar_z_bun.addImport("leveldb", dep_leveldb.module("leveldb"));
83+
module_lodestar_z_bun.addImport("rocksdb", dep_rocksdb.module("rocksdb"));
7884
module_lodestar_z_bun.addImport("snappy", dep_snappy.module("snappy"));
7985
module_lodestar_z_bun.addImport("state_transition", dep_state_transition.module("state_transition"));
8086
module_lodestar_z_bun.addImport("ssz:persistent_merkle_tree", dep_ssz.module("persistent_merkle_tree"));

build.zig.zon

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
.url = "git+https://github.com/chainsafe/state-transition-z#22cd4532933de1cd2d0df299e52e6bc582e5a1c0",
3131
.hash = "state_transition_z-0.0.0-BO5n4AetCADaGuua8Bx77ZefJhonyr7dma8bU1kVCz8-",
3232
},
33+
.rocksdb = .{
34+
.url = "git+https://github.com/chainsafe/rocksdb.zig#52f1b3981fd091aba5d6f55531219570b9e88a05",
35+
.hash = "rocksdb-0.1.0-HUNo2UGpAABHfkGiOryeHpo4xcDogOUzEndZfwBgsZKC",
36+
},
3337
},
3438
.paths = .{ "build.zig", "build.zig.zon", "zig" },
3539
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"exports": "./src/index.ts",
99
"scripts": {
1010
"bench:files": "bun node_modules/.bin/benchmark",
11-
"bench": "bun run bench:files bench/bytes.bench.ts",
11+
"bench": "bun run bench:files",
1212
"check": "tsc --noEmit",
1313
"generate": "bun node_modules/.bin/bun-ffi-z generate-binding"
1414
},

src/binding.ts

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,178 @@ const fns = {
741741
],
742742
"returns": "u32"
743743
},
744+
"rocksdb_get_len_ptr": {
745+
"args": [],
746+
"returns": "ptr"
747+
},
748+
"rocksdb_get_err_ptr": {
749+
"args": [],
750+
"returns": "ptr"
751+
},
752+
"rocksdb_free_": {
753+
"args": [
754+
"u64"
755+
],
756+
"returns": "void"
757+
},
758+
"rocksdb_db_open": {
759+
"args": [
760+
"ptr",
761+
"bool",
762+
"bool",
763+
"bool",
764+
"u32",
765+
"i32"
766+
],
767+
"returns": "ptr"
768+
},
769+
"rocksdb_db_close": {
770+
"args": [
771+
"u64"
772+
],
773+
"returns": "void"
774+
},
775+
"rocksdb_db_destroy": {
776+
"args": [
777+
"ptr"
778+
],
779+
"returns": "i32"
780+
},
781+
"rocksdb_db_put": {
782+
"args": [
783+
"u64",
784+
"ptr",
785+
"u32",
786+
"ptr",
787+
"u32"
788+
],
789+
"returns": "i32"
790+
},
791+
"rocksdb_db_get": {
792+
"args": [
793+
"u64",
794+
"ptr",
795+
"u32"
796+
],
797+
"returns": "ptr"
798+
},
799+
"rocksdb_db_delete": {
800+
"args": [
801+
"u64",
802+
"ptr",
803+
"u32"
804+
],
805+
"returns": "i32"
806+
},
807+
"rocksdb_writebatch_create_": {
808+
"args": [],
809+
"returns": "u64"
810+
},
811+
"rocksdb_writebatch_destroy_": {
812+
"args": [
813+
"u64"
814+
],
815+
"returns": "void"
816+
},
817+
"rocksdb_writebatch_clear_": {
818+
"args": [
819+
"u64"
820+
],
821+
"returns": "void"
822+
},
823+
"rocksdb_writebatch_put_": {
824+
"args": [
825+
"u64",
826+
"ptr",
827+
"u32",
828+
"ptr",
829+
"u32"
830+
],
831+
"returns": "void"
832+
},
833+
"rocksdb_writebatch_delete_": {
834+
"args": [
835+
"u64",
836+
"ptr",
837+
"u32"
838+
],
839+
"returns": "void"
840+
},
841+
"rocksdb_db_write": {
842+
"args": [
843+
"u64",
844+
"u64"
845+
],
846+
"returns": "i32"
847+
},
848+
"rocksdb_db_create_iterator": {
849+
"args": [
850+
"u64"
851+
],
852+
"returns": "ptr"
853+
},
854+
"rocksdb_iterator_destroy": {
855+
"args": [
856+
"u64"
857+
],
858+
"returns": "void"
859+
},
860+
"rocksdb_iterator_valid": {
861+
"args": [
862+
"u64"
863+
],
864+
"returns": "bool"
865+
},
866+
"rocksdb_iterator_seek_to_first": {
867+
"args": [
868+
"u64"
869+
],
870+
"returns": "void"
871+
},
872+
"rocksdb_iterator_seek_to_last": {
873+
"args": [
874+
"u64"
875+
],
876+
"returns": "void"
877+
},
878+
"rocksdb_iterator_seek": {
879+
"args": [
880+
"u64",
881+
"ptr",
882+
"u32"
883+
],
884+
"returns": "void"
885+
},
886+
"rocksdb_iterator_next": {
887+
"args": [
888+
"u64"
889+
],
890+
"returns": "void"
891+
},
892+
"rocksdb_iterator_prev": {
893+
"args": [
894+
"u64"
895+
],
896+
"returns": "void"
897+
},
898+
"rocksdb_iterator_key": {
899+
"args": [
900+
"u64"
901+
],
902+
"returns": "ptr"
903+
},
904+
"rocksdb_iterator_value": {
905+
"args": [
906+
"u64"
907+
],
908+
"returns": "ptr"
909+
},
910+
"rocksdb_iterator_get_error": {
911+
"args": [
912+
"u64"
913+
],
914+
"returns": "i32"
915+
},
744916
"snappy_get_err_ptr": {
745917
"args": [],
746918
"returns": "ptr"

0 commit comments

Comments
 (0)