Search in sources :

Example 1 with OSBTreeRidBag

use of com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeRidBag in project orientdb by orientechnologies.

the class ORidBag method toStream.

public int toStream(BytesContainer bytesContainer) throws OSerializationException {
    final ORecordSerializationContext context = ORecordSerializationContext.getContext();
    if (context != null) {
        if (isEmbedded() && ODatabaseRecordThreadLocal.INSTANCE.get().getSbTreeCollectionManager() != null && delegate.size() >= topThreshold) {
            ORidBagDelegate oldDelegate = delegate;
            delegate = new OSBTreeRidBag();
            boolean oldAutoConvert = oldDelegate.isAutoConvertToRecord();
            oldDelegate.setAutoConvertToRecord(false);
            for (OIdentifiable identifiable : oldDelegate) delegate.add(identifiable);
            final ORecord owner = oldDelegate.getOwner();
            delegate.setOwner(owner);
            for (OMultiValueChangeListener<OIdentifiable, OIdentifiable> listener : oldDelegate.getChangeListeners()) delegate.addChangeListener(listener);
            owner.setDirty();
            oldDelegate.setAutoConvertToRecord(oldAutoConvert);
            oldDelegate.requestDelete();
        } else if (bottomThreshold >= 0 && !isEmbedded() && delegate.size() <= bottomThreshold) {
            ORidBagDelegate oldDelegate = delegate;
            boolean oldAutoConvert = oldDelegate.isAutoConvertToRecord();
            oldDelegate.setAutoConvertToRecord(false);
            delegate = new OEmbeddedRidBag();
            for (OIdentifiable identifiable : oldDelegate) delegate.add(identifiable);
            final ORecord owner = oldDelegate.getOwner();
            delegate.setOwner(owner);
            for (OMultiValueChangeListener<OIdentifiable, OIdentifiable> listener : oldDelegate.getChangeListeners()) delegate.addChangeListener(listener);
            owner.setDirty();
            oldDelegate.setAutoConvertToRecord(oldAutoConvert);
            oldDelegate.requestDelete();
        }
    }
    final UUID oldUuid = uuid;
    final OSBTreeCollectionManager sbTreeCollectionManager = ODatabaseRecordThreadLocal.INSTANCE.get().getSbTreeCollectionManager();
    if (sbTreeCollectionManager != null)
        uuid = sbTreeCollectionManager.listenForChanges(this);
    else
        uuid = null;
    boolean hasUuid = uuid != null;
    final int serializedSize = OByteSerializer.BYTE_SIZE + delegate.getSerializedSize() + ((hasUuid) ? OUUIDSerializer.UUID_SIZE : 0);
    int pointer = bytesContainer.alloc(serializedSize);
    int offset = pointer;
    final byte[] stream = bytesContainer.bytes;
    byte configByte = 0;
    if (isEmbedded())
        configByte |= 1;
    if (hasUuid)
        configByte |= 2;
    stream[offset++] = configByte;
    if (hasUuid) {
        OUUIDSerializer.INSTANCE.serialize(uuid, stream, offset);
        offset += OUUIDSerializer.UUID_SIZE;
    }
    delegate.serialize(stream, offset, oldUuid);
    return pointer;
}
Also used : OEmbeddedRidBag(com.orientechnologies.orient.core.db.record.ridbag.embedded.OEmbeddedRidBag) ORecordSerializationContext(com.orientechnologies.orient.core.storage.impl.local.paginated.ORecordSerializationContext) OSBTreeRidBag(com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeRidBag) OSBTreeCollectionManager(com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeCollectionManager) ORecord(com.orientechnologies.orient.core.record.ORecord) UUID(java.util.UUID)

Example 2 with OSBTreeRidBag

use of com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeRidBag in project orientdb by orientechnologies.

the class ConcurrencySBTreeBonsaiLocalTest method testName.

