use of com.orientechnologies.orient.core.storage.cache.OCacheEntry in project orientdb by orientechnologies.
the class OClusterPositionMap method remove.
public OClusterPositionMapBucket.PositionEntry remove(final long clusterPosition) throws IOException {
startOperation();
try {
OAtomicOperation atomicOperation = startAtomicOperation(true);
acquireExclusiveLock();
try {
long pageIndex = clusterPosition / OClusterPositionMapBucket.MAX_ENTRIES;
int index = (int) (clusterPosition % OClusterPositionMapBucket.MAX_ENTRIES);
Exception exception = null;
final OCacheEntry cacheEntry = loadPage(atomicOperation, fileId, pageIndex, false, 1);
cacheEntry.acquireExclusiveLock();
try {
final OClusterPositionMapBucket bucket = new OClusterPositionMapBucket(cacheEntry, getChanges(atomicOperation, cacheEntry));
return bucket.remove(index);
} catch (Exception e) {
exception = e;
throw OException.wrapException(new OClusterPositionMapException("Error during removal of mapping between logical and physical record position", this), e);
} finally {
try {
cacheEntry.releaseExclusiveLock();
releasePage(atomicOperation, cacheEntry);
} finally {
endAtomicOperation(exception != null, exception);
}
}
} finally {
releaseExclusiveLock();
}
} finally {
completeOperation();
}
}
use of com.orientechnologies.orient.core.storage.cache.OCacheEntry in project orientdb by orientechnologies.
the class OClusterPositionMap method update.
public void update(final long clusterPosition, final OClusterPositionMapBucket.PositionEntry entry) throws IOException {
startOperation();
try {
OAtomicOperation atomicOperation = startAtomicOperation(true);
acquireExclusiveLock();
try {
final long pageIndex = clusterPosition / OClusterPositionMapBucket.MAX_ENTRIES;
final int index = (int) (clusterPosition % OClusterPositionMapBucket.MAX_ENTRIES);
if (pageIndex >= getFilledUpTo(atomicOperation, fileId))
throw new OClusterPositionMapException("Passed in cluster position " + clusterPosition + " is outside of range of cluster-position map", this);
final OCacheEntry cacheEntry = loadPage(atomicOperation, fileId, pageIndex, false, 1);
cacheEntry.acquireExclusiveLock();
try {
final OClusterPositionMapBucket bucket = new OClusterPositionMapBucket(cacheEntry, getChanges(atomicOperation, cacheEntry));
bucket.set(index, entry);
} finally {
cacheEntry.releaseExclusiveLock();
releasePage(atomicOperation, cacheEntry);
}
endAtomicOperation(false, null);
} catch (IOException e) {
endAtomicOperation(true, e);
throw OException.wrapException(new OClusterPositionMapException("Error of update of mapping between logical and physical record position", this), e);
} catch (RuntimeException e) {
endAtomicOperation(true, e);
throw OException.wrapException(new OClusterPositionMapException("Error of update of mapping between logical and physical record position", this), e);
} finally {
releaseExclusiveLock();
}
} finally {
completeOperation();
}
}
use of com.orientechnologies.orient.core.storage.cache.OCacheEntry in project orientdb by orientechnologies.
the class LRUListTest method testAddOneRemoveLRU.
@Test
public void testAddOneRemoveLRU() {
final OByteBufferPool bufferPool = new OByteBufferPool(1);
ByteBuffer buffer = bufferPool.acquireDirect(true);
OCachePointer cachePointerOne = new OCachePointer(buffer, bufferPool, new OLogSequenceNumber(0, 0), 0, 0);
lruList.putToMRU(new OCacheEntry(1, 10, cachePointerOne, false));
lruList.removeLRU();
Assert.assertEquals(lruList.size(), 0);
Iterator<OCacheEntry> entryIterator = lruList.iterator();
Assert.assertFalse(entryIterator.hasNext());
}
use of com.orientechnologies.orient.core.storage.cache.OCacheEntry in project orientdb by orientechnologies.
the class LRUListTest method testSingleAdd.
@Test
public void testSingleAdd() {
final OByteBufferPool bufferPool = new OByteBufferPool(1);
final ByteBuffer buffer = bufferPool.acquireDirect(true);
OCachePointer cachePointer = new OCachePointer(buffer, bufferPool, new OLogSequenceNumber(0, 0), 0, 0);
lruList.putToMRU(new OCacheEntry(1, 10, cachePointer, false));
Iterator<OCacheEntry> entryIterator = lruList.iterator();
Assert.assertTrue(entryIterator.hasNext());
Assert.assertEquals(entryIterator.next(), new OCacheEntry(1, 10, cachePointer, false));
}
use of com.orientechnologies.orient.core.storage.cache.OCacheEntry in project orientdb by orientechnologies.
the class OSBTreeBonsaiLeafBucketTest method testSearch.
public void testSearch() throws Exception {
long seed = System.currentTimeMillis();
System.out.println("testSearch seed : " + seed);
TreeSet<Long> keys = new TreeSet<Long>();
Random random = new Random(seed);
while (keys.size() < 2 * OSBTreeBonsaiBucket.MAX_BUCKET_SIZE_BYTES / OLongSerializer.LONG_SIZE) {
keys.add(random.nextLong());
}
OByteBufferPool bufferPool = OByteBufferPool.instance();
ByteBuffer buffer = bufferPool.acquireDirect(true);
OCachePointer cachePointer = new OCachePointer(buffer, bufferPool, new OLogSequenceNumber(0, 0), 0, 0);
cachePointer.incrementReferrer();
OCacheEntry cacheEntry = new OCacheEntry(0, 0, cachePointer, false);
cacheEntry.acquireExclusiveLock();
OSBTreeBonsaiBucket<Long, OIdentifiable> treeBucket = new OSBTreeBonsaiBucket<Long, OIdentifiable>(cacheEntry, 0, true, OLongSerializer.INSTANCE, OLinkSerializer.INSTANCE, null, null);
int index = 0;
Map<Long, Integer> keyIndexMap = new HashMap<Long, Integer>();
for (Long key : keys) {
if (!treeBucket.addEntry(index, new OSBTreeBonsaiBucket.SBTreeEntry<Long, OIdentifiable>(OBonsaiBucketPointer.NULL, OBonsaiBucketPointer.NULL, key, new ORecordId(index, index)), true))
break;
keyIndexMap.put(key, index);
index++;
}
Assert.assertEquals(treeBucket.size(), keyIndexMap.size());
for (Map.Entry<Long, Integer> keyIndexEntry : keyIndexMap.entrySet()) {
int bucketIndex = treeBucket.find(keyIndexEntry.getKey());
Assert.assertEquals(bucketIndex, (int) keyIndexEntry.getValue());
}
cacheEntry.releaseExclusiveLock();
cachePointer.decrementReferrer();
}
Aggregations