You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by cu...@apache.org on 2011/06/02 13:52:08 UTC

svn commit: r1130505 - in /avro/branches/branch-1.5: ./ lang/java/ipc/src/main/java/org/apache/avro/ipc/ lang/java/ipc/src/main/java/org/apache/avro/ipc/generic/ lang/java/ipc/src/main/java/org/apache/avro/ipc/reflect/ lang/java/ipc/src/main/java/org/a...

Author: cutting
Date: Thu Jun  2 11:52:07 2011
New Revision: 1130505

URL: http://svn.apache.org/viewvc?rev=1130505&view=rev
Log:
Merge -c 1130503 from trunk  to 1.5 branch.  Fixes: AVRO-832.

Modified:
    avro/branches/branch-1.5/   (props changed)
    avro/branches/branch-1.5/CHANGES.txt
    avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/Requestor.java
    avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/generic/GenericRequestor.java
    avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/reflect/ReflectRequestor.java
    avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/specific/SpecificRequestor.java
    avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/TestProtocolGeneric.java
    avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/ipc/TestSaslAnonymous.java
    avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/ipc/TestSaslDigestMd5.java

Propchange: avro/branches/branch-1.5/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jun  2 11:52:07 2011
@@ -1 +1 @@
-/avro/trunk:1075938,1075993,1078917,1079055,1079060,1079063,1083246,1085921,1086727,1086730,1086866,1087076,1087129,1087136,1087439-1087440,1087463,1087472,1087792,1089128,1089131,1089550,1094812,1095206-1095208,1095493,1095529,1095548,1095550,1096798,1097916,1097927,1097968,1097974,1102332,1102335,1124127,1124971,1129053,1129071,1129697-1129706,1129729
+/avro/trunk:1075938,1075993,1078917,1079055,1079060,1079063,1083246,1085921,1086727,1086730,1086866,1087076,1087129,1087136,1087439-1087440,1087463,1087472,1087792,1089128,1089131,1089550,1094812,1095206-1095208,1095493,1095529,1095548,1095550,1096798,1097916,1097927,1097968,1097974,1102332,1102335,1124127,1124971,1129053,1129071,1129697-1129706,1129729,1130503

Modified: avro/branches/branch-1.5/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.5/CHANGES.txt?rev=1130505&r1=1130504&r2=1130505&view=diff
==============================================================================
--- avro/branches/branch-1.5/CHANGES.txt (original)
+++ avro/branches/branch-1.5/CHANGES.txt Thu Jun  2 11:52:07 2011
@@ -31,6 +31,9 @@ Avro 1.5.2 (unreleased)
 
     AVRO-809. Java: Fix reflect for classes that have no package. (cutting)
 
+    AVRO-832. Java: Fix RPC client to correctly perform schema
+    resolution on message responses.  (cutting)
+
 Avro 1.5.1 (3 May 2011)
 
   NEW FEATURES

