Examples of RAFLock


Examples of freenet.support.api.LockableRandomAccessBuffer.RAFLock

        PooledFileRandomAccessBuffer b = construct(sz);
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 1);
        assertEquals(PooledFileRandomAccessBuffer.getClosableFDs(), 1);
        assertFalse(a.isLocked());
        assertFalse(b.isLocked());
        RAFLock lock = a.lockOpen();
        try {
            assertTrue(a.isLocked());
            assertFalse(b.isLocked());
            assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 1);
            assertEquals(PooledFileRandomAccessBuffer.getClosableFDs(), 0);
        } finally {
            lock.unlock();
            assertFalse(a.isLocked());
            assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 1);
            assertEquals(PooledFileRandomAccessBuffer.getClosableFDs(), 1);
        }
        a.close();
View Full Code Here

Examples of freenet.support.api.LockableRandomAccessBuffer.RAFLock

    /** Thanks bertm */
    public void testLocksB() throws IOException {
        PooledFileRandomAccessBuffer.setMaxFDs(1);
        PooledFileRandomAccessBuffer a = construct(0);
        PooledFileRandomAccessBuffer b = construct(0);
        RAFLock lock = b.lockOpen();
        lock.unlock();
        a.close();
        b.close();
        a.free();
        b.free();
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 0);
View Full Code Here

Examples of freenet.support.api.LockableRandomAccessBuffer.RAFLock

        assertTrue(a.isOpen());
        assertTrue(b.isOpen());
        assertFalse(a.isLocked());
        assertFalse(b.isLocked());
        // Open and open FD -> locked
        RAFLock la = a.lockOpen();
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 2);
        assertEquals(PooledFileRandomAccessBuffer.getClosableFDs(), 1);
        RAFLock lb = b.lockOpen();
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 2);
        assertEquals(PooledFileRandomAccessBuffer.getClosableFDs(), 0);
        la.unlock();
        lb.unlock();
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 2);
        assertEquals(PooledFileRandomAccessBuffer.getClosableFDs(), 2);      
        a.close();
        b.close();
    }
View Full Code Here

Examples of freenet.support.api.LockableRandomAccessBuffer.RAFLock

        a.closeRAF();
        b.closeRAF();
        assertFalse(a.isLocked());
        assertFalse(b.isLocked());
        // Open and open FD -> locked
        RAFLock la = a.lockOpen();
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 1);
        assertEquals(PooledFileRandomAccessBuffer.getClosableFDs(), 1);
        RAFLock lb = b.lockOpen();
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 2);
        assertEquals(PooledFileRandomAccessBuffer.getClosableFDs(), 0);
        la.unlock();
        lb.unlock();
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 2);
        assertEquals(PooledFileRandomAccessBuffer.getClosableFDs(), 2);
        a.close();
        b.close();
    }
View Full Code Here

Examples of freenet.support.api.LockableRandomAccessBuffer.RAFLock

        final PooledFileRandomAccessBuffer a = construct(sz);
        final PooledFileRandomAccessBuffer b = construct(sz);
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 1);
        assertFalse(a.isLocked());
        assertFalse(b.isLocked());
        RAFLock lock = a.lockOpen();
        assertTrue(a.isOpen());
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 1);
        // Now try to lock on a second thread.
        // It should wait until the first thread unlocks.
        class Status {
            boolean hasStarted;
            boolean hasLocked;
            boolean canFinish;
            boolean hasFinished;
            boolean success;
        }
        final Status s = new Status();
        Runnable r = new Runnable() {
           
            @Override
            public void run() {
                synchronized(s) {
                    s.hasStarted = true;
                    s.notify();
                }
                try {
                    RAFLock lock = b.lockOpen();
                    synchronized(s) {
                        s.hasLocked = true;
                        s.notify();
                    }
                    synchronized(s) {
                        while(!s.canFinish)
                            try {
                                s.wait();
                            } catch (InterruptedException e) {
                                // Ignore.
                            }
                    }
                    lock.unlock();
                    synchronized(s) {
                        s.success = true;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    fail("Caught IOException trying to lock: "+e);
                } finally {
                    synchronized(s) {
                        s.hasFinished = true;
                        s.notify();
                    }
                }
            }
           
        };
        new Thread(r).start();
        // Wait for it to start.
        synchronized(s) {
            while(!s.hasStarted) {
                s.wait();
            }
            assertFalse(s.hasLocked);
            assertFalse(s.hasFinished);
        }
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 1);
        assertTrue(a.isOpen());
        assertFalse(b.isOpen());
        // Wait while holding lock, to give it some time to progress if it's buggy.
        Thread.sleep(100);
        synchronized(s) {
            assertFalse(s.hasLocked);
            assertFalse(s.hasFinished);
        }
        assertEquals(PooledFileRandomAccessBuffer.getOpenFDs(), 1);
        assertTrue(a.isOpen());
        assertFalse(b.isOpen());
        // Now release lock.
        lock.unlock();
        // Wait for it to proceed.
        synchronized(s) {
            while(!(s.hasLocked || s.hasFinished))
                s.wait();
            assertTrue(s.hasLocked);
View Full Code Here

Examples of freenet.support.api.LockableRandomAccessBuffer.RAFLock

        }
        parent.fetcher.queueHeal(data, cryptoKey, cryptoAlgorithm);
    }

    private synchronized byte[][] readAllBlocks() throws IOException {
        RAFLock lock = parent.lockRAFOpen();
        try {
            // FIXME consider using a single big byte[].
            byte[][] ret = new byte[blocksForDecode()][];
            for(int i=0;i<ret.length;i++)
                ret[i] = readBlock(i);
            return ret;
        } finally {
            lock.unlock();
        }
    }
View Full Code Here

