Browse Source

HDFS-6894. Add XDR parser method for each NFS response. Contributed by Brandon Li.

Haohui Mai 10 năm trước cách đây
mục cha
commit
5d2f325483
28 tập tin đã thay đổi với 413 bổ sung61 xóa
  1. 14 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/ACCESS3Response.java
  2. 12 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/COMMIT3Response.java
  3. 18 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/CREATE3Response.java
  4. 35 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/FSINFO3Response.java
  5. 28 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/FSSTAT3Response.java
  6. 9 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/GETATTR3Response.java
  7. 12 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/LINK3Response.java
  8. 2 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/LOOKUP3Response.java
  9. 18 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/MKDIR3Response.java
  10. 18 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/MKNOD3Response.java
  11. 2 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/NFS3Response.java
  12. 25 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/PATHCONF3Response.java
  13. 22 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/READ3Response.java
  14. 40 5
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/READDIR3Response.java
  15. 38 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/READDIRPLUS3Response.java
  16. 15 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/READLINK3Response.java
  17. 10 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/REMOVE3Response.java
  18. 9 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/RENAME3Response.java
  19. 8 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/RMDIR3Response.java
  20. 8 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/SETATTR3Response.java
  21. 18 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/SYMLINK3Response.java
  22. 20 2
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/WRITE3Response.java
  23. 7 0
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/WccAttr.java
  24. 8 0
      hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/WccData.java
  25. 8 8
      hadoop-hdfs-project/hadoop-hdfs-nfs/src/main/java/org/apache/hadoop/hdfs/nfs/nfs3/OpenFileCtx.java
  26. 2 2
      hadoop-hdfs-project/hadoop-hdfs-nfs/src/main/java/org/apache/hadoop/hdfs/nfs/nfs3/RpcProgramNfs3.java
  27. 4 4
      hadoop-hdfs-project/hadoop-hdfs-nfs/src/main/java/org/apache/hadoop/hdfs/nfs/nfs3/WriteManager.java
  28. 3 0
      hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt

+ 14 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/ACCESS3Response.java

@@ -43,9 +43,21 @@ public class ACCESS3Response extends NFS3Response {
     this.access = access;
   }
 
