svn commit: r518830 - in /xml/xindice/trunk/java/src/org/apache/xindice/core: data/Key.java filer/HashFiler.java filer/Paged.java

[email protected]
Newsgroups gmane.text.xml.xindice.devel
Message-ID <[email protected]>
Author: vgritsenko
Date: Thu Mar 15 18:44:50 2007
New Revision: 518830

URL: http://svn.apache.org/viewvc?view=rev&rev=518830
Log:
fix possible threading issue in key hash code; other cleanup

Modified:
    xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java?view=diff&rev=518830&r1=518829&r2=518830
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java Thu Mar 15 18:44:50 2007
@@ -25,7 +25,9 @@
  * @version $Revision$, $Date$
  */
 public final class Key extends Value {
-    private int hash = 0;
+
+    private int hash;
+
 
     public Key(Value value) {
         super(value);
@@ -43,20 +45,16 @@
         super(data);
     }
 
-    // TODO: This has to be revisited
-    private void calculateHash() {
-        hash = 0;
-        int pl = pos + len;
-        for (int i = pos; i < pl; i++) {
-            hash = (hash << 5) ^ data[i];
-            hash = hash % 1234567891;
-        }
-        hash = Math.abs(hash);
-    }
-
     public int getHash() {
+        int hash = this.hash;
         if (hash == 0) {
-            calculateHash();
+            // TODO: This has to be revisited
+            int end = pos + len;
+            for (int i = pos; i < end; i++) {
+                hash = (hash << 5) ^ data[i];
+                hash = hash % 1234567891;
+            }
+            this.hash = Math.abs(hash);
         }
         return hash;
     }
@@ -75,11 +73,11 @@
     }
 
     public boolean equals(Object obj) {
-        if (obj instanceof Key) {
-            return equals((Key) obj);
-        } else {
-            return super.equals(obj);
+        if (obj instanceof Value) {
+            return equals((Value) obj);
         }
+
+        return super.equals(obj);
     }
 }
 

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java?view=diff&rev=518830&r1=518829&r2=518830
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java Thu Mar 15 18:44:50 2007
@@ -111,12 +111,12 @@
         synchronized (p) {
             while (true) {
                 HashPageHeader ph = (HashPageHeader) p.getPageHeader();
-                if (ph.getStatus() == RECORD && ph.getKeyHash() == key.getHash() && p.getKey().equals(key)) {
+                if (ph.getStatus() == RECORD && ph.getKeyHash() == hash && p.getKey().equals(key)) {
                     return p;
                 }
 
                 pageNum = ph.getNextCollision();
-                if (pageNum == -1) {
+                if (pageNum == NO_PAGE) {
                     return null;
                 }
                 p = getPage(pageNum);
@@ -135,7 +135,7 @@
                 Value v = readValue(startPage);
                 HashPageHeader sph = (HashPageHeader) startPage.getPageHeader();
 
-                HashMap meta = new HashMap(2);
+                HashMap meta = new HashMap(3);
                 meta.put(Record.CREATED, new Long(sph.getCreated()));
                 meta.put(Record.MODIFIED, new Long(sph.getModified()));
 
@@ -160,13 +160,13 @@
             while (true) {
                 ph = (HashPageHeader) p.getPageHeader();
                 if (ph.getStatus() == UNUSED || ph.getStatus() == DELETED
-                        || (ph.getStatus() == RECORD && ph.getKeyHash() == key.getHash() && p.getKey().equals(key))) {
+                        || (ph.getStatus() == RECORD && ph.getKeyHash() == hash && p.getKey().equals(key))) {
                     // Found free page
                     break;
                 }
 
                 pageNum = ph.getNextCollision();
-                if (pageNum == -1) {
+                if (pageNum == NO_PAGE) {
                     // Reached end of chain, add new page
                     Page np = getFreePage();
 
@@ -193,7 +193,7 @@
             ph.setModified(t);
             ph.setStatus(RECORD);
 
-            // Write modifications to the page header before existing synchronization block
+            // Write modifications to the page header before exiting synchronization block
             // This will prevent other threads from getting this same page
             p.write();
         }
@@ -219,6 +219,7 @@
         } catch (Exception e) {
             throw new FilerException(FaultCodes.DBE_CANNOT_CREATE, "Exception: " + e);
         } finally {
+            // FIXME It's not enough. At this point, new record could have been added to the chain
             if (p != null) {
                 p.getPageHeader().setStatus(DELETED);
                 try {
@@ -275,7 +276,7 @@
                 Page prev = null;
                 while (true) {
                     pageHead = (HashPageHeader) page.getPageHeader();
-                    if (pageHead.getStatus() == RECORD && pageHead.getKeyHash() == key.getHash() && page.getKey().equals(key)) {
+                    if (pageHead.getStatus() == RECORD && pageHead.getKeyHash() == hash && page.getKey().equals(key)) {
                         break;
                     }
 

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java?view=diff&rev=518830&r1=518829&r2=518830
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java Thu Mar 15 18:44:50 2007
@@ -341,7 +341,7 @@
 
             // if not check if it's already loaded in the page cache
             if (p == null) {
-                WeakReference ref = (WeakReference)pages.get(lp);
+                WeakReference ref = (WeakReference) pages.get(lp);
                 if (ref != null) {
                     p = (Page) ref.get();
                 }
@@ -1395,9 +1395,9 @@
         public synchronized Key getKey() {
             if (header.keyLen > 0) {
                 return new Key(this.data, this.keyPos, header.keyLen);
-            } else {
-                return null;
             }
+
+            return null;
         }
 
         public synchronized void streamTo(OutputStream os) throws IOException {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.