Examples of freenet.support.api.LockableRandomAccessBuffer.RAFLock

        }
    }

    /** Write a full set of data blocks to disk and update the metadata accordingly. */
    private void writeAllDataBlocks(byte[][] dataBlocks) throws IOException {
        RAFLock lock = parent.lockRAFOpen();
        try {
            synchronized(this) {
                assert(dataBlocks.length == blocksForDecode());
                for(int i=0;i<dataBlocks.length;i++) {
                    writeDownloadedBlock(i, dataBlocks[i]);
                    blockChooser.onSuccess(i);
                    blocksFetched[i] = (short)i;
                }
                succeeded = true;
            }
        } finally {
            lock.unlock();
        }
    }
View Full Code Here

Examples of freenet.support.api.LockableRandomAccessBuffer.RAFLock

                }
                slotNumber = findFreeSlot();
                assert(slotNumber != -1);
                blocksFetched[slotNumber] = blockNumber;
                blockChooser.onSuccess(blockNumber);
                RAFLock lock = parent.lockRAFOpen();
                try {
                    writeDownloadedBlock(slotNumber, decodedData);
                    saved = true;
                } catch (IOException e) {
                    blocksFetched[slotNumber] = -1;
                    blockChooser.onUnSuccess(blockNumber);
                    Logger.error(this, "Unable to write downloaded block to disk: "+e, e);
                    throw e;
                } finally {
                    lock.unlock();
                }
                if(crossSegmentsByBlock != null && blockNumber < crossSegmentsByBlock.length) {
                    callback = crossSegmentsByBlock[blockNumber];
                }
                nextBlockNumber = (short) blockChooser.getBlockNumber(keys, key);
View Full Code Here

Examples of freenet.support.api.LockableRandomAccessBuffer.RAFLock

            raf = diskSpaceCheckingRAFFactory.createNewRAF(storageFile, totalLength, random);
            Logger.normal(this, "Creating splitfile storage file for complete-via-truncation: "+storageFile);
        } else {
            raf = rafFactory.makeRAF(totalLength);
        }
        RAFLock lock = raf.lockOpen();
        try {
            for(int i=0;i<segments.length;i++) {
                SplitFileFetcherSegmentStorage segment = segments[i];
                segment.writeKeysWithChecksum(segmentKeys[i]);
            }
            if(persistent) {
                for(SplitFileFetcherSegmentStorage segment : segments)
                    segment.writeMetadata();
                raf.pwrite(offsetGeneralProgress, generalProgress, 0, generalProgress.length);
                keyListener.innerWriteMainBloomFilter(offsetMainBloomFilter);
                keyListener.initialWriteSegmentBloomFilters(offsetSegmentBloomFilters);
                BucketTools.copyTo(metadataTemp, raf, offsetOriginalMetadata, -1);
                metadataTemp.free();
                raf.pwrite(offsetOriginalDetails, encodedURI, 0, encodedURI.length);
                raf.pwrite(offsetBasicSettings, encodedBasicSettings, 0, encodedBasicSettings.length);
               
                // This bit tricky because version is included in the checksum.
                // When the RAF is encrypted, we use HMAC's and this is important.
                // FIXME is Fields.bytesToInt etc compatible with DataOutputStream.*?
                // FIXME if not, we need something that is ...
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                DataOutputStream dos = new DataOutputStream(baos);
                dos.writeInt(encodedBasicSettings.length - checksumLength);
                byte[] bufToWrite = baos.toByteArray();
                baos = new ByteArrayOutputStream();
                dos = new DataOutputStream(baos);
                dos.writeInt(0); // flags
                dos.writeShort(checksumChecker.getChecksumTypeID());
                dos.writeInt(VERSION);
                byte[] version = baos.toByteArray();
                byte[] bufToChecksum = Arrays.copyOf(bufToWrite, bufToWrite.length+version.length);
                System.arraycopy(version, 0, bufToChecksum, bufToWrite.length, version.length);
                byte[] checksum =
                    checksumChecker.generateChecksum(bufToChecksum);
                // Pointers.
                raf.pwrite(offsetBasicSettings + encodedBasicSettings.length, bufToWrite, 0,
                        bufToWrite.length);
                // Checksum.
                raf.pwrite(offsetBasicSettings + encodedBasicSettings.length + bufToWrite.length,
                        checksum, 0, checksum.length);
                // Version.
                raf.pwrite(offsetBasicSettings + encodedBasicSettings.length + bufToWrite.length +
                        checksum.length, version, 0, version.length);
                // Write magic last.
                baos = new ByteArrayOutputStream();
                dos = new DataOutputStream(baos);
                dos.writeLong(END_MAGIC);
                byte[] buf = baos.toByteArray();
                raf.pwrite(totalLength - 8, buf, 0, 8);
            }
        } finally {
            lock.unlock();
        }
        if(logMINOR) Logger.minor(this, "Fetching "+thisKey+" on "+this+" for "+fetcher);
    }
View Full Code Here

Examples of freenet.support.api.LockableRandomAccessBuffer.RAFLock

        return checksumChecker.appendChecksum(data);
    }
   
    void preadChecksummed(long fileOffset, byte[] buf, int offset, int length) throws IOException, ChecksumFailedException {
        byte[] checksumBuf = new byte[checksumLength];
        RAFLock lock = raf.lockOpen();
        try {
            raf.pread(fileOffset, buf, offset, length);
            raf.pread(fileOffset+length, checksumBuf, 0, checksumLength);
        } finally {
            lock.unlock();
        }
        if(!checksumChecker.checkChecksum(buf, offset, length, checksumBuf)) {
            Arrays.fill(buf, offset, offset+length, (byte)0);
            throw new ChecksumFailedException();
        }
View Full Code Here
TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.