Modified: avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/Requestor.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/Requestor.java?rev=1130505&r1=1130504&r2=1130505&view=diff
==============================================================================
--- avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/Requestor.java (original)
+++ avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/Requestor.java Thu Jun  2 11:52:07 2011
@@ -150,7 +150,7 @@ public abstract class Requestor {
     context.setResponseCallMeta(META_READER.read(null, in));
     
     if (!in.readBoolean()) {                      // no error
-      Object response = readResponse(rm.getResponse(), in);
+      Object response = readResponse(rm.getResponse(), m.getResponse(), in);
       context.setResponse(response);
       for (RPCPlugin plugin : rpcMetaPlugins) {
         plugin.clientReceiveResponse(context);
@@ -158,7 +158,7 @@ public abstract class Requestor {
       return response;
       
     } else {
-      Exception error = readError(rm.getErrors(), in);
+      Exception error = readError(rm.getErrors(), m.getErrors(), in);
       context.setError(error);
       for (RPCPlugin plugin : rpcMetaPlugins) {
         plugin.clientReceiveResponse(context);
@@ -275,12 +275,22 @@ public abstract class Requestor {
   public abstract void writeRequest(Schema schema, Object request,
                                     Encoder out) throws IOException;
 
+  @Deprecated                                     // for compatibility in 1.5
+  public Object readResponse(Schema schema, Decoder in) throws IOException {
+    return readResponse(schema, schema, in);
+  }
+
   /** Reads a response message. */
-  public abstract Object readResponse(Schema schema, Decoder in)
+  public abstract Object readResponse(Schema writer, Schema reader, Decoder in)
     throws IOException;
 
+  @Deprecated                                     // for compatibility in 1.5
+  public Object readError(Schema schema, Decoder in) throws IOException {
+    return readError(schema, schema, in);
+  }
+
   /** Reads an error message. */
-  public abstract Exception readError(Schema schema, Decoder in)
+  public abstract Exception readError(Schema writer, Schema reader, Decoder in)
     throws IOException;
 }
 

Modified: avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/generic/GenericRequestor.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/generic/GenericRequestor.java?rev=1130505&r1=1130504&r2=1130505&view=diff
==============================================================================
--- avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/generic/GenericRequestor.java (original)
+++ avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/generic/GenericRequestor.java Thu Jun  2 11:52:07 2011
@@ -59,14 +59,15 @@ public class GenericRequestor extends Re
   }
 
   @Override
-  public Object readResponse(Schema schema, Decoder in) throws IOException {
-    return new GenericDatumReader<Object>(schema).read(null, in);
+  public Object readResponse(Schema writer, Schema reader, Decoder in)
+    throws IOException {
+    return new GenericDatumReader<Object>(writer, reader).read(null, in);
   }
 
   @Override
-  public Exception readError(Schema schema, Decoder in)
+  public Exception readError(Schema writer, Schema reader, Decoder in)
     throws IOException {
-    Object error = new GenericDatumReader<Object>(schema).read(null,in);
+    Object error = new GenericDatumReader<Object>(writer, reader).read(null,in);
     if (error instanceof CharSequence)
       return new AvroRuntimeException(error.toString()); // system error
     return new AvroRemoteException(error);

Modified: avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/reflect/ReflectRequestor.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/reflect/ReflectRequestor.java?rev=1130505&r1=1130504&r2=1130505&view=diff
==============================================================================
--- avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/reflect/ReflectRequestor.java (original)
+++ avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/reflect/ReflectRequestor.java Thu Jun  2 11:52:07 2011
@@ -50,8 +50,8 @@ public class ReflectRequestor extends Sp
   }
 
   @Override
-  protected DatumReader<Object> getDatumReader(Schema schema) {
-    return new ReflectDatumReader<Object>(schema);
+  protected DatumReader<Object> getDatumReader(Schema writer, Schema reader) {
+    return new ReflectDatumReader<Object>(writer, reader);
   }
 
   /** Create a proxy instance whose methods invoke RPCs. */

Modified: avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/specific/SpecificRequestor.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/specific/SpecificRequestor.java?rev=1130505&r1=1130504&r2=1130505&view=diff
==============================================================================
--- avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/specific/SpecificRequestor.java (original)
+++ avro/branches/branch-1.5/lang/java/ipc/src/main/java/org/apache/avro/ipc/specific/SpecificRequestor.java Thu Jun  2 11:52:07 2011
@@ -59,8 +59,13 @@ public class SpecificRequestor extends R
     return new SpecificDatumWriter<Object>(schema);
   }
 
+  @Deprecated                                     // for compatibility in 1.5
   protected DatumReader<Object> getDatumReader(Schema schema) {
-    return new SpecificDatumReader<Object>(schema);
+    return getDatumReader(schema, schema);
+  }
+
+  protected DatumReader<Object> getDatumReader(Schema writer, Schema reader) {
+    return new SpecificDatumReader<Object>(writer, reader);
   }
 
   @Override
@@ -73,14 +78,15 @@ public class SpecificRequestor extends R
   }
     
   @Override
-  public Object readResponse(Schema schema, Decoder in) throws IOException {
-    return getDatumReader(schema).read(null, in);
+  public Object readResponse(Schema writer, Schema reader, Decoder in)
+    throws IOException {
+    return getDatumReader(writer, reader).read(null, in);
   }
 
   @Override
-  public Exception readError(Schema schema, Decoder in)
+  public Exception readError(Schema writer, Schema reader, Decoder in)
     throws IOException {
-    Object value = getDatumReader(schema).read(null, in);
+    Object value = getDatumReader(writer, reader).read(null, in);
     if (value instanceof Exception)
       return (Exception)value;
     return new AvroRuntimeException(value.toString());

Modified: avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/TestProtocolGeneric.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/TestProtocolGeneric.java?rev=1130505&r1=1130504&r2=1130505&view=diff
==============================================================================
--- avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/TestProtocolGeneric.java (original)
+++ avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/TestProtocolGeneric.java Thu Jun  2 11:52:07 2011
@@ -44,6 +44,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
+import org.codehaus.jackson.node.BooleanNode;
+
 public class TestProtocolGeneric {
   private static final Logger LOG
     = LoggerFactory.getLogger(TestProtocolGeneric.class);
@@ -211,6 +213,50 @@ public class TestProtocolGeneric {
     }
   }
 
+  @Test
+  /** Construct and use a different protocol whose "echo" response has an extra
+      field to check that correct schema is used to parse response. */
+  public void testResponseChange() throws IOException {
+
+    List<Field> fields = new ArrayList<Field>();
+    for (Field f : PROTOCOL.getType("TestRecord").getFields())
+      fields.add(new Field(f.name(), f.schema(), null, null));
+    fields.add(new Field("extra", Schema.create(Schema.Type.BOOLEAN),
+                         null, BooleanNode.TRUE));
+    Schema record =
+      Schema.createRecord("TestRecord", null, "org.apache.avro.test", false);
+    record.setFields(fields);
+
+    Protocol protocol = new Protocol("Simple", "org.apache.avro.test");
+    List<Field> params = new ArrayList<Field>();
+    params.add(new Field("record", record, null, null));
+
+    Protocol.Message message =
+      protocol.createMessage("echo", null, Schema.createRecord(params),
+                             record,
+                             Schema.createUnion(new ArrayList<Schema>()));
+    protocol.getMessages().put("echo", message);
+    Transceiver t
+      = new SocketTransceiver(new InetSocketAddress(server.getPort()));
+    try {
+      GenericRequestor r = new GenericRequestor(protocol, t);
+      GenericRecord args = new GenericData.Record(message.getRequest());
+      GenericRecord rec = new GenericData.Record(record);
+      rec.put("name", new Utf8("foo"));
+      rec.put("kind", new GenericData.EnumSymbol
+              (PROTOCOL.getType("Kind"), "BAR"));
+      rec.put("hash", new GenericData.Fixed
+              (PROTOCOL.getType("MD5"),
+               new byte[]{0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5}));
+      rec.put("extra", Boolean.TRUE);
+      args.put("record", rec);
+      GenericRecord response = (GenericRecord)r.request("echo", args);
+      assertEquals(rec, response);
+    } finally {
+      t.close();
+    }
+  }
+
   @AfterClass
   public static void testStopServer() throws IOException {
     client.close();

Modified: avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/ipc/TestSaslAnonymous.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/ipc/TestSaslAnonymous.java?rev=1130505&r1=1130504&r2=1130505&view=diff
==============================================================================
--- avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/ipc/TestSaslAnonymous.java (original)
+++ avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/ipc/TestSaslAnonymous.java Thu Jun  2 11:52:07 2011
@@ -48,6 +48,7 @@ public class TestSaslAnonymous extends T
   }
 
   @Override public void testHandshake() throws IOException {}
+  @Override public void testResponseChange() throws IOException {}
 
   public interface ProtoInterface {
     byte[] test(byte[] b);

Modified: avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/ipc/TestSaslDigestMd5.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/ipc/TestSaslDigestMd5.java?rev=1130505&r1=1130504&r2=1130505&view=diff
==============================================================================
--- avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/ipc/TestSaslDigestMd5.java (original)
+++ avro/branches/branch-1.5/lang/java/ipc/src/test/java/org/apache/avro/ipc/TestSaslDigestMd5.java Thu Jun  2 11:52:07 2011
@@ -163,5 +163,6 @@ public class TestSaslDigestMd5 extends T
   }
 
   @Override public void testHandshake() throws IOException {}
+  @Override public void testResponseChange() throws IOException {}
 
 }