@Test
public void testName() throws Exception {
    ODatabaseDocumentTx db = new ODatabaseDocumentTx("memory:" + ConcurrencySBTreeBonsaiLocalTest.class.getName());
    db.create();
    ExecutorService exec = Executors.newCachedThreadPool();
    try {
        OSBTreeCollectionManager coll = db.getSbTreeCollectionManager();
        OBonsaiCollectionPointer treePointer = coll.createSBTree(3, null);
        OSBTreeBonsaiLocal<OIdentifiable, Integer> tree = (OSBTreeBonsaiLocal<OIdentifiable, Integer>) coll.loadSBTree(treePointer);
        OBonsaiCollectionPointer treePointer1 = coll.createSBTree(3, null);
        final OSBTreeBonsaiLocal<OIdentifiable, Integer> tree1 = (OSBTreeBonsaiLocal<OIdentifiable, Integer>) coll.loadSBTree(treePointer1);
        final OAtomicOperationsManager atomManager = ((OAbstractPaginatedStorage) db.getStorage()).getAtomicOperationsManager();
        atomManager.startAtomicOperation(tree, false);
        for (int i = 1000; i < 2000; i++) tree.put(new ORecordId(10, i), 1);
        Future<?> ex = null;
        try {
            ex = exec.submit(new Runnable() {

                @Override
                public void run() {
                    try {
                        atomManager.startAtomicOperation(tree1, false);
                        for (int i = 2000; i < 3000; i++) tree1.put(new ORecordId(10, i), 1);
                        atomManager.endAtomicOperation(false, null, tree1);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                }
            });
            ex.get(10, TimeUnit.MILLISECONDS);
        } catch (TimeoutException e) {
        // Is supposed to go in deadlock correct that goes in timeout
        }
        atomManager.endAtomicOperation(false, null, tree);
        ex.get();
        OSBTreeRidBag bag = new OSBTreeRidBag();
        bag.setCollectionPointer(tree.getCollectionPointer());
        bag.setAutoConvertToRecord(false);
        Assert.assertEquals(tree.size(), 1000);
        for (OIdentifiable id : bag) {
            if (id.getIdentity().getClusterPosition() > 2000)
                Assert.fail("found a wrong rid in the ridbag");
        }
        OSBTreeRidBag secondBag = new OSBTreeRidBag();
        secondBag.setAutoConvertToRecord(false);
        secondBag.setCollectionPointer(tree1.getCollectionPointer());
        Assert.assertEquals(tree1.size(), 1000);
        for (OIdentifiable id : secondBag) {
            if (id.getIdentity().getClusterPosition() < 2000)
                Assert.fail("found a wrong rid in the ridbag");
        }
    } finally {
        exec.shutdown();
        db.drop();
    }
}
Also used : OBonsaiCollectionPointer(com.orientechnologies.orient.core.db.record.ridbag.sbtree.OBonsaiCollectionPointer) OSBTreeRidBag(com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeRidBag) ODatabaseDocumentTx(com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx) OIdentifiable(com.orientechnologies.orient.core.db.record.OIdentifiable) ORecordId(com.orientechnologies.orient.core.id.ORecordId) TimeoutException(java.util.concurrent.TimeoutException) OSBTreeCollectionManager(com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeCollectionManager) OSBTreeBonsaiLocal(com.orientechnologies.orient.core.index.sbtreebonsai.local.OSBTreeBonsaiLocal) ExecutorService(java.util.concurrent.ExecutorService) OAtomicOperationsManager(com.orientechnologies.orient.core.storage.impl.local.paginated.atomicoperations.OAtomicOperationsManager) OAbstractPaginatedStorage(com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage) TimeoutException(java.util.concurrent.TimeoutException) Test(org.testng.annotations.Test)

Example 3 with OSBTreeRidBag

use of com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeRidBag in project orientdb by orientechnologies.

the class ORidBag method replaceWithSBTree.

/**
   * Silently replace delegate by tree implementation.
   * 
   * @param pointer
   *          new collection pointer
   */
private void replaceWithSBTree(OBonsaiCollectionPointer pointer) {
    delegate.requestDelete();
    final OSBTreeRidBag treeBag = new OSBTreeRidBag();
    treeBag.setCollectionPointer(pointer);
    treeBag.setOwner(delegate.getOwner());
    for (OMultiValueChangeListener<OIdentifiable, OIdentifiable> listener : delegate.getChangeListeners()) treeBag.addChangeListener(listener);
    delegate = treeBag;
}
Also used : OSBTreeRidBag(com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeRidBag)

Example 4 with OSBTreeRidBag

use of com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeRidBag in project orientdb by orientechnologies.

the class ORidBag method tryMerge.

/**
   * IMPORTANT! Only for internal usage.
   */
public boolean tryMerge(final ORidBag otherValue, boolean iMergeSingleItemsOfMultiValueFields) {
    if (!isEmbedded() && !otherValue.isEmbedded()) {
        final OSBTreeRidBag thisTree = (OSBTreeRidBag) delegate;
        final OSBTreeRidBag otherTree = (OSBTreeRidBag) otherValue.delegate;
        if (thisTree.getCollectionPointer().equals(otherTree.getCollectionPointer())) {
            thisTree.mergeChanges(otherTree);
            uuid = otherValue.uuid;
            return true;
        }
    } else if (iMergeSingleItemsOfMultiValueFields) {
        final Iterator<OIdentifiable> iter = otherValue.rawIterator();
        while (iter.hasNext()) {
            final OIdentifiable value = iter.next();
            if (value != null) {
                final Iterator<OIdentifiable> localIter = rawIterator();
                boolean found = false;
                while (localIter.hasNext()) {
                    final OIdentifiable v = localIter.next();
                    if (value.equals(v)) {
                        found = true;
                        break;
                    }
                }
                if (!found)
                    add(value);
            }
        }
        return true;
    }
    return false;
}
Also used : OSBTreeRidBag(com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeRidBag) Iterator(java.util.Iterator)

Aggregations

OSBTreeRidBag (com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeRidBag)4 OSBTreeCollectionManager (com.orientechnologies.orient.core.db.record.ridbag.sbtree.OSBTreeCollectionManager)2 ODatabaseDocumentTx (com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx)1 OIdentifiable (com.orientechnologies.orient.core.db.record.OIdentifiable)1 OEmbeddedRidBag (com.orientechnologies.orient.core.db.record.ridbag.embedded.OEmbeddedRidBag)1 OBonsaiCollectionPointer (com.orientechnologies.orient.core.db.record.ridbag.sbtree.OBonsaiCollectionPointer)1 ORecordId (com.orientechnologies.orient.core.id.ORecordId)1 OSBTreeBonsaiLocal (com.orientechnologies.orient.core.index.sbtreebonsai.local.OSBTreeBonsaiLocal)1 ORecord (com.orientechnologies.orient.core.record.ORecord)1 OAbstractPaginatedStorage (com.orientechnologies.orient.core.storage.impl.local.OAbstractPaginatedStorage)1 ORecordSerializationContext (com.orientechnologies.orient.core.storage.impl.local.paginated.ORecordSerializationContext)1 OAtomicOperationsManager (com.orientechnologies.orient.core.storage.impl.local.paginated.atomicoperations.OAtomicOperationsManager)1 Iterator (java.util.Iterator)1 UUID (java.util.UUID)1 ExecutorService (java.util.concurrent.ExecutorService)1 TimeoutException (java.util.concurrent.TimeoutException)1 Test (org.testng.annotations.Test)1