rocksdb-native 3.7.4 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CMakeLists.txt CHANGED
@@ -9,7 +9,7 @@ project(rocksdb_native C CXX)
9
9
 
10
10
  bare_target(target)
11
11
 
12
- fetch_package("github:holepunchto/librocksdb#46df5ef")
12
+ fetch_package("github:holepunchto/librocksdb#ac350df")
13
13
  fetch_package("github:holepunchto/libjstl#34a7894")
14
14
 
15
15
  add_bare_module(rocksdb_native_bare)
package/binding.cc CHANGED
@@ -23,6 +23,7 @@ using cb_on_iterator_read_t = js_function_t<
23
23
  std::optional<js_string_t>,
24
24
  std::vector<js_arraybuffer_t>,
25
25
  std::vector<js_arraybuffer_t>>;
26
+ using cb_on_compact_range_t = js_function_t<void, js_receiver_t, std::optional<js_string_t>>;
26
27
  }; // namespace
27
28
 
28
29
  struct rocksdb_native_column_family_t {
@@ -94,7 +95,7 @@ struct rocksdb_native_iterator_t {
94
95
  js_persistent_t<cb_on_iterator_close_t> on_close;
95
96
  js_persistent_t<cb_on_iterator_read_t> on_read;
96
97
 
97
- bool closing;
98
+ bool active;
98
99
  bool exiting;
99
100
 
100
101
  js_deferred_teardown_t *teardown;
@@ -138,6 +139,14 @@ struct rocksdb_native_snapshot_t {
138
139
  rocksdb_snapshot_t handle;
139
140
  };
140
141
 
142
+ struct rocksdb_native_compact_range_t {
143
+ rocksdb_compact_range_t handle;
144
+
145
+ js_env_t *env;
146
+ js_persistent_t<js_receiver_t> ctx;
147
+ js_persistent_t<cb_on_compact_range_t> on_compact_range;
148
+ };
149
+
141
150
  static void
142
151
  rocksdb_native__on_free(js_env_t *env, char *data) {
143
152
  free(data);
@@ -717,7 +726,7 @@ rocksdb_native_iterator_init(js_env_t *env) {
717
726
  assert(err == 0);
718
727
 
719
728
  req->env = env;
720
- req->closing = false;
729
+ req->active = false;
721
730
  req->exiting = false;
722
731
  req->handle.data = req;
723
732
 
@@ -757,6 +766,8 @@ rocksdb_native__on_iterator_close(rocksdb_iterator_t *handle, int status) {
757
766
 
758
767
  rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
759
768
 
769
+ req->active = false;
770
+
760
771
  js_env_t *env = req->env;
761
772
 
762
773
  js_deferred_teardown_t *teardown = req->teardown;
@@ -809,33 +820,38 @@ rocksdb_native__on_iterator_open(rocksdb_iterator_t *handle, int status) {
809
820
 
810
821
  rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
811
822
 
812
- if (req->exiting) return;
823
+ req->active = false;
813
824
 
814
- js_env_t *env = req->env;
825
+ if (req->exiting) {
826
+ err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
827
+ assert(err == 0);
828
+ } else {
829
+ js_env_t *env = req->env;
815
830
 
816
- js_handle_scope_t *scope;
817
- err = js_open_handle_scope(env, &scope);
818
- assert(err == 0);
831
+ js_handle_scope_t *scope;
832
+ err = js_open_handle_scope(env, &scope);
833
+ assert(err == 0);
819
834
 
820
- js_receiver_t ctx;
821
- err = js_get_reference_value(env, req->ctx, ctx);
822
- assert(err == 0);
835
+ js_receiver_t ctx;
836
+ err = js_get_reference_value(env, req->ctx, ctx);
837
+ assert(err == 0);
823
838
 
824
- cb_on_iterator_open_t cb;
825
- err = js_get_reference_value(env, req->on_open, cb);
826
- assert(err == 0);
839
+ cb_on_iterator_open_t cb;
840
+ err = js_get_reference_value(env, req->on_open, cb);
841
+ assert(err == 0);
827
842
 
828
- std::optional<js_string_t> error;
843
+ std::optional<js_string_t> error;
829
844
 
830
- if (req->handle.error) {
831
- err = js_create_string(env, req->handle.error, error.emplace());
832
- assert(err == 0);
833
- }
845
+ if (req->handle.error) {
846
+ err = js_create_string(env, req->handle.error, error.emplace());
847
+ assert(err == 0);
848
+ }
834
849
 
835
- js_call_function_with_checkpoint(env, cb, ctx, error);
850
+ js_call_function_with_checkpoint(env, cb, ctx, error);
836
851
 
837
- err = js_close_handle_scope(env, scope);
838
- assert(err == 0);
852
+ err = js_close_handle_scope(env, scope);
853
+ assert(err == 0);
854
+ }
839
855
  }
840
856
 
841
857
  static void
@@ -846,7 +862,7 @@ rocksdb_native__on_iterator_teardown(js_deferred_teardown_t *handle, void *data)
846
862
 
847
863
  req->exiting = true;
848
864
 
849
- if (req->closing) return;
865
+ if (req->active) return;
850
866
 
851
867
  err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
852
868
  assert(err == 0);
@@ -872,6 +888,8 @@ rocksdb_native_iterator_open(
872
888
  ) {
873
889
  int err;
874
890
 
891
+ req->active = true;
892
+
875
893
  rocksdb_range_t range;
876
894
 
877
895
  err = js_get_typedarray_info(env, gt, range.gt.data, range.gt.len);
@@ -920,7 +938,7 @@ static void
920
938
  rocksdb_native_iterator_close(js_env_t *env, js_arraybuffer_span_of_t<rocksdb_native_iterator_t, 1> req) {
921
939
  int err;
922
940
 
923
- req->closing = true;
941
+ req->active = true;
924
942
 
925
943
  err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
926
944
  assert(err == 0);
@@ -944,6 +962,8 @@ rocksdb_native__on_iterator_read(rocksdb_iterator_t *handle, int status) {
944
962
 
945
963
  rocksdb_native_iterator_t *req = (rocksdb_native_iterator_t *) handle->data;
946
964
 
965
+ req->active = false;
966
+
947
967
  rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
948
968
 
949
969
  size_t len = req->handle.len;
@@ -958,6 +978,9 @@ rocksdb_native__on_iterator_read(rocksdb_iterator_t *handle, int status) {
958
978
  rocksdb_slice_destroy(&req->values[i]);
959
979
  }
960
980
  }
981
+
982
+ err = rocksdb_iterator_close(&req->handle, rocksdb_native__on_iterator_close);
983
+ assert(err == 0);
961
984
  } else {
962
985
  js_env_t *env = req->env;
963
986
 
@@ -1019,6 +1042,8 @@ rocksdb_native_iterator_read(
1019
1042
  ) {
1020
1043
  int err;
1021
1044
 
1045
+ req->active = true;
1046
+
1022
1047
  err = rocksdb_iterator_read(&req->handle, req->keys, req->values, capacity, rocksdb_native__on_iterator_read);
1023
1048
  assert(err == 0);
1024
1049
  }
@@ -1498,6 +1523,98 @@ rocksdb_native_snapshot_destroy(js_env_t *env, js_arraybuffer_span_of_t<rocksdb_
1498
1523
  rocksdb_snapshot_destroy(&snapshot->handle);
1499
1524
  }
1500
1525
 
1526
+ static void
1527
+ rocksdb_native__on_compact_range(rocksdb_compact_range_t *handle, int status) {
1528
+ int err;
1529
+
1530
+ assert(status == 0);
1531
+
1532
+ rocksdb_native_compact_range_t *req = (rocksdb_native_compact_range_t *) handle->data;
1533
+
1534
+ rocksdb_native_t *db = (rocksdb_native_t *) req->handle.req.db;
1535
+
1536
+ js_env_t *env = req->env;
1537
+
1538
+ if (db->exiting) {
1539
+ req->on_compact_range.reset();
1540
+ req->ctx.reset();
1541
+ } else {
1542
+ js_handle_scope_t *scope;
1543
+ err = js_open_handle_scope(env, &scope);
1544
+ assert(err == 0);
1545
+
1546
+ std::optional<js_string_t> error;
1547
+
1548
+ if (req->handle.error) {
1549
+ err = js_create_string(env, req->handle.error, error.emplace());
1550
+ assert(err == 0);
1551
+ }
1552
+
1553
+ js_receiver_t ctx;
1554
+ err = js_get_reference_value(env, req->ctx, ctx);
1555
+ assert(err == 0);
1556
+
1557
+ cb_on_compact_range_t cb;
1558
+ err = js_get_reference_value(env, req->on_compact_range, cb);
1559
+ assert(err == 0);
1560
+
1561
+ req->on_compact_range.reset();
1562
+ req->ctx.reset();
1563
+
1564
+ js_call_function_with_checkpoint(env, cb, ctx, error);
1565
+
1566
+ err = js_close_handle_scope(env, scope);
1567
+ assert(err == 0);
1568
+ }
1569
+ }
1570
+
1571
+ static js_arraybuffer_t
1572
+ rocksdb_native_compact_range(
1573
+ js_env_t *env,
1574
+ js_arraybuffer_span_of_t<rocksdb_native_t, 1> db,
1575
+ js_arraybuffer_span_of_t<rocksdb_native_column_family_t, 1> column_family,
1576
+ js_typedarray_t<> start,
1577
+ js_typedarray_t<> end,
1578
+ bool exclusive,
1579
+ js_receiver_t ctx,
1580
+ cb_on_compact_range_t on_compact_range
1581
+ ) {
1582
+ int err;
1583
+
1584
+ js_arraybuffer_t handle;
1585
+
1586
+ rocksdb_native_compact_range_t *req;
1587
+ err = js_create_arraybuffer(env, req, handle);
1588
+ assert(err == 0);
1589
+
1590
+ req->env = env;
1591
+ req->handle.data = (void *) req;
1592
+
1593
+ err = js_create_reference(env, ctx, req->ctx);
1594
+ assert(err == 0);
1595
+
1596
+ err = js_create_reference(env, on_compact_range, req->on_compact_range);
1597
+ assert(err == 0);
1598
+
1599
+ rocksdb_compact_range_options_t options = {
1600
+ .version = 0,
1601
+ .exclusive_manual_compaction = exclusive
1602
+ };
1603
+
1604
+ rocksdb_slice_t start_slice;
1605
+ err = js_get_typedarray_info(env, start, start_slice.data, start_slice.len);
1606
+ assert(err == 0);
1607
+
1608
+ rocksdb_slice_t end_slice;
1609
+ err = js_get_typedarray_info(env, start, end_slice.data, end_slice.len);
1610
+ assert(err == 0);
1611
+
1612
+ err = rocksdb_compact_range(&db->handle, &req->handle, column_family->handle, start_slice, end_slice, &options, rocksdb_native__on_compact_range);
1613
+ assert(err == 0);
1614
+
1615
+ return handle;
1616
+ }
1617
+
1501
1618
  static js_value_t *
1502
1619
  rocksdb_native_exports(js_env_t *env, js_value_t *exports) {
1503
1620
  int err;
@@ -1533,6 +1650,8 @@ rocksdb_native_exports(js_env_t *env, js_value_t *exports) {
1533
1650
 
1534
1651
  V("snapshotCreate", rocksdb_native_snapshot_create)
1535
1652
  V("snapshotDestroy", rocksdb_native_snapshot_destroy)
1653
+
1654
+ V("compactRange", rocksdb_native_compact_range)
1536
1655
  #undef V
1537
1656
 
1538
1657
  #define V(name, n) \
package/index.js CHANGED
@@ -176,6 +176,19 @@ class RocksDB {
176
176
  await batch.flush()
177
177
  }
178
178
 
179
+ async compactRange(start = null, end = null, opts = {}) {
180
+ if (typeof end === 'object' && end !== null) {
181
+ opts = end
182
+ end = null
183
+ } else if (typeof start === 'object' && start !== null) {
184
+ opts = start
185
+ start = null
186
+ end = null
187
+ }
188
+
189
+ await this._state.compactRange(this, start, end, opts)
190
+ }
191
+
179
192
  _ref() {
180
193
  if (this._snapshot) this._snapshot.ref()
181
194
  this._state.handles.inc()
package/lib/state.js CHANGED
@@ -2,11 +2,13 @@ const ReadyResource = require('ready-resource')
2
2
  const RefCounter = require('refcounter')
3
3
  const rrp = require('resolve-reject-promise')
4
4
  const SignalPromise = require('signal-promise')
5
+ const c = require('compact-encoding')
5
6
  const { ReadBatch, WriteBatch } = require('./batch')
6
7
  const ColumnFamily = require('./column-family')
7
8
  const binding = require('../binding')
8
9
 
9
10
  const MAX_BATCH_REUSE = 64
11
+ const empty = Buffer.alloc(0)
10
12
 
11
13
  module.exports = class RocksDBState extends ReadyResource {
12
14
  constructor(db, path, opts) {
@@ -309,4 +311,47 @@ module.exports = class RocksDBState extends ReadyResource {
309
311
  else req.resolve()
310
312
  }
311
313
  }
314
+
315
+ async compactRange(db, start, end, opts) {
316
+ if (this.opened === false) await this.ready()
317
+
318
+ this.io.inc()
319
+
320
+ const { exclusive = false } = opts
321
+
322
+ const req = { resolve: null, reject: null, handle: null }
323
+
324
+ const promise = new Promise((resolve, reject) => {
325
+ req.resolve = resolve
326
+ req.reject = reject
327
+ })
328
+
329
+ try {
330
+ req.handle = binding.compactRange(
331
+ this._handle,
332
+ db._columnFamily._handle,
333
+ this._encodeKey(start),
334
+ this._encodeKey(end),
335
+ exclusive,
336
+ req,
337
+ oncompactrange
338
+ )
339
+
340
+ await promise
341
+ } finally {
342
+ this.io.dec()
343
+ }
344
+
345
+ function oncompactrange(err) {
346
+ if (err) req.reject(new Error(err))
347
+ else req.resolve()
348
+ }
349
+ }
350
+
351
+ _encodeKey(k) {
352
+ if (this.db._keyEncoding) return c.encode(this.db._keyEncoding, k)
353
+ if (typeof k === 'string') return Buffer.from(k)
354
+ if (k === null) return empty
355
+ return k
356
+ }
312
357
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rocksdb-native",
3
- "version": "3.7.4",
3
+ "version": "3.8.0",
4
4
  "description": "librocksdb bindings for JavaScript",
5
5
  "exports": {
6
6
  ".": "./index.js",