+  public static ACCESS3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    Nfs3FileAttributes postOpAttr = null;
+    int access = 0;
+
+    if (status == Nfs3Status.NFS3_OK) {
+      postOpAttr = Nfs3FileAttributes.deserialize(xdr);
+      access = xdr.readInt();
+    }
+    return new ACCESS3Response(status, postOpAttr, access);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     if (this.getStatus() == Nfs3Status.NFS3_OK) {
       out.writeBoolean(true);
       postOpAttr.serialize(out);

+ 12 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/COMMIT3Response.java

@@ -47,9 +47,19 @@ public class COMMIT3Response extends NFS3Response {
     return verf;
   }
 
+  public static COMMIT3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    long verf = 0;
+    WccData fileWcc = WccData.deserialize(xdr);
+    if (status == Nfs3Status.NFS3_OK) {
+      verf = xdr.readHyper();
+    }
+    return new COMMIT3Response(status, fileWcc, verf);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     fileWcc.serialize(out);
     if (getStatus() == Nfs3Status.NFS3_OK) {
       out.writeLongAsHyper(verf);

+ 18 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/CREATE3Response.java

@@ -55,9 +55,25 @@ public class CREATE3Response extends NFS3Response {
     return dirWcc;
   }
 
+  public static CREATE3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    FileHandle objHandle = new FileHandle();
+    Nfs3FileAttributes postOpObjAttr = null;
+
+    if (status == Nfs3Status.NFS3_OK) {
+      xdr.readBoolean();
+      objHandle.deserialize(xdr);
+      xdr.readBoolean();
+      postOpObjAttr = Nfs3FileAttributes.deserialize(xdr);
+    }
+
+    WccData dirWcc = WccData.deserialize(xdr);
+    return new CREATE3Response(status, objHandle, postOpObjAttr, dirWcc);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     if (getStatus() == Nfs3Status.NFS3_OK) {
       out.writeBoolean(true); // Handle follows
       objHandle.serialize(out);

+ 35 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/FSINFO3Response.java

@@ -18,6 +18,7 @@
 package org.apache.hadoop.nfs.nfs3.response;
 
 import org.apache.hadoop.nfs.NfsTime;
+import org.apache.hadoop.nfs.nfs3.FileHandle;
 import org.apache.hadoop.nfs.nfs3.Nfs3FileAttributes;
 import org.apache.hadoop.nfs.nfs3.Nfs3Status;
 import org.apache.hadoop.oncrpc.XDR;
@@ -109,9 +110,41 @@ public class FSINFO3Response extends NFS3Response {
     this.properties = properties;
   }
 
+  public static FSINFO3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    xdr.readBoolean();
+    Nfs3FileAttributes postOpObjAttr = Nfs3FileAttributes.deserialize(xdr);
+    int rtmax = 0;
+    int rtpref = 0;
+    int rtmult = 0;
+    int wtmax = 0;
+    int wtpref = 0;
+    int wtmult = 0;
+    int dtpref = 0;
+    long maxFileSize = 0;
+    NfsTime timeDelta = null;
+    int properties = 0;
+
+    if (status == Nfs3Status.NFS3_OK) {
+      rtmax = xdr.readInt();
+      rtpref = xdr.readInt();
+      rtmult = xdr.readInt();
+      wtmax = xdr.readInt();
+      wtpref = xdr.readInt();
+      wtmult = xdr.readInt();
+      dtpref = xdr.readInt();
+      maxFileSize = xdr.readHyper();
+      timeDelta = NfsTime.deserialize(xdr);
+      properties = xdr.readInt();
+    }
+    return new FSINFO3Response(status, postOpObjAttr, rtmax, rtpref, rtmult,
+        wtmax, wtpref, wtmult, dtpref, maxFileSize, timeDelta, properties);
+
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     out.writeBoolean(true);
     postOpAttr.serialize(out);
 

+ 28 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/FSSTAT3Response.java

@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.nfs.nfs3.response;
 
+import org.apache.hadoop.nfs.nfs3.FileHandle;
 import org.apache.hadoop.nfs.nfs3.Nfs3FileAttributes;
 import org.apache.hadoop.nfs.nfs3.Nfs3Status;
 import org.apache.hadoop.oncrpc.XDR;
@@ -90,9 +91,34 @@ public class FSSTAT3Response extends NFS3Response {
     this.invarsec = invarsec;
   }
 
+  public static FSSTAT3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    xdr.readBoolean();
+    Nfs3FileAttributes postOpAttr = Nfs3FileAttributes.deserialize(xdr);
+    long tbytes = 0;
+    long fbytes = 0;
+    long abytes = 0;
+    long tfiles = 0;
+    long ffiles = 0;
+    long afiles = 0;
+    int invarsec = 0;
+
+    if (status == Nfs3Status.NFS3_OK) {
+      tbytes = xdr.readHyper();
+      fbytes = xdr.readHyper();
+      abytes = xdr.readHyper();
+      tfiles = xdr.readHyper();
+      ffiles = xdr.readHyper();
+      afiles = xdr.readHyper();
+      invarsec = xdr.readInt();
+    }
+    return new FSSTAT3Response(status, postOpAttr, tbytes, fbytes, abytes,
+        tfiles, ffiles, afiles, invarsec);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     out.writeBoolean(true);
     if (postOpAttr == null) {
       postOpAttr = new Nfs3FileAttributes();

+ 9 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/GETATTR3Response.java

@@ -40,9 +40,16 @@ public class GETATTR3Response extends NFS3Response {
     this.postOpAttr = postOpAttr;
   }
   
+  public static GETATTR3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    Nfs3FileAttributes attr = (status == Nfs3Status.NFS3_OK) ? Nfs3FileAttributes
+        .deserialize(xdr) : new Nfs3FileAttributes();
+    return new GETATTR3Response(status, attr);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     if (getStatus() == Nfs3Status.NFS3_OK) {
       postOpAttr.serialize(out);
     }

+ 12 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/LINK3Response.java

@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.nfs.nfs3.response;
 
+import org.apache.hadoop.nfs.nfs3.Nfs3FileAttributes;
+import org.apache.hadoop.nfs.nfs3.Nfs3Status;
 import org.apache.hadoop.oncrpc.XDR;
 import org.apache.hadoop.oncrpc.security.Verifier;
 
@@ -43,9 +45,17 @@ public class LINK3Response extends NFS3Response {
     return linkDirWcc;
   }
 
+  public static LINK3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    WccData fromDirWcc = WccData.deserialize(xdr);
+    WccData linkDirWcc = WccData.deserialize(xdr);
+    return new LINK3Response(status, fromDirWcc, linkDirWcc);
+  }
+
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     fromDirWcc.serialize(out);
     linkDirWcc.serialize(out);
     

+ 2 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/LOOKUP3Response.java

@@ -62,8 +62,8 @@ public class LOOKUP3Response extends NFS3Response {
   }
 
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     if (this.status == Nfs3Status.NFS3_OK) {
       fileHandle.serialize(out);
       out.writeBoolean(true); // Attribute follows

+ 18 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/MKDIR3Response.java

@@ -55,9 +55,25 @@ public class MKDIR3Response extends NFS3Response {
     return dirWcc;
   }
 
+  public static MKDIR3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    FileHandle objFileHandle = new FileHandle();
+    Nfs3FileAttributes objAttr = null;
+    WccData dirWcc;
+
+    if (status == Nfs3Status.NFS3_OK) {
+      xdr.readBoolean();
+      objFileHandle.deserialize(xdr);
+      xdr.readBoolean();
+      objAttr = Nfs3FileAttributes.deserialize(xdr);
+    }
+    dirWcc = WccData.deserialize(xdr);
+    return new MKDIR3Response(status, objFileHandle, objAttr, dirWcc);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     if (getStatus() == Nfs3Status.NFS3_OK) {
       out.writeBoolean(true); // Handle follows
       objFileHandle.serialize(out);

+ 18 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/MKNOD3Response.java

@@ -52,9 +52,25 @@ public class MKNOD3Response extends NFS3Response {
     return dirWcc;
   }
 
+  public static MKNOD3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    FileHandle objFileHandle = new FileHandle();
+    Nfs3FileAttributes objPostOpAttr = null;
+    WccData dirWcc;
+
+    if (status == Nfs3Status.NFS3_OK) {
+      xdr.readBoolean();
+      objFileHandle.deserialize(xdr);
+      xdr.readBoolean();
+      objPostOpAttr = Nfs3FileAttributes.deserialize(xdr);
+    }
+    dirWcc = WccData.deserialize(xdr);
+    return new MKNOD3Response(status, objFileHandle, objPostOpAttr, dirWcc);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     if (this.getStatus() == Nfs3Status.NFS3_OK) {
       out.writeBoolean(true);
       objFileHandle.serialize(out);

+ 2 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/NFS3Response.java

@@ -39,12 +39,12 @@ public class NFS3Response {
   public void setStatus(int status) {
     this.status = status;
   }
-  
+
   /**
    * Write the response, along with the rpc header (including verifier), to the
    * XDR.
    */
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
     RpcAcceptedReply reply = RpcAcceptedReply.getAcceptInstance(xid, verifier);
     reply.write(out);
     out.writeInt(this.getStatus());

+ 25 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/PATHCONF3Response.java

@@ -77,9 +77,32 @@ public class PATHCONF3Response extends NFS3Response {
     this.casePreserving = casePreserving;
   }
 
+  public static PATHCONF3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    xdr.readBoolean();
+    Nfs3FileAttributes objPostOpAttr = Nfs3FileAttributes.deserialize(xdr);
+    int linkMax = 0;
+    int nameMax = 0;
+    boolean noTrunc = false;
+    boolean chownRestricted = false;
+    boolean caseInsensitive = false;
+    boolean casePreserving = false;
+
+    if (status == Nfs3Status.NFS3_OK) {
+      linkMax = xdr.readInt();
+      nameMax = xdr.readInt();
+      noTrunc = xdr.readBoolean();
+      chownRestricted = xdr.readBoolean();
+      caseInsensitive = xdr.readBoolean();
+      casePreserving = xdr.readBoolean();
+    }
+    return new PATHCONF3Response(status, objPostOpAttr, linkMax, nameMax,
+        noTrunc, chownRestricted, caseInsensitive, casePreserving);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     out.writeBoolean(true);
     postOpAttr.serialize(out);
 

+ 22 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/READ3Response.java

@@ -62,9 +62,29 @@ public class READ3Response extends NFS3Response {
     return data;
   }
 
+  public static READ3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    xdr.readBoolean();
+    Nfs3FileAttributes postOpAttr = Nfs3FileAttributes.deserialize(xdr);
+    int count = 0;
+    boolean eof = false;
+    byte[] data = new byte[0];
+
+    if (status == Nfs3Status.NFS3_OK) {
+      count = xdr.readInt();
+      eof = xdr.readBoolean();
+      int len = xdr.readInt();
+      assert (len == count);
+      data = xdr.readFixedOpaque(count);
+    }
+
+    return new READ3Response(status, postOpAttr, count, eof,
+        ByteBuffer.wrap(data));
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     out.writeBoolean(true); // Attribute follows
     postOpAttr.serialize(out);
 

+ 40 - 5
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/READDIR3Response.java

@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.nfs.nfs3.response;
 
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -59,6 +61,19 @@ public class READDIR3Response extends NFS3Response {
     long getCookie() {
       return cookie;
     }
+
+    static Entry3 deserialzie(XDR xdr) {
+      long fileId = xdr.readHyper();
+      String name = xdr.readString();
+      long cookie = xdr.readHyper();
+      return new Entry3(fileId, name, cookie);
+    }
+
+    void seralize(XDR xdr) {
+      xdr.writeLongAsHyper(getFileId());
+      xdr.writeString(getName());
+      xdr.writeLongAsHyper(getCookie());
+    }
   }
 
   public static class DirList3 {
@@ -104,9 +119,31 @@ public class READDIR3Response extends NFS3Response {
     return dirList;
   }
 
+  public static READDIR3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    xdr.readBoolean();
+    Nfs3FileAttributes postOpDirAttr = Nfs3FileAttributes.deserialize(xdr);
+    long cookieVerf = 0;
+    ArrayList<Entry3> entries = new ArrayList<Entry3>();
+    DirList3 dirList = null;
+
+    if (status == Nfs3Status.NFS3_OK) {
+      cookieVerf = xdr.readHyper();
+      while (xdr.readBoolean()) {
+        Entry3 e =  Entry3.deserialzie(xdr);
+        entries.add(e);
+      }
+      boolean eof = xdr.readBoolean();
+      Entry3[] allEntries = new Entry3[entries.size()];
+      entries.toArray(allEntries);
+      dirList = new DirList3(allEntries, eof);
+    }
+    return new READDIR3Response(status, postOpDirAttr, cookieVerf, dirList);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR xdr, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(xdr, xid, verifier);
+  public XDR serialize(XDR xdr, int xid, Verifier verifier) {
+    super.serialize(xdr, xid, verifier);
     xdr.writeBoolean(true); // Attributes follow
     postOpDirAttr.serialize(xdr);
 
@@ -114,9 +151,7 @@ public class READDIR3Response extends NFS3Response {
       xdr.writeLongAsHyper(cookieVerf);
       for (Entry3 e : dirList.entries) {
         xdr.writeBoolean(true); // Value follows
-        xdr.writeLongAsHyper(e.getFileId());
-        xdr.writeString(e.getName());
-        xdr.writeLongAsHyper(e.getCookie());
+        e.seralize(xdr);
       }
 
       xdr.writeBoolean(false);

+ 38 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/READDIRPLUS3Response.java

@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.nfs.nfs3.response;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -24,6 +25,8 @@ import java.util.List;
 import org.apache.hadoop.nfs.nfs3.FileHandle;
 import org.apache.hadoop.nfs.nfs3.Nfs3FileAttributes;
 import org.apache.hadoop.nfs.nfs3.Nfs3Status;
+import org.apache.hadoop.nfs.nfs3.response.READDIR3Response.DirList3;
+import org.apache.hadoop.nfs.nfs3.response.READDIR3Response.Entry3;
 import org.apache.hadoop.oncrpc.XDR;
 import org.apache.hadoop.oncrpc.security.Verifier;
 
@@ -58,6 +61,17 @@ public class READDIRPLUS3Response  extends NFS3Response {
       return name;
     }
     
+    static EntryPlus3 deseralize(XDR xdr) {
+      long fileId = xdr.readHyper();
+      String name = xdr.readString();
+      long cookie = xdr.readHyper();
+      xdr.readBoolean();
+      Nfs3FileAttributes nameAttr = Nfs3FileAttributes.deserialize(xdr);
+      FileHandle objFileHandle = new FileHandle();
+      objFileHandle.deserialize(xdr);
+      return new EntryPlus3(fileId, name, cookie, nameAttr, objFileHandle);
+    }
+
     void seralize(XDR xdr) {
       xdr.writeLongAsHyper(fileId);
       xdr.writeString(name);
@@ -105,9 +119,31 @@ public class READDIRPLUS3Response  extends NFS3Response {
     this.dirListPlus = dirListPlus;
   }
   
+  public static READDIRPLUS3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    xdr.readBoolean();
+    Nfs3FileAttributes postOpDirAttr = Nfs3FileAttributes.deserialize(xdr);
+    long cookieVerf = 0;
+    ArrayList<EntryPlus3> entries = new ArrayList<EntryPlus3>();
+    DirListPlus3 dirList = null;
+
+    if (status == Nfs3Status.NFS3_OK) {
+      cookieVerf = xdr.readHyper();
+      while (xdr.readBoolean()) {
+        EntryPlus3 e = EntryPlus3.deseralize(xdr);
+        entries.add(e);
+      }
+      boolean eof = xdr.readBoolean();
+      EntryPlus3[] allEntries = new EntryPlus3[entries.size()];
+      entries.toArray(allEntries);
+      dirList = new DirListPlus3(allEntries, eof);
+    }
+    return new READDIRPLUS3Response(status, postOpDirAttr, cookieVerf, dirList);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     out.writeBoolean(true); // attributes follow
     if (postOpDirAttr == null) {
       postOpDirAttr = new Nfs3FileAttributes();

+ 15 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/READLINK3Response.java

@@ -41,9 +41,22 @@ public class READLINK3Response extends NFS3Response {
     System.arraycopy(path, 0, this.path, 0, path.length);
   }
 
+  public static READLINK3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    xdr.readBoolean();
+    Nfs3FileAttributes postOpSymlinkAttr = Nfs3FileAttributes.deserialize(xdr);
+    byte path[] = new byte[0];
+
+    if (status == Nfs3Status.NFS3_OK) {
+      path = xdr.readVariableOpaque();
+    }
+
+    return new READLINK3Response(status, postOpSymlinkAttr, path);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     out.writeBoolean(true); // Attribute follows
     postOpSymlinkAttr.serialize(out);
     if (getStatus() == Nfs3Status.NFS3_OK) {

+ 10 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/REMOVE3Response.java

@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.nfs.nfs3.response;
 
+import org.apache.hadoop.nfs.nfs3.Nfs3FileAttributes;
+import org.apache.hadoop.nfs.nfs3.Nfs3Status;
 import org.apache.hadoop.oncrpc.XDR;
 import org.apache.hadoop.oncrpc.security.Verifier;
 
@@ -35,9 +37,15 @@ public class REMOVE3Response extends NFS3Response {
     this.dirWcc = dirWcc;
   }
   
+  public static REMOVE3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    WccData dirWcc = WccData.deserialize(xdr);
+    return new REMOVE3Response(status, dirWcc);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     if (dirWcc == null) {
       dirWcc = new WccData(null, null);
     }

+ 9 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/RENAME3Response.java

@@ -45,9 +45,16 @@ public class RENAME3Response extends NFS3Response {
     return toDirWcc;
   }
 
+  public static RENAME3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    WccData fromDirWcc = WccData.deserialize(xdr);
+    WccData toDirWcc = WccData.deserialize(xdr);
+    return new RENAME3Response(status, fromDirWcc, toDirWcc);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     fromDirWcc.serialize(out);
     toDirWcc.serialize(out);
     return out;

+ 8 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/RMDIR3Response.java

@@ -39,9 +39,15 @@ public class RMDIR3Response extends NFS3Response {
     return dirWcc;
   }
 
+  public static RMDIR3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    WccData dirWcc = WccData.deserialize(xdr);
+    return new RMDIR3Response(status, dirWcc);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     dirWcc.serialize(out);
     return out;
   }

+ 8 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/SETATTR3Response.java

@@ -39,9 +39,15 @@ public class SETATTR3Response extends NFS3Response {
     return wccData;
   }
 
+  public static SETATTR3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    WccData wccData = WccData.deserialize(xdr);
+    return new SETATTR3Response(status, wccData);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     wccData.serialize(out);
     return out;
   }

+ 18 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/SYMLINK3Response.java

@@ -55,9 +55,25 @@ public class SYMLINK3Response extends NFS3Response {
     return dirWcc;
   }
 
+  public static SYMLINK3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    FileHandle objFileHandle = new FileHandle();
+    Nfs3FileAttributes objPostOpAttr = null;
+    WccData dirWcc;
+    if (status == Nfs3Status.NFS3_OK) {
+      xdr.readBoolean();
+      objFileHandle.deserialize(xdr);
+      xdr.readBoolean();
+      objPostOpAttr = Nfs3FileAttributes.deserialize(xdr);
+    }
+
+    dirWcc = WccData.deserialize(xdr);
+    return new SYMLINK3Response(status, objFileHandle, objPostOpAttr, dirWcc);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     if (this.getStatus() == Nfs3Status.NFS3_OK) {
       out.writeBoolean(true);
       objFileHandle.serialize(out);

+ 20 - 2
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/WRITE3Response.java

@@ -17,7 +17,9 @@
  */
 package org.apache.hadoop.nfs.nfs3.response;
 
+import org.apache.hadoop.nfs.nfs3.FileHandle;
 import org.apache.hadoop.nfs.nfs3.Nfs3Constant;
+import org.apache.hadoop.nfs.nfs3.Nfs3FileAttributes;
 import org.apache.hadoop.nfs.nfs3.Nfs3Status;
 import org.apache.hadoop.nfs.nfs3.Nfs3Constant.WriteStableHow;
 import org.apache.hadoop.oncrpc.XDR;
@@ -58,9 +60,25 @@ public class WRITE3Response extends NFS3Response {
     return verifer;
   }
 
+  public static WRITE3Response deserialize(XDR xdr) {
+    int status = xdr.readInt();
+    WccData fileWcc = WccData.deserialize(xdr);
+    int count = 0;
+    WriteStableHow stableHow = null;
+    long verifier = 0;
+
+    if (status == Nfs3Status.NFS3_OK) {
+      count = xdr.readInt();
+      int how = xdr.readInt();
+      stableHow = WriteStableHow.values()[how];
+      verifier = xdr.readHyper();
+    }
+    return new WRITE3Response(status, fileWcc, count, stableHow, verifier);
+  }
+
   @Override
-  public XDR writeHeaderAndResponse(XDR out, int xid, Verifier verifier) {
-    super.writeHeaderAndResponse(out, xid, verifier);
+  public XDR serialize(XDR out, int xid, Verifier verifier) {
+    super.serialize(out, xid, verifier);
     fileWcc.serialize(out);
     if (getStatus() == Nfs3Status.NFS3_OK) {
       out.writeInt(count);

+ 7 - 0
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/WccAttr.java

@@ -52,6 +52,13 @@ public class WccAttr {
     this.ctime = ctime;
   }
 
+  public static WccAttr deserialize(XDR xdr) {
+    long size = xdr.readHyper();
+    NfsTime mtime = NfsTime.deserialize(xdr);
+    NfsTime ctime = NfsTime.deserialize(xdr);
+    return new WccAttr(size, mtime, ctime);
+  }
+
   public void serialize(XDR out) {
     out.writeLongAsHyper(size);
     if (mtime == null) {

+ 8 - 0
hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/nfs/nfs3/response/WccData.java

@@ -49,6 +49,14 @@ public class WccData {
         : postOpAttr;
   }
 
+  public static WccData deserialize(XDR xdr) {
+    xdr.readBoolean();
+    WccAttr preOpAttr = WccAttr.deserialize(xdr);
+    xdr.readBoolean();
+    Nfs3FileAttributes postOpAttr = Nfs3FileAttributes.deserialize(xdr);
+    return new WccData(preOpAttr, postOpAttr);
+  }
+
   public void serialize(XDR out) {
     out.writeBoolean(true); // attributes follow
     preOpAttr.serialize(out);

+ 8 - 8
hadoop-hdfs-project/hadoop-hdfs-nfs/src/main/java/org/apache/hadoop/hdfs/nfs/nfs3/OpenFileCtx.java

@@ -409,7 +409,7 @@ class OpenFileCtx {
       WRITE3Response response = new WRITE3Response(Nfs3Status.NFS3ERR_IO,
           fileWcc, 0, request.getStableHow(), Nfs3Constant.WRITE_COMMIT_VERF);
       Nfs3Utils.writeChannel(channel,
-          response.writeHeaderAndResponse(new XDR(), xid, new VerifierNone()),
+          response.serialize(new XDR(), xid, new VerifierNone()),
           xid);
     } else {
       // Update the write time first
@@ -435,7 +435,7 @@ class OpenFileCtx {
           WRITE3Response response = new WRITE3Response(Nfs3Status.NFS3_OK,
               fileWcc, request.getCount(), request.getStableHow(),
               Nfs3Constant.WRITE_COMMIT_VERF);
-          Nfs3Utils.writeChannel(channel, response.writeHeaderAndResponse(
+          Nfs3Utils.writeChannel(channel, response.serialize(
               new XDR(), xid, new VerifierNone()), xid);
         }
       } else {
@@ -572,7 +572,7 @@ class OpenFileCtx {
     }
     updateLastAccessTime();
     Nfs3Utils.writeChannel(channel,
-        response.writeHeaderAndResponse(new XDR(), xid, new VerifierNone()),
+        response.serialize(new XDR(), xid, new VerifierNone()),
         xid);
   }
   
@@ -644,7 +644,7 @@ class OpenFileCtx {
         WRITE3Response response = new WRITE3Response(Nfs3Status.NFS3_OK,
             fileWcc, count, stableHow, Nfs3Constant.WRITE_COMMIT_VERF);
         Nfs3Utils
-            .writeChannel(channel, response.writeHeaderAndResponse(new XDR(),
+            .writeChannel(channel, response.serialize(new XDR(),
                 xid, new VerifierNone()), xid);
         writeCtx.setReplied(true);
       }
@@ -1026,7 +1026,7 @@ class OpenFileCtx {
       COMMIT3Response response = new COMMIT3Response(status, wccData,
           Nfs3Constant.WRITE_COMMIT_VERF);
       Nfs3Utils.writeChannelCommit(commit.getChannel(), response
-          .writeHeaderAndResponse(new XDR(), commit.getXid(),
+          .serialize(new XDR(), commit.getXid(),
               new VerifierNone()), commit.getXid());
       
       if (LOG.isDebugEnabled()) {
@@ -1107,7 +1107,7 @@ class OpenFileCtx {
         }
         WRITE3Response response = new WRITE3Response(Nfs3Status.NFS3_OK,
             fileWcc, count, stableHow, Nfs3Constant.WRITE_COMMIT_VERF);
-        Nfs3Utils.writeChannel(channel, response.writeHeaderAndResponse(
+        Nfs3Utils.writeChannel(channel, response.serialize(
             new XDR(), xid, new VerifierNone()), xid);
       }
       
@@ -1119,7 +1119,7 @@ class OpenFileCtx {
           + offset + " and length " + count, e);
       if (!writeCtx.getReplied()) {
         WRITE3Response response = new WRITE3Response(Nfs3Status.NFS3ERR_IO);
-        Nfs3Utils.writeChannel(channel, response.writeHeaderAndResponse(
+        Nfs3Utils.writeChannel(channel, response.serialize(
             new XDR(), xid, new VerifierNone()), xid);
         // Keep stream open. Either client retries or SteamMonitor closes it.
       }
@@ -1170,7 +1170,7 @@ class OpenFileCtx {
         WRITE3Response response = new WRITE3Response(Nfs3Status.NFS3ERR_IO,
             fileWcc, 0, writeCtx.getStableHow(), Nfs3Constant.WRITE_COMMIT_VERF);
         Nfs3Utils.writeChannel(writeCtx.getChannel(), response
-            .writeHeaderAndResponse(new XDR(), writeCtx.getXid(),
+            .serialize(new XDR(), writeCtx.getXid(),
                 new VerifierNone()), writeCtx.getXid());
       }
     }

+ 2 - 2
hadoop-hdfs-project/hadoop-hdfs-nfs/src/main/java/org/apache/hadoop/hdfs/nfs/nfs3/RpcProgramNfs3.java

@@ -2025,7 +2025,7 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
       WccData fileWcc = new WccData(Nfs3Utils.getWccAttr(preOpAttr), postOpAttr);
       int status = mapErrorStatus(e);
       return new COMMIT3Response(status, fileWcc,
-        Nfs3Constant.WRITE_COMMIT_VERF);
+          Nfs3Constant.WRITE_COMMIT_VERF);
     }
   }
 
@@ -2163,7 +2163,7 @@ public class RpcProgramNfs3 extends RpcProgram implements Nfs3Interface {
       return;
     }
     // TODO: currently we just return VerifierNone
-    out = response.writeHeaderAndResponse(out, xid, new VerifierNone());
+    out = response.serialize(out, xid, new VerifierNone());
     ChannelBuffer buf = ChannelBuffers.wrappedBuffer(out.asReadOnlyWrap()
         .buffer());
     RpcResponse rsp = new RpcResponse(buf, info.remoteAddress());

+ 4 - 4
hadoop-hdfs-project/hadoop-hdfs-nfs/src/main/java/org/apache/hadoop/hdfs/nfs/nfs3/WriteManager.java

@@ -123,7 +123,7 @@ public class WriteManager {
     byte[] data = request.getData().array();
     if (data.length < count) {
       WRITE3Response response = new WRITE3Response(Nfs3Status.NFS3ERR_INVAL);
-      Nfs3Utils.writeChannel(channel, response.writeHeaderAndResponse(
+      Nfs3Utils.writeChannel(channel, response.serialize(
           new XDR(), xid, new VerifierNone()), xid);
       return;
     }
@@ -169,7 +169,7 @@ public class WriteManager {
         WRITE3Response response = new WRITE3Response(Nfs3Status.NFS3ERR_IO,
             fileWcc, count, request.getStableHow(),
             Nfs3Constant.WRITE_COMMIT_VERF);
-        Nfs3Utils.writeChannel(channel, response.writeHeaderAndResponse(
+        Nfs3Utils.writeChannel(channel, response.serialize(
             new XDR(), xid, new VerifierNone()), xid);
         return;
       }
@@ -192,7 +192,7 @@ public class WriteManager {
         WRITE3Response response = new WRITE3Response(Nfs3Status.NFS3ERR_JUKEBOX,
             fileWcc, 0, request.getStableHow(), Nfs3Constant.WRITE_COMMIT_VERF);
         Nfs3Utils.writeChannel(channel,
-            response.writeHeaderAndResponse(new XDR(), xid, new VerifierNone()),
+            response.serialize(new XDR(), xid, new VerifierNone()),
             xid);
         return;
       }
@@ -297,7 +297,7 @@ public class WriteManager {
     COMMIT3Response response = new COMMIT3Response(status, fileWcc,
         Nfs3Constant.WRITE_COMMIT_VERF);
     Nfs3Utils.writeChannelCommit(channel,
-        response.writeHeaderAndResponse(new XDR(), xid, new VerifierNone()),
+        response.serialize(new XDR(), xid, new VerifierNone()),
         xid);
   }
 

+ 3 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt

@@ -275,6 +275,9 @@ Release 2.6.0 - UNRELEASED
 
     HDFS-7158. Reduce the memory usage of WebImageViewer. (wheat9)
 
+    HDFS-6894. Add XDR parser method for each NFS response.
+    (Brandon Li via wheat9)
+
   OPTIMIZATIONS
 
     HDFS-6690. Deduplicate xattr names in memory. (wang)