Re: [freenet-dev] [freenet-cvs] r19857 - branches/saltedhash…

Top Page
Author: Matthew Toseland
Date:  
To: devl
Subject: Re: [freenet-dev] [freenet-cvs] r19857 - branches/saltedhashstore/freenet/src/freenet/store
Delete this message
Reply to this message
gpg: Signature made Fri May 9 22:39:12 2008 UTC using DSA key ID E43DA450
gpg: Good signature from "Matthew John Toseland <toad@amphibian.dyndns.org>"
On Friday 09 May 2008 03:09, j16sdiz@??? wrote:
>
>         /**
> -         * Sample to take at a time
> +         * Scan all entries and try to move them
>          */
> -        private static final double SAMPLE_RATE = 0.05; // 5%
> +        private void moveOldEntry0(boolean queueItem) {
> +            newEntries = 0;
> +            oldEntries = 0;
> +            freeEntries = 0;
> +            resolvedEntries = 0;
> +            droppedEntries = 0;
>
> +            List oldItems = null;
> +            if (queueItem) {
> +                oldItems = new ArrayList();
> +            }
> +
> +            long maxOffset = maxOldItemOffset;
> +            maxOldItemOffset = 0;
> +            for (long offset = 0; offset <= maxOffset; offset++) {
> +                if (logDEBUG && offset % 1024 == 0) {
> +                    Logger.debug(this, "Resize progress: newEntries=" + newEntries + ",

oldEntries=" + oldEntries
> +                     + ", freeEntries=" + freeEntries + ", resolvedEntries=" +

resolvedEntries
> +                     + ", droppedEntries=" + droppedEntries);
> +                }
> +
> +                if (shutdown)
> +                    return;
> +
> +                if (!lockEntry(offset)) //lock
> +                    continue;
> +                try {
> +                    Entry entry = readEntry(offset, null);
> +
> +                    if (entry.isFree()) {
> +                        // free block
> +                        freeEntries++;
> +                    } else if (entry.getStoreSize() == storeSize) {
> +                        // new store size entries
> +                        maxOldItemOffset = offset;
> +                        newEntries++;
> +                    } else { // if (entry.getStoreSize() == prevStoreSize)
> +                        // old store size entries, try to move them
> +                        oldEntries++;
> +                        maxOldItemOffset = offset;
> +
> +                        entry.setStoreSize(storeSize);
> +                        long newOffset = entry.getOffset();
> +
> +                        if (newOffset == offset) { // lucky!
> +                            writeEntry(entry); // write back entry storeSize
> +                            resolvedEntries++;
> +                            continue;
> +                        }
> +
> +                        if (!lockEntry(newOffset)) // lock
> +                            continue;
> +                        try {
> +                            // see what's in the new offset
> +                            Entry newOffsetEntry = readEntry(newOffset, null);
> +
> +                            if (newOffsetEntry.isFree()) {
> +                                // the new offset is freeeeeeee..
> +                                writeEntry(entry);
> +                                freeOffset(offset);
> +                                resolvedEntries++;
> +                            } else if (newOffsetEntry.getStoreSize() == storeSize) {
> +                                // new offset already have a new entry, free old entry
> +                                freeOffset(offset);
> +                                droppedEntries++;
> +                            } else if (Arrays.equals(entry.digestedRoutingKey,

newOffsetEntry.digestedRoutingKey)) {
> +                                // same digested routing key, free the old entry
> +                                freeOffset(offset);
> +                                resolvedEntries++;
> +                            } else if (queueItem) {
> +                                // break tie by moveing old item to queue
> +                                if (oldItems.size() * entryTotalLength < RESIZE_MEMORY) {
> +                                    oldItems.add(newOffsetEntry);
> +                                    if (newOffset > offset) {
> +                                        oldEntries++; // newOffset wasn't counted count it
> +                                    }
> +
> +                                    writeEntry(entry);
> +                                    freeOffset(offset);
> +                                    resolvedEntries++;


Where are we writing it to here? It looks like we write it to the old
location, and then delete it?

> +                                }
> +                            }
> +                        } finally {
> +                            unlockEntry(newOffset);
> +                        }
> +                    }
> +                } catch (IOException e) {
> +                    Logger.debug(this, "IOExcception on moveOldEntries0", e);
> +                } finally {
> +                    unlockEntry(offset);
> +                }
> +            }
> +
> +            if (queueItem) {
> +                putBackOldItems(oldItems);
> +            }
> +        }