rocksdb-native 3.5.4 → 3.5.6

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
@@ -13,7 +13,7 @@ if(target MATCHES "win32")
13
13
  add_compile_options(/MT$<$<CONFIG:Debug>:d>)
14
14
  endif()
15
15
 
16
- fetch_package("github:holepunchto/librocksdb#d2b6760")
16
+ fetch_package("github:holepunchto/librocksdb#4a8e385")
17
17
 
18
18
  add_bare_module(rocksdb_native_bare)
19
19
 
package/binding.c CHANGED
@@ -85,7 +85,6 @@ typedef struct {
85
85
  rocksdb_read_batch_t handle;
86
86
 
87
87
  rocksdb_read_t *reads;
88
- char **errors;
89
88
 
90
89
  size_t capacity;
91
90
 
@@ -98,7 +97,6 @@ typedef struct {
98
97
  rocksdb_write_batch_t handle;
99
98
 
100
99
  rocksdb_write_t *writes;
101
- char **errors;
102
100
 
103
101
  size_t capacity;
104
102
 
@@ -141,6 +139,10 @@ rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
141
139
 
142
140
  js_env_t *env = req->env;
143
141
 
142
+ const rocksdb_column_family_descriptor_t *descriptors = handle->column_families;
143
+
144
+ rocksdb_column_family_t **handles = handle->handles;
145
+
144
146
  if (db->exiting) {
145
147
  err = js_delete_reference(env, req->on_open);
146
148
  assert(err == 0);
@@ -192,10 +194,8 @@ rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
192
194
 
193
195
  js_value_t **elements = malloc(len * sizeof(js_value_t *));
194
196
 
195
- uint32_t fetched;
196
- err = js_get_array_elements(env, column_families, elements, len, 0, &fetched);
197
+ err = js_get_array_elements(env, column_families, elements, len, 0, NULL);
197
198
  assert(err == 0);
198
- assert(fetched == len);
199
199
 
200
200
  for (uint32_t i = 0; i < len; i++) {
201
201
  js_value_t *handle = elements[i];
@@ -222,9 +222,9 @@ rocksdb_native__on_open(rocksdb_open_t *handle, int status) {
222
222
  assert(err == 0);
223
223
  }
224
224
 
225
- free((void *) handle->column_families);
225
+ free((void *) descriptors);
226
226
 
227
- free(handle->handles);
227
+ free(handles);
228
228
  }
229
229
 
230
230
  static void
@@ -397,10 +397,8 @@ rocksdb_native_open(js_env_t *env, js_callback_info_t *info) {
397
397
 
398
398
  js_value_t **elements = malloc(len * sizeof(js_value_t *));
399
399
 
400
- uint32_t fetched;
401
- err = js_get_array_elements(env, argv[3], elements, len, 0, &fetched);
400
+ err = js_get_array_elements(env, argv[3], elements, len, 0, NULL);
402
401
  assert(err == 0);
403
- assert(fetched == len);
404
402
 
405
403
  for (uint32_t i = 0; i < len; i++) {
406
404
  js_value_t *handle = elements[i];
@@ -1268,19 +1266,12 @@ rocksdb_native_read_buffer(js_env_t *env, js_callback_info_t *info) {
1268
1266
 
1269
1267
  js_value_t *handle;
1270
1268
 
1271
- uint8_t *data;
1272
- err = js_create_arraybuffer(env, capacity * sizeof(rocksdb_read_t) + capacity * sizeof(char *), (void **) &data, &handle);
1269
+ rocksdb_read_t *reads;
1270
+ err = js_create_arraybuffer(env, capacity * sizeof(rocksdb_read_t), (void **) &reads, &handle);
1273
1271
  assert(err == 0);
1274
1272
 
1275
1273
  req->capacity = capacity;
1276
-
1277
- size_t offset = 0;
1278
-
1279
- req->reads = (rocksdb_read_t *) &data[offset];
1280
-
1281
- offset += capacity * sizeof(rocksdb_read_t);
1282
-
1283
- req->errors = (char **) &data[offset];
1274
+ req->reads = reads;
1284
1275
 
1285
1276
  return handle;
1286
1277
  }
@@ -1304,7 +1295,7 @@ rocksdb_native__on_read(rocksdb_read_batch_t *handle, int status) {
1304
1295
  for (size_t i = 0; i < len; i++) {
1305
1296
  js_value_t *result;
1306
1297
 
1307
- char *error = req->errors[i];
1298
+ char *error = req->handle.errors[i];
1308
1299
 
1309
1300
  if (error) continue;
1310
1301
 
@@ -1333,7 +1324,7 @@ rocksdb_native__on_read(rocksdb_read_batch_t *handle, int status) {
1333
1324
  for (size_t i = 0; i < len; i++) {
1334
1325
  js_value_t *result;
1335
1326
 
1336
- char *error = req->errors[i];
1327
+ char *error = req->handle.errors[i];
1337
1328
 
1338
1329
  if (error) {
1339
1330
  err = js_create_string_utf8(env, (utf8_t *) error, -1, &result);
@@ -1410,10 +1401,8 @@ rocksdb_native_read(js_env_t *env, js_callback_info_t *info) {
1410
1401
 
1411
1402
  js_value_t **elements = malloc(len * sizeof(js_value_t *));
1412
1403
 
1413
- uint32_t fetched;
1414
- err = js_get_array_elements(env, argv[2], elements, len, 0, &fetched);
1404
+ err = js_get_array_elements(env, argv[2], elements, len, 0, NULL);
1415
1405
  assert(err == 0);
1416
- assert(fetched == len);
1417
1406
 
1418
1407
  for (uint32_t i = 0; i < len; i++) {
1419
1408
  js_value_t *read = elements[i];
@@ -1467,7 +1456,7 @@ rocksdb_native_read(js_env_t *env, js_callback_info_t *info) {
1467
1456
  assert(err == 0);
1468
1457
  }
1469
1458
 
1470
- err = rocksdb_read(&db->handle, &req->handle, req->reads, req->errors, len, &options, rocksdb_native__on_read);
1459
+ err = rocksdb_read(&db->handle, &req->handle, req->reads, len, &options, rocksdb_native__on_read);
1471
1460
  assert(err == 0);
1472
1461
 
1473
1462
  return NULL;
@@ -1511,19 +1500,12 @@ rocksdb_native_write_buffer(js_env_t *env, js_callback_info_t *info) {
1511
1500
 
1512
1501
  js_value_t *handle;
1513
1502
 
1514
- uint8_t *data;
1515
- err = js_create_arraybuffer(env, capacity * sizeof(rocksdb_write_t) + capacity * sizeof(char *), (void **) &data, &handle);
1503
+ rocksdb_write_t *writes;
1504
+ err = js_create_arraybuffer(env, capacity * sizeof(rocksdb_write_t), (void **) &writes, &handle);
1516
1505
  assert(err == 0);
1517
1506
 
1518
1507
  req->capacity = capacity;
1519
-
1520
- size_t offset = 0;
1521
-
1522
- req->writes = (rocksdb_write_t *) &data[offset];
1523
-
1524
- offset += capacity * sizeof(rocksdb_write_t);
1525
-
1526
- req->errors = (char **) &data[offset];
1508
+ req->writes = writes;
1527
1509
 
1528
1510
  return handle;
1529
1511
  }
@@ -1614,10 +1596,8 @@ rocksdb_native_write(js_env_t *env, js_callback_info_t *info) {
1614
1596
 
1615
1597
  js_value_t **elements = malloc(len * sizeof(js_value_t *));
1616
1598
 
1617
- uint32_t fetched;
1618
- err = js_get_array_elements(env, argv[2], elements, len, 0, &fetched);
1599
+ err = js_get_array_elements(env, argv[2], elements, len, 0, NULL);
1619
1600
  assert(err == 0);
1620
- assert(fetched == len);
1621
1601
 
1622
1602
  for (uint32_t i = 0; i < len; i++) {
1623
1603
  js_value_t *write = elements[i];
@@ -1794,7 +1774,7 @@ rocksdb_native_flush(js_env_t *env, js_callback_info_t *info) {
1794
1774
  err = rocksdb_flush(&db->handle, &req->handle, column_family->handle, NULL, rocksdb_native__on_flush);
1795
1775
  assert(err == 0);
1796
1776
 
1797
- return NULL;
1777
+ return handle;
1798
1778
  }
1799
1779
 
1800
1780
  static js_value_t *
package/lib/batch.js CHANGED
@@ -96,6 +96,8 @@ class RocksDBBatch {
96
96
  const promise = this._promises[i]
97
97
  if (promise !== null) promise.reject(new Error('Batch is destroyed'))
98
98
  }
99
+
100
+ this._onfinished(new Error('Batch is destroyed'))
99
101
  }
100
102
 
101
103
  async flush() {
@@ -129,11 +131,14 @@ class RocksDBBatch {
129
131
  if (this._db._state.resumed !== null) {
130
132
  const resumed = await this._db._state.resumed.promise
131
133
 
132
- if (!resumed && !this._destroyed) {
133
- this._destroyed = true
134
- this._abort()
135
- this._db._state.io.dec()
136
- this._db._unref()
134
+ if (!resumed) {
135
+ if (this._destroyed) {
136
+ this._db._state.io.dec()
137
+ } else {
138
+ this._destroyed = true
139
+ this._abort()
140
+ this._db._unref()
141
+ }
137
142
  }
138
143
  }
139
144
  }
package/lib/iterator.js CHANGED
@@ -75,6 +75,7 @@ module.exports = class RocksDBIterator extends Readable {
75
75
  _onclose(err) {
76
76
  const cb = this._pendingDestroy
77
77
  this._pendingDestroy = null
78
+ this._db._state.io.dec()
78
79
  this._db._unref()
79
80
  cb(err)
80
81
  }
@@ -115,43 +116,70 @@ module.exports = class RocksDBIterator extends Readable {
115
116
 
116
117
  this._pendingOpen = cb
117
118
 
118
- binding.iteratorOpen(
119
- this._db._state._handle,
120
- this._handle,
121
- this._db._columnFamily._handle,
122
- this._gt,
123
- this._gte,
124
- this._lt,
125
- this._lte,
126
- this._reverse,
127
- this._db._snapshot ? this._db._snapshot._handle : null,
128
- this,
129
- this._onopen,
130
- this._onclose,
131
- this._onread
132
- )
119
+ try {
120
+ binding.iteratorOpen(
121
+ this._db._state._handle,
122
+ this._handle,
123
+ this._db._columnFamily._handle,
124
+ this._gt,
125
+ this._gte,
126
+ this._lt,
127
+ this._lte,
128
+ this._reverse,
129
+ this._db._snapshot ? this._db._snapshot._handle : null,
130
+ this,
131
+ this._onopen,
132
+ this._onclose,
133
+ this._onread
134
+ )
135
+ } catch (err) {
136
+ this._db._state.io.dec()
137
+ throw err
138
+ }
133
139
  }
134
140
 
135
141
  async _read(cb) {
142
+ this._db._state.io.inc()
143
+
136
144
  if (this._db._state.resumed !== null) {
137
- await this._db._state.resumed.promise
145
+ const resumed = await this._db._state.resumed.promise
146
+
147
+ if (!resumed) {
148
+ this._db._state.io.dec()
149
+
150
+ return cb(new Error('RocksDB session is closed'))
151
+ }
138
152
  }
139
153
 
140
154
  this._pendingRead = cb
141
155
 
142
- binding.iteratorRead(this._handle, Math.min(this._capacity, this._limit))
143
-
144
- this._db._state.io.inc()
156
+ try {
157
+ binding.iteratorRead(this._handle, Math.min(this._capacity, this._limit))
158
+ } catch (err) {
159
+ this._db._state.io.dec()
160
+ throw err
161
+ }
145
162
  }
146
163
 
147
164
  async _destroy(cb) {
148
165
  await this.ready()
149
166
 
167
+ this._db._state.io.inc()
168
+
150
169
  this._pendingDestroy = cb
151
170
 
152
- if (this._opened === false) return this._onclose(null)
171
+ if (this._opened === false) {
172
+ this._db._state.io.dec()
173
+
174
+ return this._onclose(null)
175
+ }
153
176
 
154
- binding.iteratorClose(this._handle)
177
+ try {
178
+ binding.iteratorClose(this._handle)
179
+ } catch (err) {
180
+ this._db._state.io.dec()
181
+ throw err
182
+ }
155
183
  }
156
184
 
157
185
  _encodeKey(k) {
package/lib/state.js CHANGED
@@ -160,6 +160,7 @@ module.exports = class RocksDBState extends ReadyResource {
160
160
  async _close() {
161
161
  if (this.resumed) this.resumed.resolve(false)
162
162
 
163
+ while (!this.io.isIdle()) await this.io.idle()
163
164
  while (!this.handles.isIdle()) await this.handles.idle()
164
165
 
165
166
  while (this.sessions.length > 0) {
@@ -188,14 +189,12 @@ module.exports = class RocksDBState extends ReadyResource {
188
189
  async flush(db, opts) {
189
190
  if (this.opened === false) await this.ready()
190
191
 
191
- this.handles.inc()
192
192
  this.io.inc()
193
193
 
194
194
  if (this.resumed !== null) {
195
195
  const resumed = await this.resumed.promise
196
196
 
197
197
  if (!resumed) {
198
- this.handles.dec()
199
198
  this.io.dec()
200
199
 
201
200
  throw new Error('RocksDB session is closed')
@@ -219,7 +218,6 @@ module.exports = class RocksDBState extends ReadyResource {
219
218
 
220
219
  await promise
221
220
  } finally {
222
- this.handles.dec()
223
221
  this.io.dec()
224
222
  }
225
223
 
@@ -241,6 +239,7 @@ module.exports = class RocksDBState extends ReadyResource {
241
239
 
242
240
  while (!this.io.isIdle()) await this.io.idle()
243
241
 
242
+ this.io.inc()
244
243
  this.resumed = rrp()
245
244
 
246
245
  const req = { resolve: null, reject: null, handle: null }
@@ -257,6 +256,8 @@ module.exports = class RocksDBState extends ReadyResource {
257
256
 
258
257
  this._suspended = true
259
258
  } finally {
259
+ this.io.dec()
260
+
260
261
  this._suspending = null
261
262
  }
262
263
 
@@ -276,6 +277,8 @@ module.exports = class RocksDBState extends ReadyResource {
276
277
  if (this._suspending !== null) await this._suspending
277
278
  if (this._suspended === false) return
278
279
 
280
+ this.io.inc()
281
+
279
282
  const req = { resolve: null, reject: null, handle: null }
280
283
 
281
284
  const promise = new Promise((resolve, reject) => {
@@ -290,6 +293,8 @@ module.exports = class RocksDBState extends ReadyResource {
290
293
 
291
294
  this._suspended = false
292
295
  } finally {
296
+ this.io.dec()
297
+
293
298
  this._resuming = null
294
299
  }
295
300
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rocksdb-native",
3
- "version": "3.5.4",
3
+ "version": "3.5.6",
4
4
  "description": "librocksdb bindings for JavaScript",
5
5
  "exports": {
6
6
  ".": "./index.js",