private void checkFreeSpace() throws IOException { final long freeSpace = fileStore.getUsableSpace(); //system has unlimited amount of free space if (freeSpace < 0) return; if (walSizeHardLimit < 0 && freeSpace > freeSpaceLimit) { //(free space occupied by WAL + the rest of free space) / 2 //so if WAL is empty we will consume half of free space provided to database walSizeLimit = (logSize.get() + freeSpace) / 2; } if (freeSpace < freeSpaceLimit) { for (final OLowDiskSpaceListener listener : lowDiskSpaceListeners) { listener.lowDiskSpace(new OLowDiskSpaceInformation(freeSpace, freeSpaceLimit)); } } }
/** * This method is called once new pages are added to the disk inside of * {@link OWriteCache#load(long, long, int, boolean, OModifiableBoolean, boolean)} method. * If total amount of added pages minus amount of added pages at the time of last disk space check bigger than threshold value * {@link #diskSizeCheckInterval} new disk space check is performed and if amount of space left on disk less than threshold * {@link * #freeSpaceLimit} then database is switched in "read only" mode * * @param pagesAdded Amount of pages added during call of <code>load</code> method. */ private void freeSpaceCheckAfterNewPageAdd(final int pagesAdded) throws IOException { final long newPagesAdded = amountOfNewPagesAdded.addAndGet(pagesAdded); final long lastSpaceCheck = lastDiskSpaceCheck.get(); if (newPagesAdded - lastSpaceCheck > diskSizeCheckInterval || lastSpaceCheck == 0) { //usable space may be less than free space final long freeSpace = Files.getFileStore(storagePath).getUsableSpace(); if (freeSpace < freeSpaceLimit) { callLowSpaceListeners(new OLowDiskSpaceInformation(freeSpace, freeSpaceLimit)); } lastDiskSpaceCheck.lazySet(newPagesAdded); } }