package com.orientechnologies.orient.core.db.conflict; import static org.testng.AssertJUnit.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import org.testng.annotations.Test; import com.orientechnologies.orient.core.db.document.ODatabaseDocument; import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx; import com.orientechnologies.orient.core.db.record.OIdentifiable; import com.orientechnologies.orient.core.db.record.ridbag.ORidBag; import com.orientechnologies.orient.core.id.ORID; import com.orientechnologies.orient.core.id.ORecordId; import com.orientechnologies.orient.core.record.impl.ODocument; public class OMultithreadConflictManagementTest { @Test public void testAutomergeConflictStrategyThreaded() { ODatabaseDocument db = new ODatabaseDocumentTx("memory:" + OMultithreadConflictManagementTest.class.getSimpleName()); db.create(); db.setConflictStrategy("automerge"); try { db.begin(); ORidBag bag = new ORidBag(); bag.add(new ORecordId(30, 20)); ODocument doc = new ODocument(); doc.field("bag", bag); doc = db.save(doc); db.commit(); final ORID id; id = doc.getIdentity(); ExecutorService service = Executors.newFixedThreadPool(2); final AtomicInteger interger = new AtomicInteger(0); Runnable runnable = new Runnable() { @Override public void run() { ODatabaseDocument db = new ODatabaseDocumentTx("memory:" + OMultithreadConflictManagementTest.class.getSimpleName()); db.setConflictStrategy("automerge"); db.open("admin", "admin"); db.begin(); ODocument doc = db.load(id); ORidBag bag1 = ((ORidBag) doc.field("bag")); ORecordId newId = new ORecordId(30, 30 + interger.incrementAndGet()); bag1.add(newId); db.save(doc); db.commit(); db.close(); ORidBag bag = doc.field("bag"); bag.setAutoConvertToRecord(false); } }; service.execute(runnable); service.execute(runnable); service.shutdown(); try { service.awaitTermination(1, TimeUnit.HOURS); } catch (InterruptedException e) { } db.getLocalCache().clear(); doc = db.load(id); ORidBag bag2 = doc.field("bag"); bag2.setAutoConvertToRecord(false); List<ORecordId> ids = new ArrayList<ORecordId>(Arrays.asList(new ORecordId(30, 20), new ORecordId(30, 31), new ORecordId(30, 32))); for (OIdentifiable ide : bag2) { assertTrue(ids.remove(ide)); } assertTrue(ids.isEmpty()); } finally { db.drop(); } } }