Skip to content

Commit a495eea

Browse files
committed
avoid deleteRange() as possible for performance (#1375)
Change-Id: I1667e062b8a6a99c52d534a314a0af4bfecb59a0
1 parent 1da7036 commit a495eea

File tree

8 files changed

+68
-28
lines changed

8 files changed

+68
-28
lines changed

hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBSessions.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,11 @@ public static abstract class Session extends AbstractBackendSession {
7979
public abstract void merge(String table, byte[] key, byte[] value);
8080
public abstract void increase(String table, byte[] key, byte[] value);
8181

82-
public abstract void remove(String table, byte[] key);
83-
public abstract void delete(String table, byte[] keyFrom, byte[] keyTo);
8482
public abstract void delete(String table, byte[] key);
83+
public abstract void deleteSingle(String table, byte[] key);
84+
public abstract void deletePrefix(String table, byte[] key);
85+
public abstract void deleteRange(String table,
86+
byte[] keyFrom, byte[] keyTo);
8587

8688
public abstract byte[] get(String table, byte[] key);
8789

hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBStdSessions.java

+16-3
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,20 @@ public void increase(String table, byte[] key, byte[] value) {
840840
* Delete a record by key from a table
841841
*/
842842
@Override
843-
public void remove(String table, byte[] key) {
843+
public void delete(String table, byte[] key) {
844+
try (CFHandle cf = cf(table)) {
845+
this.batch.delete(cf.get(), key);
846+
} catch (RocksDBException e) {
847+
throw new BackendException(e);
848+
}
849+
}
850+
851+
/**
852+
* Delete the only one version of a record by key from a table
853+
* NOTE: requires that the key exists and was not overwritten.
854+
*/
855+
@Override
856+
public void deleteSingle(String table, byte[] key) {
844857
try (CFHandle cf = cf(table)) {
845858
this.batch.singleDelete(cf.get(), key);
846859
} catch (RocksDBException e) {
@@ -852,7 +865,7 @@ public void remove(String table, byte[] key) {
852865
* Delete a record by key(or prefix with key) from a table
853866
*/
854867
@Override
855-
public void delete(String table, byte[] key) {
868+
public void deletePrefix(String table, byte[] key) {
856869
byte[] keyFrom = key;
857870
byte[] keyTo = Arrays.copyOf(key, key.length);
858871
keyTo = BinarySerializer.increaseOne(keyTo);
@@ -867,7 +880,7 @@ public void delete(String table, byte[] key) {
867880
* Delete a range of keys from a table
868881
*/
869882
@Override
870-
public void delete(String table, byte[] keyFrom, byte[] keyTo) {
883+
public void deleteRange(String table, byte[] keyFrom, byte[] keyTo) {
871884
try (CFHandle cf = cf(table)) {
872885
this.batch.deleteRange(cf.get(), keyFrom, keyTo);
873886
} catch (RocksDBException e) {

hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBTable.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public void delete(Session session, BackendEntry entry) {
103103
} else {
104104
for (BackendColumn col : entry.columns()) {
105105
assert entry.belongToMe(col) : entry;
106-
session.remove(this.table(), col.name);
106+
session.delete(this.table(), col.name);
107107
}
108108
}
109109
}

hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBTables.java

+18-5
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,20 @@ private static long l(byte[] bytes) {
7575
}
7676
}
7777

78-
public static class VertexLabel extends RocksDBTable {
78+
public static class SchemaTable extends RocksDBTable {
79+
80+
public SchemaTable(String database, String table) {
81+
super(database, table);
82+
}
83+
84+
@Override
85+
public void delete(Session session, BackendEntry entry) {
86+
assert entry.columns().isEmpty();
87+
session.deletePrefix(this.table(), entry.id().asBytes());
88+
}
89+
}
90+
91+
public static class VertexLabel extends SchemaTable {
7992

8093
public static final String TABLE = HugeType.VERTEX_LABEL.string();
8194

@@ -84,7 +97,7 @@ public VertexLabel(String database) {
8497
}
8598
}
8699

87-
public static class EdgeLabel extends RocksDBTable {
100+
public static class EdgeLabel extends SchemaTable {
88101

89102
public static final String TABLE = HugeType.EDGE_LABEL.string();
90103

@@ -93,7 +106,7 @@ public EdgeLabel(String database) {
93106
}
94107
}
95108

96-
public static class PropertyKey extends RocksDBTable {
109+
public static class PropertyKey extends SchemaTable {
97110

98111
public static final String TABLE = HugeType.PROPERTY_KEY.string();
99112

@@ -102,7 +115,7 @@ public PropertyKey(String database) {
102115
}
103116
}
104117

105-
public static class IndexLabel extends RocksDBTable {
118+
public static class IndexLabel extends SchemaTable {
106119

107120
public static final String TABLE = HugeType.INDEX_LABEL.string();
108121

@@ -168,7 +181,7 @@ public void delete(Session session, BackendEntry entry) {
168181
*/
169182
for (BackendEntry.BackendColumn column : entry.columns()) {
170183
// Don't assert entry.belongToMe(column), length-prefix is 1*
171-
session.delete(this.table(), column.name);
184+
session.deletePrefix(this.table(), column.name);
172185
}
173186
}
174187
}

hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdbsst/RocksDBSstSessions.java

+15-6
Original file line numberDiff line numberDiff line change
@@ -325,24 +325,33 @@ public void increase(String table, byte[] key, byte[] value) {
325325
* Delete a record by key from a table
326326
*/
327327
@Override
328-
public void remove(String table, byte[] key) {
329-
throw new NotSupportException("RocksDBSstStore remove()");
328+
public void delete(String table, byte[] key) {
329+
throw new NotSupportException("RocksDBSstStore delete()");
330+
}
331+
332+
/**
333+
* Delete the only one version of a record by key from a table
334+
* NOTE: requires that the key exists and was not overwritten.
335+
*/
336+
@Override
337+
public void deleteSingle(String table, byte[] key) {
338+
throw new NotSupportException("RocksDBSstStore deleteSingle()");
330339
}
331340

332341
/**
333342
* Delete a record by key(or prefix with key) from a table
334343
*/
335344
@Override
336-
public void delete(String table, byte[] key) {
337-
throw new NotSupportException("RocksDBSstStore delete()");
345+
public void deletePrefix(String table, byte[] key) {
346+
throw new NotSupportException("RocksDBSstStore deletePrefix()");
338347
}
339348

340349
/**
341350
* Delete a range of keys from a table
342351
*/
343352
@Override
344-
public void delete(String table, byte[] keyFrom, byte[] keyTo) {
345-
throw new NotSupportException("RocksDBSstStore delete()");
353+
public void deleteRange(String table, byte[] keyFrom, byte[] keyTo) {
354+
throw new NotSupportException("RocksDBSstStore deleteRange()");
346355
}
347356

348357
/**

hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/BaseRocksDBUnitTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ protected String get(String key) throws RocksDBException {
7777

7878
protected void clearData() throws RocksDBException {
7979
for (String table : new ArrayList<>(this.rocks.openedTables())) {
80-
this.rocks.session().delete(table, new byte[]{0}, new byte[]{-1});
80+
this.rocks.session().deleteRange(table,
81+
new byte[]{0}, new byte[]{-1});
8182
}
8283
this.commit();
8384
}

hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/RocksDBPerfTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public void testUpdate() throws RocksDBException {
141141
for (int i = 0; i < n; i++) {
142142
int value = comms.get(i);
143143
String old = String.format("index:%3d:%d", i, value);
144-
session.remove(TABLE, b(old));
144+
session.delete(TABLE, b(old));
145145

146146
value = r.nextInt(n); // TODO: aggregate
147147
value = i + 1;

hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/RocksDBSessionsTest.java

+11-9
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ public void testDeleteByKey() throws RocksDBException {
285285
Assert.assertEquals("19", get("person:1gage"));
286286
Assert.assertEquals("Beijing", get("person:1gcity"));
287287

288-
this.rocks.session().remove(TABLE, b("person:1gage"));
288+
this.rocks.session().delete(TABLE, b("person:1gage"));
289289
this.commit();
290290

291291
Assert.assertEquals("James", get("person:1gname"));
@@ -303,7 +303,7 @@ public void testDeleteByKeyButNotExist() throws RocksDBException {
303303
Assert.assertEquals("19", get("person:1gage"));
304304
Assert.assertEquals("Beijing", get("person:1gcity"));
305305

306-
this.rocks.session().remove(TABLE, b("person:1"));
306+
this.rocks.session().delete(TABLE, b("person:1"));
307307
this.commit();
308308

309309
Assert.assertEquals("James", get("person:1gname"));
@@ -325,7 +325,7 @@ public void testDeleteByPrefix() throws RocksDBException {
325325
Assert.assertEquals("19", get("person:1gage"));
326326
Assert.assertEquals("Beijing", get("person:1gcity"));
327327

328-
this.rocks.session().delete(TABLE, b("person:1"));
328+
this.rocks.session().deletePrefix(TABLE, b("person:1"));
329329
this.commit();
330330

331331
Assert.assertEquals(null, get("person:1gname"));
@@ -353,7 +353,7 @@ public void testDeleteByRange() throws RocksDBException {
353353
Assert.assertEquals("Lisa", get("person:2gname"));
354354
Assert.assertEquals("Hebe", get("person:3gname"));
355355

356-
this.rocks.session().delete(TABLE, b("person:1"), b("person:3"));
356+
this.rocks.session().deleteRange(TABLE, b("person:1"), b("person:3"));
357357
this.commit();
358358

359359
Assert.assertEquals(null, get("person:1gname"));
@@ -385,7 +385,7 @@ public void testDeleteByRangeWithBytes() throws RocksDBException {
385385
byte[] value21 = b("value-2-1");
386386
session.put(TABLE, key21, value21);
387387

388-
session.delete(TABLE, key11, new byte[]{1, 3});
388+
session.deleteRange(TABLE, key11, new byte[]{1, 3});
389389
this.commit();
390390

391391
Assert.assertArrayEquals(null, session.get(TABLE, key11));
@@ -409,14 +409,14 @@ public void testDeleteByRangeWithSignedBytes() throws RocksDBException {
409409
byte[] value21 = b("value-2-1");
410410
session.put(TABLE, key21, value21);
411411

412-
session.delete(TABLE, new byte[]{1, -3}, new byte[]{1, 3});
412+
session.deleteRange(TABLE, new byte[]{1, -3}, new byte[]{1, 3});
413413
this.commit();
414414

415415
Assert.assertArrayEquals(value11, session.get(TABLE, key11));
416416
Assert.assertArrayEquals(value12, session.get(TABLE, key12));
417417
Assert.assertArrayEquals(value21, session.get(TABLE, key21));
418418

419-
session.delete(TABLE, new byte[]{1, 1}, new byte[]{1, -1});
419+
session.deleteRange(TABLE, new byte[]{1, 1}, new byte[]{1, -1});
420420
this.commit();
421421

422422
Assert.assertArrayEquals(null, session.get(TABLE, key11));
@@ -448,7 +448,8 @@ public void testDeleteByRangeWithMinMaxByteValue() throws RocksDBException {
448448
byte[] value20 = b("value-2-0");
449449
session.put(TABLE, key20, value20);
450450

451-
session.delete(TABLE, new byte[]{1, 0}, new byte[]{1, (byte) 0xff});
451+
session.deleteRange(TABLE,
452+
new byte[]{1, 0}, new byte[]{1, (byte) 0xff});
452453
this.commit();
453454

454455
Assert.assertArrayEquals(null, session.get(TABLE, key11));
@@ -457,7 +458,8 @@ public void testDeleteByRangeWithMinMaxByteValue() throws RocksDBException {
457458
Assert.assertArrayEquals(value14, session.get(TABLE, key14));
458459
Assert.assertArrayEquals(value20, session.get(TABLE, key20));
459460

460-
session.delete(TABLE, new byte[]{1, (byte) 0xff}, new byte[]{2, 0});
461+
session.deleteRange(TABLE,
462+
new byte[]{1, (byte) 0xff}, new byte[]{2, 0});
461463
this.commit();
462464

463465
Assert.assertArrayEquals(null, session.get(TABLE, key11));

0 commit comments

Comments
 (0)