Skip to content

Commit 8a05edd

Browse files
Issue orientechnologies#1404 Write cache memory management issues were fixed.
1 parent 886457e commit 8a05edd

4 files changed

Lines changed: 35 additions & 26 deletions

File tree

core/src/main/java/com/orientechnologies/orient/core/index/hashindex/local/OLocalHashTable.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public V remove(K key) {
214214
final int fileLevel = getFileLevel(bucketPointer);
215215
final V removed;
216216

217-
OCachePointer dataPointer = loadPage(pageIndex, fileLevel);
217+
final OCachePointer dataPointer = loadPage(pageIndex, fileLevel);
218218
dataPointer.acquireExclusiveLock();
219219
try {
220220
final OHashIndexBucket<K, V> bucket = new OHashIndexBucket<K, V>(dataPointer.getDataPointer(), directMemory, keySerializer,
@@ -1122,7 +1122,7 @@ private void doPut(K key, V value) {
11221122
final long pageIndex = getPageIndex(bucketPointer);
11231123
final int fileLevel = getFileLevel(bucketPointer);
11241124

1125-
OCachePointer pagePointer = loadPage(pageIndex, fileLevel);
1125+
final OCachePointer pagePointer = loadPage(pageIndex, fileLevel);
11261126
pagePointer.acquireExclusiveLock();
11271127
try {
11281128
final OHashIndexBucket<K, V> bucket = new OHashIndexBucket<K, V>(pagePointer.getDataPointer(), directMemory, keySerializer,

core/src/main/java/com/orientechnologies/orient/core/index/hashindex/local/cache/OReadWriteDiskCache.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ public void closeFile(long fileId, boolean flush) throws IOException {
162162
+ "can not be freed because it is used.");
163163

164164
cacheEntry.dataPointer.decrementReferrer();
165+
cacheEntry.dataPointer = null;
165166
}
166167
} else {
167168
throw new OStorageException("Page with index " + pageIndex + " for file with id " + fileId + " was not found in cache");
@@ -194,8 +195,11 @@ public void truncateFile(long fileId) throws IOException {
194195
if (cacheEntry != null) {
195196
if (cacheEntry.usagesCount == 0) {
196197
cacheEntry = remove(fileId, pageIndex);
197-
if (cacheEntry.dataPointer != null)
198+
if (cacheEntry.dataPointer != null) {
198199
cacheEntry.dataPointer.decrementReferrer();
200+
cacheEntry.dataPointer = null;
201+
}
202+
199203
}
200204
} else
201205
throw new OStorageException("Page with index " + pageIndex + " was not found in cache for file with id " + fileId);
@@ -225,15 +229,21 @@ public void clear() throws IOException {
225229
writeCache.flush();
226230

227231
for (OReadCacheEntry cacheEntry : am)
228-
if (cacheEntry.usagesCount == 0)
232+
if (cacheEntry.usagesCount == 0) {
229233
cacheEntry.dataPointer.decrementReferrer();
234+
cacheEntry.dataPointer = null;
235+
}
236+
230237
else
231238
throw new OStorageException("Page with index " + cacheEntry.pageIndex + " for file id " + cacheEntry.fileId
232239
+ " is used and can not be removed");
233240

234241
for (OReadCacheEntry cacheEntry : a1in)
235-
if (cacheEntry.usagesCount == 0)
242+
if (cacheEntry.usagesCount == 0) {
236243
cacheEntry.dataPointer.decrementReferrer();
244+
cacheEntry.dataPointer = null;
245+
}
246+
237247
else
238248
throw new OStorageException("Page with index " + cacheEntry.pageIndex + " for file id " + cacheEntry.fileId
239249
+ " is used and can not be removed");
@@ -324,7 +334,6 @@ private void removeColdestPageIfNeeded() throws IOException {
324334
assert !removedFromAInEntry.isDirty;
325335

326336
removedFromAInEntry.dataPointer.decrementReferrer();
327-
328337
removedFromAInEntry.dataPointer = null;
329338

330339
a1out.putToMRU(removedFromAInEntry);
@@ -348,6 +357,7 @@ private void removeColdestPageIfNeeded() throws IOException {
348357
assert !removedEntry.isDirty;
349358

350359
removedEntry.dataPointer.decrementReferrer();
360+
removedEntry.dataPointer = null;
351361

352362
Set<Long> pageEntries = filePages.get(removedEntry.fileId);
353363
pageEntries.remove(removedEntry.pageIndex);

core/src/main/java/com/orientechnologies/orient/core/index/hashindex/local/cache/OWOWCache.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -372,12 +372,13 @@ private void removeCachedPages(long fileId) {
372372
}
373373

374374
private OCachePointer cacheFileContent(long fileId, long pageIndex) throws IOException {
375-
final OFileClassic fileClassic = files.get(fileId);
376375
final long startPosition = pageIndex * pageSize;
377376
final long endPosition = startPosition + pageSize;
378377

379378
byte[] content = new byte[pageSize];
380379
OCachePointer dataPointer;
380+
final OFileClassic fileClassic = files.get(fileId);
381+
381382
if (fileClassic.getFilledUpTo() >= endPosition) {
382383
fileClassic.read(startPosition, content, content.length);
383384
final long pointer = directMemory.allocate(content);
@@ -407,13 +408,8 @@ private void flushPage(long fileId, long pageIndex, long dataPointer) throws IOE
407408

408409
final int crc32 = calculatePageCrc(content);
409410
OIntegerSerializer.INSTANCE.serializeNative(crc32, content, OLongSerializer.LONG_SIZE);
410-
final OFileClassic fileClassic = files.get(fileId);
411-
final long startPosition = pageIndex * pageSize;
412-
final long endPosition = startPosition + pageSize;
413-
414-
if (fileClassic.getFilledUpTo() < endPosition)
415-
fileClassic.allocateSpace((int) (endPosition - fileClassic.getFilledUpTo()));
416411

412+
final OFileClassic fileClassic = files.get(fileId);
417413
fileClassic.write(pageIndex * pageSize, content);
418414

419415
if (syncOnPageFlush)
@@ -683,10 +679,13 @@ private int iterateBySubRing(NavigableMap<GroupKey, WriteGroup> subMap, int writ
683679
pagePointer.releaseExclusiveLock();
684680
}
685681

686-
pagePointer.decrementReferrer();
687682
}
688683
}
689684

685+
for (OCachePointer pagePointer : group.pages)
686+
if (pagePointer != null)
687+
pagePointer.decrementReferrer();
688+
690689
entriesIterator.remove();
691690
flushedWriteGroups++;
692691

core/src/main/java/com/orientechnologies/orient/core/storage/impl/local/paginated/OLocalPaginatedCluster.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ else if (transaction != null)
530530
long prevPageIndex = prevPageRecordPointer >>> PAGE_INDEX_OFFSET;
531531
int prevPageRecordPosition = (int) (prevPageRecordPointer & RECORD_POSITION_MASK);
532532

533-
OCachePointer prevPageMemoryPointer = diskCache.load(fileId, prevPageIndex);
533+
final OCachePointer prevPageMemoryPointer = diskCache.load(fileId, prevPageIndex);
534534
prevPageMemoryPointer.acquireExclusiveLock();
535535
try {
536536
final OLocalPage prevPage = new OLocalPage(prevPageMemoryPointer.getDataPointer(), false, OLocalPage.TrackMode.BOTH);
@@ -748,7 +748,7 @@ else if (transaction != null || isRecordSpreadAcrossSeveralPages)
748748
long nextPagePointer = -1;
749749
int removedContentSize = 0;
750750
do {
751-
OCachePointer pointer = diskCache.load(fileId, pageIndex);
751+
final OCachePointer pointer = diskCache.load(fileId, pageIndex);
752752
pointer.acquireExclusiveLock();
753753
int initialFreePageIndex;
754754
try {
@@ -865,7 +865,7 @@ else if (transaction != null || isRecordSpreadAcrossSeveralPages)
865865
pageIndex = pagePointer >>> PAGE_INDEX_OFFSET;
866866

867867
int freePageIndex;
868-
OCachePointer dataPointer = diskCache.load(fileId, pageIndex);
868+
final OCachePointer dataPointer = diskCache.load(fileId, pageIndex);
869869
dataPointer.acquireExclusiveLock();
870870
try {
871871
final OLocalPage localPage = new OLocalPage(dataPointer.getDataPointer(), false, trackMode);
@@ -895,7 +895,7 @@ else if (transaction != null || isRecordSpreadAcrossSeveralPages)
895895
long prevPageIndex = prevPageRecordPointer >>> PAGE_INDEX_OFFSET;
896896
int prevPageRecordPosition = (int) (prevPageRecordPointer & RECORD_POSITION_MASK);
897897

898-
OCachePointer prevPageMemoryPointer = diskCache.load(fileId, prevPageIndex);
898+
final OCachePointer prevPageMemoryPointer = diskCache.load(fileId, prevPageIndex);
899899
prevPageMemoryPointer.acquireExclusiveLock();
900900
try {
901901
final OLocalPage prevPage = new OLocalPage(prevPageMemoryPointer.getDataPointer(), false, trackMode);
@@ -958,7 +958,7 @@ else if (transaction != null || isRecordSpreadAcrossSeveralPages)
958958
long prevPageIndex = prevPageRecordPointer >>> PAGE_INDEX_OFFSET;
959959
int prevPageRecordPosition = (int) (prevPageRecordPointer & RECORD_POSITION_MASK);
960960

961-
OCachePointer prevPageMemoryPointer = diskCache.load(fileId, prevPageIndex);
961+
final OCachePointer prevPageMemoryPointer = diskCache.load(fileId, prevPageIndex);
962962
prevPageMemoryPointer.acquireExclusiveLock();
963963
try {
964964
final OLocalPage prevPage = new OLocalPage(prevPageMemoryPointer.getDataPointer(), false, trackMode);
@@ -1063,7 +1063,7 @@ private void revertPageData(OUpdatePageRecord updatePageRecord) throws IOExcepti
10631063
}
10641064

10651065
long pageIndex = updatePageRecord.getPageIndex();
1066-
OCachePointer pagePointer = diskCache.load(fileId, pageIndex);
1066+
final OCachePointer pagePointer = diskCache.load(fileId, pageIndex);
10671067
pagePointer.acquireExclusiveLock();
10681068
try {
10691069
final OLocalPage page = new OLocalPage(pagePointer.getDataPointer(), false, OLocalPage.TrackMode.NONE);
@@ -1093,7 +1093,7 @@ private void revertPageData(OUpdatePageRecord updatePageRecord) throws IOExcepti
10931093

10941094
private void restorePageData(OUpdatePageRecord updatePageRecord) throws IOException {
10951095
long pageIndex = updatePageRecord.getPageIndex();
1096-
OCachePointer pagePointer = diskCache.load(fileId, pageIndex);
1096+
final OCachePointer pagePointer = diskCache.load(fileId, pageIndex);
10971097
pagePointer.acquireExclusiveLock();
10981098
try {
10991099
final OLocalPage page = new OLocalPage(pagePointer.getDataPointer(), false, OLocalPage.TrackMode.NONE);
@@ -1116,7 +1116,7 @@ private AddEntryResult addEntry(ORecordVersion recordVersion, byte[] entryConten
11161116
long pageIndex = findFreePageResult.pageIndex;
11171117
boolean newRecord = freePageIndex >= freePageLists.length;
11181118

1119-
OCachePointer pagePointer = diskCache.load(fileId, pageIndex);
1119+
final OCachePointer pagePointer = diskCache.load(fileId, pageIndex);
11201120
pagePointer.acquireExclusiveLock();
11211121
int recordSizesDiff;
11221122
int position;
@@ -1191,7 +1191,7 @@ private FindFreePageResult findFreePage(int contentSize, OLocalPage.TrackMode tr
11911191
}
11921192

11931193
private void updateFreePagesIndex(int prevFreePageIndex, long pageIndex, OLocalPage.TrackMode trackMode) throws IOException {
1194-
OCachePointer pointer = diskCache.load(fileId, pageIndex);
1194+
final OCachePointer pointer = diskCache.load(fileId, pageIndex);
11951195
pointer.acquireExclusiveLock();
11961196
try {
11971197
final OLocalPage localPage = new OLocalPage(pointer.getDataPointer(), false, trackMode);
@@ -1204,7 +1204,7 @@ private void updateFreePagesIndex(int prevFreePageIndex, long pageIndex, OLocalP
12041204
long prevPageIndex = localPage.getPrevPage();
12051205

12061206
if (prevPageIndex >= 0) {
1207-
OCachePointer prevPagePointer = diskCache.load(fileId, prevPageIndex);
1207+
final OCachePointer prevPagePointer = diskCache.load(fileId, prevPageIndex);
12081208
prevPagePointer.acquireExclusiveLock();
12091209
try {
12101210
final OLocalPage prevPage = new OLocalPage(prevPagePointer.getDataPointer(), false, trackMode);
@@ -1221,7 +1221,7 @@ private void updateFreePagesIndex(int prevFreePageIndex, long pageIndex, OLocalP
12211221
}
12221222

12231223
if (nextPageIndex >= 0) {
1224-
OCachePointer nextPagePointer = diskCache.load(fileId, nextPageIndex);
1224+
final OCachePointer nextPagePointer = diskCache.load(fileId, nextPageIndex);
12251225
nextPagePointer.acquireExclusiveLock();
12261226
try {
12271227
final OLocalPage nextPage = new OLocalPage(nextPagePointer.getDataPointer(), false, trackMode);
@@ -1254,7 +1254,7 @@ private void updateFreePagesIndex(int prevFreePageIndex, long pageIndex, OLocalP
12541254
if (newFreePageIndex >= 0) {
12551255
long oldFreePage = freePageLists[newFreePageIndex];
12561256
if (oldFreePage >= 0) {
1257-
OCachePointer oldFreePagePointer = diskCache.load(fileId, oldFreePage);
1257+
final OCachePointer oldFreePagePointer = diskCache.load(fileId, oldFreePage);
12581258
oldFreePagePointer.acquireExclusiveLock();
12591259
try {
12601260
final OLocalPage oldFreeLocalPage = new OLocalPage(oldFreePagePointer.getDataPointer(), false, trackMode);

0 commit comments

Comments
 (0)