diff --git a/source/dbtest.java b/source/dbtest.java index 63b6d0ef7..757648da3 100644 --- a/source/dbtest.java +++ b/source/dbtest.java @@ -216,9 +216,9 @@ public class dbtest { long randomstart = Long.parseLong(args[5]); final Random random = new Random(randomstart); for (int i = 0; i < writeCount; i++) { - serverInstantThread.oneTimeJob(new WriteJob(table, i), random.nextLong() % 1000, 10); + serverInstantThread.oneTimeJob(new WriteJob(table, i), random.nextLong() % 1000, 20); for (int j = 0; j < readCount; j++) { - serverInstantThread.oneTimeJob(new ReadJob(table, random.nextLong() % writeCount), 1000 + random.nextLong() % 1000, 10); + serverInstantThread.oneTimeJob(new ReadJob(table, random.nextLong() % writeCount), random.nextLong() % 1000, 20); } } while (serverInstantThread.instantThreadCounter > 0) @@ -231,13 +231,14 @@ public class dbtest { // args: long writeCount = Long.parseLong(args[3]); long readCount = Long.parseLong(args[4]); - System.out.print("Writing ..."); - for (int i = 0; i < writeCount; i++) new WriteJob(table, i).run(); - System.out.println(" done."); - - System.out.print("Reading ..."); - for (int i = 0; i < readCount; i++) new ReadJob(table, i).run(); - System.out.println(" done."); + long randomstart = Long.parseLong(args[5]); + final Random random = new Random(randomstart); + for (int i = 0; i < writeCount; i++) { + new WriteJob(table, i).run(); + for (int j = 0; j < readCount; j++) { + new ReadJob(table, random.nextLong() % writeCount).run(); + } + } } diff --git a/source/de/anomic/kelondro/kelondroLock.java b/source/de/anomic/kelondro/kelondroLock.java new file mode 100644 index 000000000..c5209be53 --- /dev/null +++ b/source/de/anomic/kelondro/kelondroLock.java @@ -0,0 +1,105 @@ +// kelondroLock.java +// ----------------------- +// part of YaCy +// (C) by Michael Peter Christen; mc@anomic.de +// first published on http://www.anomic.de +// Frankfurt, Germany, 2005 +// Created 08.12.2005 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Using this software in any meaning (reading, learning, copying, compiling, +// running) means that you agree that the Author(s) is (are) not responsible +// for cost, loss of data or any harm that may be caused directly or indirectly +// by usage of this softare or this documentation. The usage of this software +// is on your own risk. The installation and usage (starting/running) of this +// software may allow other people or application to access your computer and +// any attached devices and is highly dependent on the configuration of the +// software which must be done by the user of the software; the author(s) is +// (are) also not responsible for proper configuration and usage of the +// software, even if provoked by documentation provided together with +// the software. +// +// Any changes to this file according to the GPL as documented in the file +// gpl.txt aside this file in the shipment you received can be done to the +// lines that follows this copyright notice here, but changes must not be +// done inside the copyright notive above. A re-distribution must contain +// the intact and unchanged copyright notice. +// Contributions and changes to the program code must be marked as such. + +package de.anomic.kelondro; + +public class kelondroLock { + + private boolean lock; + private long releaseTime; + + public kelondroLock() { + lock = false; + releaseTime = 0; + } + + public synchronized void apply() { + // this applies a lock to this objekt + // if the lock is already applied + // this object waits until it is released and applies it then again + // before it returns + apply(-1); + } + + public synchronized void apply(long millis) { + // sets a lock that is valid for a specific time + // if the time is over, the lock is released automatically + if (locked()) { + do { + try { wait(100); } + catch (InterruptedException e) { } + catch (Exception e) { e.printStackTrace(); } + } while (locked()); + } + lock = true; + releaseTime = (millis < 0) ? Long.MAX_VALUE : System.currentTimeMillis() + millis; + } + + public synchronized boolean stay(long waitMillis, long lockMillis) { + // this tries to apply a lock, but does not block infinitely until + // the lock is released. If after the given time the lock is not released + // the method returns with false and no more lock is applied + // if the lock was applied successfully, it returns with true + if (locked()) { + try { wait(waitMillis); } + catch (InterruptedException e) { } + catch (Exception e) { e.printStackTrace(); } + if (locked()) return false; + } + lock = true; + releaseTime = (lockMillis < 0) ? Long.MAX_VALUE : System.currentTimeMillis() + lockMillis; + return true; + } + + public synchronized void release() { + // this must be called to releas the lock to the object + // if it is not released, possibly all other tasks are blocked + if (locked()) { + lock = false; + releaseTime = 0; + notify(); + } + } + + public synchronized boolean locked() { + return lock && (System.currentTimeMillis() < releaseTime); + } +} diff --git a/source/de/anomic/kelondro/kelondroTree.java b/source/de/anomic/kelondro/kelondroTree.java index 2e12d8f4b..91719be6b 100644 --- a/source/de/anomic/kelondro/kelondroTree.java +++ b/source/de/anomic/kelondro/kelondroTree.java @@ -76,6 +76,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr private static int root = 0; // pointer for FHandles-array: pointer to root node private Search writeSearchObj = new Search(); + private kelondroLock writeLock = new kelondroLock(); public kelondroTree(File file, long buffersize, int key, int value) throws IOException { this(file, buffersize, new int[] { key, value }, 1, 8); @@ -134,15 +135,18 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr // Returns the value to which this map maps the specified key. public byte[][] get(byte[] key) throws IOException { - //System.out.println("kelondroTree.get " + new String(key) + " in " + filename); + // System.out.println("kelondroTree.get " + new String(key) + " in " + filename); + byte[][] result = null; + //writeLock.stay(2000, 1000); Search search = new Search(); search.process(key); if (search.found()) { - byte[][] result = search.getMatcher().getValues(); - return result; + result = search.getMatcher().getValues(); } else { - return null; + result = null; } + //writeLock.release(); + return result; } public long[] getLong(byte[] key) throws IOException { @@ -289,7 +293,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr else return (child == -1); } - public boolean isRight() { + public boolean isRight() { if (found) throw new IllegalArgumentException("wrong access of leftchild"); else return (child == 1); } @@ -324,6 +328,8 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr // Associates the specified value with the specified key in this map public byte[][] put(byte[][] newrow) throws IOException { + byte[][] result = null; + //writeLock.stay(2000, 1000); if (newrow.length != columns()) throw new IllegalArgumentException("put: wrong row length " + newrow.length + "; must be " + columns()); // first try to find the key element in the database synchronized(writeSearchObj) { @@ -331,9 +337,8 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr if (writeSearchObj.found()) { // a node with this key exist. simply overwrite the content and return old content Node e = writeSearchObj.getMatcher(); - byte[][] result = e.setValues(newrow); + result = e.setValues(newrow); commitNode(e); - return result; } else if (writeSearchObj.isRoot()) { // a node with this key does not exist and there is no node at all // this therefore creates the root node if an only if there was no root Node yet @@ -351,7 +356,7 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr // do updates e.commit(CP_LOW); setHandle(root, e.handle()); - return null; + result = null; } else { // a node with this key does not exist // this creates a new node if there is already at least a root node @@ -459,9 +464,11 @@ public class kelondroTree extends kelondroRecords implements Comparator, kelondr } } - return null; // that means: no previous stored value present + result = null;; // that means: no previous stored value present } } + //writeLock.release(); + return result; } private void assignChild(Node parentNode, Node childNode, int childType) throws IOException {