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);
> + }
> + }