public void testUpdateOneBigRecord() throws IOException { byte[] bigRecord = new byte[2 * 65536 + 100]; MersenneTwisterFast mersenneTwisterFast = new MersenneTwisterFast(); mersenneTwisterFast.nextBytes(bigRecord); ORecordVersion recordVersion = OVersionFactory.instance().createVersion(); recordVersion.increment(); recordVersion.increment(); OPhysicalPosition physicalPosition = paginatedCluster.createRecord(bigRecord, recordVersion, (byte) 1); Assert.assertEquals(physicalPosition.clusterPosition, OClusterPositionFactory.INSTANCE.valueOf(0)); recordVersion.increment(); bigRecord = new byte[2 * 65536 + 20]; mersenneTwisterFast.nextBytes(bigRecord); paginatedCluster.updateRecord(physicalPosition.clusterPosition, bigRecord, recordVersion, (byte) 2); ORawBuffer rawBuffer = paginatedCluster.readRecord(physicalPosition.clusterPosition); Assert.assertNotNull(rawBuffer); Assert.assertEquals(rawBuffer.version, recordVersion); Assert.assertEquals(rawBuffer.buffer, bigRecord); Assert.assertEquals(rawBuffer.recordType, 2); }
public void testRecordOverflowGrowFactor() throws Exception { paginatedCluster.set(OCluster.ATTRIBUTES.COMPRESSION, ONothingCompression.NAME); paginatedCluster.set(OCluster.ATTRIBUTES.RECORD_GROW_FACTOR, 1.5); paginatedCluster.set(OCluster.ATTRIBUTES.RECORD_OVERFLOW_GROW_FACTOR, 2.5); byte[] record = new byte[100]; Random random = new Random(); random.nextBytes(record); ORecordVersion version = OVersionFactory.instance().createVersion(); OPhysicalPosition physicalPosition = paginatedCluster.createRecord(record, version, (byte) 1); record = new byte[150]; random.nextBytes(record); paginatedCluster.updateRecord(physicalPosition.clusterPosition, record, version, (byte) 1); OCacheEntry cacheEntry = diskCache.load(1, 1, false); int recordIndex = (int) (physicalPosition.clusterPosition.longValue() & 0xFFFF); OCachePointer pagePointer = cacheEntry.getCachePointer(); OClusterPage page = new OClusterPage(pagePointer.getDataPointer(), false, ODurablePage.TrackMode.NONE); Assert.assertEquals(page.getRecordSize(recordIndex), record.length + RECORD_SYSTEM_INFORMATION); diskCache.release(cacheEntry); record = new byte[200]; random.nextBytes(record); paginatedCluster.updateRecord(physicalPosition.clusterPosition, record, version, (byte) 1); cacheEntry = diskCache.load(1, 1, false); pagePointer = cacheEntry.getCachePointer(); page = new OClusterPage(pagePointer.getDataPointer(), false, ODurablePage.TrackMode.NONE); int fullContentSize = 500 + OIntegerSerializer.INT_SIZE + OByteSerializer.BYTE_SIZE; // type + real size Assert.assertEquals(page.getRecordSize(recordIndex), 150 + RECORD_SYSTEM_INFORMATION); fullContentSize -= 150 + RECORD_SYSTEM_INFORMATION - OByteSerializer.BYTE_SIZE - OLongSerializer.LONG_SIZE; Assert.assertEquals(page.getRecordSize(recordIndex + 1), fullContentSize + (OByteSerializer.BYTE_SIZE + OLongSerializer.LONG_SIZE)); diskCache.release(cacheEntry); }
public void testUpdateManySmallRecords() throws IOException { final int records = 10000; long seed = System.currentTimeMillis(); MersenneTwisterFast mersenneTwisterFast = new MersenneTwisterFast(seed); System.out.println("testUpdateManySmallRecords seed : " + seed); Map<OClusterPosition, byte[]> positionRecordMap = new HashMap<OClusterPosition, byte[]>(); Set<OClusterPosition> updatedPositions = new HashSet<OClusterPosition>(); ORecordVersion recordVersion = OVersionFactory.instance().createVersion(); recordVersion.increment(); recordVersion.increment(); for (int i = 0; i < records; i++) { int recordSize = mersenneTwisterFast.nextInt(OClusterPage.MAX_RECORD_SIZE - 1) + 1; byte[] smallRecord = new byte[recordSize]; mersenneTwisterFast.nextBytes(smallRecord); final OPhysicalPosition physicalPosition = paginatedCluster.createRecord(smallRecord, recordVersion, (byte) 2); positionRecordMap.put(physicalPosition.clusterPosition, smallRecord); } ORecordVersion newRecordVersion = OVersionFactory.instance().createVersion(); newRecordVersion.copyFrom(recordVersion); newRecordVersion.increment(); for (OClusterPosition clusterPosition : positionRecordMap.keySet()) { if (mersenneTwisterFast.nextBoolean()) { int recordSize = mersenneTwisterFast.nextInt(OClusterPage.MAX_RECORD_SIZE - 1) + 1; byte[] smallRecord = new byte[recordSize]; mersenneTwisterFast.nextBytes(smallRecord); paginatedCluster.updateRecord(clusterPosition, smallRecord, newRecordVersion, (byte) 3); positionRecordMap.put(clusterPosition, smallRecord); updatedPositions.add(clusterPosition); } } for (Map.Entry<OClusterPosition, byte[]> entry : positionRecordMap.entrySet()) { ORawBuffer rawBuffer = paginatedCluster.readRecord(entry.getKey()); Assert.assertNotNull(rawBuffer); Assert.assertEquals(rawBuffer.buffer, entry.getValue()); if (updatedPositions.contains(entry.getKey())) { Assert.assertEquals(rawBuffer.version, newRecordVersion); Assert.assertEquals(rawBuffer.recordType, 3); } else { Assert.assertEquals(rawBuffer.version, recordVersion); Assert.assertEquals(rawBuffer.recordType, 2); } } }
public void testUpdateOneSmallRecord() throws IOException { byte[] smallRecord = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; ORecordVersion recordVersion = OVersionFactory.instance().createVersion(); recordVersion.increment(); recordVersion.increment(); OPhysicalPosition physicalPosition = paginatedCluster.createRecord(smallRecord, recordVersion, (byte) 1); Assert.assertEquals(physicalPosition.clusterPosition, OClusterPositionFactory.INSTANCE.valueOf(0)); recordVersion.increment(); smallRecord = new byte[] { 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3 }; paginatedCluster.updateRecord(physicalPosition.clusterPosition, smallRecord, recordVersion, (byte) 2); ORawBuffer rawBuffer = paginatedCluster.readRecord(physicalPosition.clusterPosition); Assert.assertNotNull(rawBuffer); Assert.assertEquals(rawBuffer.version, recordVersion); Assert.assertEquals(rawBuffer.buffer, smallRecord); Assert.assertEquals(rawBuffer.recordType, 2); }