瀏覽代碼

ZOOKEEPER-360. WeakHashMap in Bookie.java causes NPE (flavio via mahadev)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/zookeeper/trunk@761811 13f79535-47bb-0310-9956-ffa450edef68
Mahadev Konar 16 年之前
父節點
當前提交
1b91bfd187

+ 3 - 0
CHANGES.txt

@@ -34,6 +34,9 @@ BUGFIXES:
   ZOOKEEPER-341.  regression in QuorumPeerMain, 
   tickTime from config is lost, cannot start quorum (phunt via mahadev)
 
+  ZOOKEEPER-360. WeakHashMap in Bookie.java causes NPE (flavio via mahadev)
+
+
 IMPROVEMENTS:
   ZOOKEEPER-308. improve the atomic broadcast performance 3x.
   (breed via mahadev)

+ 2 - 5
src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/Bookie.java

@@ -27,7 +27,6 @@ import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.util.HashMap;
-import java.util.WeakHashMap;
 import java.util.LinkedList;
 import java.util.Random;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -55,8 +54,6 @@ public class Bookie extends Thread {
 
     final File ledgerDirectories[];
     
-    WeakHashMap<Long, ByteBuffer> masterKeys = new WeakHashMap<Long, ByteBuffer>();
-    
     public static class NoLedgerException extends IOException {
         private static final long serialVersionUID = 1L;
         private long ledgerId;
@@ -104,7 +101,7 @@ public class Bookie extends Thread {
             if (handle == null) {
                 handle = createHandle(ledgerId, readonly);
                 ledgers.put(ledgerId, handle);
-                masterKeys.put(ledgerId, ByteBuffer.wrap(masterKey));
+                handle.setMasterKey(ByteBuffer.wrap(masterKey));
             } 
             handle.incRef();
         }
@@ -291,7 +288,7 @@ public class Bookie extends Thread {
         long ledgerId = entry.getLong();
         LedgerDescriptor handle = getHandle(ledgerId, false, masterKey);
         
-        if(!masterKeys.get(ledgerId).equals(ByteBuffer.wrap(masterKey))){
+        if(!handle.cmpMasterKey(ByteBuffer.wrap(masterKey))){
             throw BookieException.create(BookieException.Code.UnauthorizedAccessException);
         }
         try {

+ 11 - 0
src/contrib/bookkeeper/src/java/org/apache/bookkeeper/bookie/LedgerDescriptor.java

@@ -42,6 +42,17 @@ public class LedgerDescriptor {
         this.ledger = ledger;
         this.ledgerIndex = ledgerIndex;
     }
+    
+    private ByteBuffer masterKey = null;
+    
+    void setMasterKey(ByteBuffer masterKey){
+        this.masterKey = masterKey;
+    }
+    
+    boolean cmpMasterKey(ByteBuffer masterKey){
+        return this.masterKey.equals(masterKey);
+    }
+    
     private long ledgerId;
     private FileChannel ledger;
     private FileChannel ledgerIndex;