Skip to content

Commit 2b3b7e6

Browse files
committed
fix: make sure to delete tree ridbag data when converting to embedded
1 parent ea4cb04 commit 2b3b7e6

3 files changed

Lines changed: 71 additions & 4 deletions

File tree

core/src/main/java/com/orientechnologies/orient/core/db/record/ridbag/ORidBag.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.orientechnologies.orient.core.serialization.serializer.record.OSerializationContextImpl;
4444
import com.orientechnologies.orient.core.serialization.serializer.record.binary.BytesContainer;
4545
import com.orientechnologies.orient.core.serialization.serializer.string.OStringBuilderSerializable;
46+
import com.orientechnologies.orient.core.storage.impl.local.paginated.ORecordSerializationContext;
4647
import com.orientechnologies.orient.core.storage.index.sbtreebonsai.local.OSBTreeBonsai;
4748
import com.orientechnologies.orient.core.storage.ridbag.ORemoteTreeRidBag;
4849
import com.orientechnologies.orient.core.storage.ridbag.sbtree.Change;
@@ -297,7 +298,9 @@ public int toStream(BytesContainer bytesContainer, OSerializationContext ctx)
297298

298299
public void checkAndConvert() {
299300
ODatabaseDocumentInternal database = ODatabaseRecordThreadLocal.instance().getIfDefined();
300-
if (database != null && !database.isRemote()) {
301+
if (database != null
302+
&& !database.isRemote()
303+
&& ORecordSerializationContext.getContext() != null) {
301304
if (isEmbedded()
302305
&& ODatabaseRecordThreadLocal.instance().get().getSbTreeCollectionManager() != null
303306
&& delegate.size() >= topThreshold) {

core/src/main/java/com/orientechnologies/orient/core/storage/ridbag/sbtree/OSBTreeRidBag.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -840,9 +840,15 @@ public void clearChanges() {
840840

841841
@Override
842842
public void requestDelete() {
843-
final ORecordSerializationContext context = ORecordSerializationContext.getContext();
844-
if (context != null && collectionPointer != null) {
845-
context.push(new ORidBagDeleteSerializationOperation(this));
843+
if (ODatabaseRecordThreadLocal.instance().isDefined()
844+
&& !ODatabaseRecordThreadLocal.instance().get().isRemote()) {
845+
final ORecordSerializationContext context = ORecordSerializationContext.getContext();
846+
847+
if (context != null && collectionPointer != null) {
848+
context.push(new ORidBagDeleteSerializationOperation(this));
849+
} else {
850+
throw new ODatabaseException("Cannot delete the ridbag in current context");
851+
}
846852
}
847853
}
848854

core/src/test/java/com/orientechnologies/orient/core/storage/ridbag/sbtree/ORidBagAtomicUpdateTest.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import com.orientechnologies.BaseMemoryDatabase;
44
import com.orientechnologies.orient.core.config.OGlobalConfiguration;
5+
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentEmbedded;
56
import com.orientechnologies.orient.core.db.record.OIdentifiable;
67
import com.orientechnologies.orient.core.db.record.ridbag.ORidBag;
78
import com.orientechnologies.orient.core.exception.OConcurrentModificationException;
89
import com.orientechnologies.orient.core.id.ORID;
910
import com.orientechnologies.orient.core.record.impl.ODocument;
11+
import com.orientechnologies.orient.core.storage.index.sbtreebonsai.local.OSBTreeBonsai;
1012
import java.util.ArrayList;
1113
import java.util.Arrays;
1214
import java.util.HashMap;
@@ -1138,6 +1140,62 @@ public void testFromSBTreeToEmbeddedRollback() {
11381140
Assert.assertTrue(docsToAdd.isEmpty());
11391141
}
11401142

1143+
@Test
1144+
public void testFromSBTreeToEmbedded() {
1145+
OGlobalConfiguration.RID_BAG_EMBEDDED_TO_SBTREEBONSAI_THRESHOLD.setValue(5);
1146+
OGlobalConfiguration.RID_BAG_SBTREEBONSAI_TO_EMBEDDED_THRESHOLD.setValue(7);
1147+
1148+
List<OIdentifiable> docsToAdd = new ArrayList<OIdentifiable>();
1149+
1150+
ODocument document = new ODocument();
1151+
1152+
ORidBag ridBag = new ORidBag();
1153+
document.field("ridBag", ridBag);
1154+
document.save(db.getClusterNameById(db.getDefaultClusterId()));
1155+
1156+
db.begin();
1157+
1158+
for (int i = 0; i < 10; i++) {
1159+
ODocument docToAdd = new ODocument();
1160+
docToAdd.save(db.getClusterNameById(db.getDefaultClusterId()));
1161+
ridBag.add(docToAdd);
1162+
docsToAdd.add(docToAdd);
1163+
}
1164+
1165+
document.save(db.getClusterNameById(db.getDefaultClusterId()));
1166+
1167+
db.commit();
1168+
1169+
Assert.assertEquals(docsToAdd.size(), 10);
1170+
Assert.assertTrue(!ridBag.isEmbedded());
1171+
1172+
document = db.load(document.getIdentity());
1173+
ridBag = document.field("ridBag");
1174+
1175+
db.begin();
1176+
OBonsaiCollectionPointer pointer =
1177+
((OSBTreeRidBag) ridBag.getDelegate()).getCollectionPointer();
1178+
for (int i = 0; i < 4; i++) {
1179+
OIdentifiable docToRemove = docsToAdd.get(i);
1180+
ridBag.remove(docToRemove);
1181+
}
1182+
1183+
Assert.assertTrue(document.isDirty());
1184+
1185+
document.save(db.getClusterNameById(db.getDefaultClusterId()));
1186+
db.commit();
1187+
1188+
OSBTreeBonsai<OIdentifiable, Integer> btree =
1189+
((ODatabaseDocumentEmbedded) db).getSbTreeCollectionManager().loadSBTree(pointer);
1190+
1191+
Assert.assertTrue(btree.isEmpty());
1192+
1193+
document = db.load(document.getIdentity());
1194+
ridBag = document.field("ridBag");
1195+
1196+
Assert.assertTrue(ridBag.isEmbedded());
1197+
}
1198+
11411199
@Test
11421200
public void testFromSBTreeToEmbeddedTxWithCME() {
11431201
OGlobalConfiguration.RID_BAG_EMBEDDED_TO_SBTREEBONSAI_THRESHOLD.setValue(5);

0 commit comments

Comments
 (0)