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 2010/09/21 21:35:10 UTC

svn commit: r999568 - in /avro/branches/branch-1.4: ./ lang/java/src/java/org/apache/avro/generic/ lang/java/src/java/org/apache/avro/io/ lang/java/src/java/org/apache/avro/util/ lang/java/src/test/java/org/apache/avro/generic/ lang/ruby/test/ share/te...

Author: cutting
Date: Tue Sep 21 19:35:10 2010
New Revision: 999568

URL: http://svn.apache.org/viewvc?rev=999568&view=rev
Log:
Merge r996877, r997962, r999554, and r999556 from trunk to 1.4 branch.  Fixes: AVRO-664, AVRO-667, and AVRO-668.

Modified:
    avro/branches/branch-1.4/   (props changed)
    avro/branches/branch-1.4/CHANGES.txt
    avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericData.java
    avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java
    avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/BinaryEncoder.java
    avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/BlockingBinaryEncoder.java
    avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/Encoder.java
    avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/JsonEncoder.java
    avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/ValidatingEncoder.java
    avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/util/Utf8.java
    avro/branches/branch-1.4/lang/java/src/test/java/org/apache/avro/generic/TestGenericData.java
    avro/branches/branch-1.4/lang/ruby/test/tool.rb
    avro/branches/branch-1.4/share/test/interop/bin/test_rpc_interop.sh

Propchange: avro/branches/branch-1.4/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Sep 21 19:35:10 2010
@@ -1 +1 @@
-/avro/trunk:990852,990860,990867,990871,990878,991031,991423,992146,992149,992167,996640,996642,996649,998347,998354
+/avro/trunk:990852,990860,990867,990871,990878,991031,991423,992146,992149,992167,996640,996642,996649,996877,997962,998347,998354,999554,999556

Modified: avro/branches/branch-1.4/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/CHANGES.txt?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/CHANGES.txt (original)
+++ avro/branches/branch-1.4/CHANGES.txt Tue Sep 21 19:35:10 2010
@@ -16,11 +16,19 @@ Avro 1.4.1 (unreleased)
 
     AVRO-634. IDL: Add support for aliases. (cutting)
 
+    AVRO-668. Java: Reduce object allocations while writing strings.
+    (scottcarey)
+
   BUG FIXES
 
     AVRO-657. Fix build so that md5 and sha1 checksum files contain
     only the file's basename without any directories. (cutting)
 
+    AVRO-664. Ruby server takes a long time to start in interop tests. (thiru)
+
+    AVRO-667. GenericArray fails to compare with List. SpecificRecord
+    compare gets ClassCastException. (scottcarey & cutting)
+
 Avro 1.4.0 (31 August 2010)
 
   INCOMPATIBLE CHANGES

Modified: avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericData.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericData.java?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericData.java (original)
+++ avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericData.java Tue Sep 21 19:35:10 2010
@@ -18,11 +18,11 @@
 package org.apache.avro.generic;
 
 import java.nio.ByteBuffer;
-import java.util.Iterator;
+import java.util.AbstractList;
 import java.util.Arrays;
-import java.util.Map;
 import java.util.Collection;
-import java.util.AbstractList;
+import java.util.Iterator;
+import java.util.Map;
 
 import org.apache.avro.AvroRuntimeException;
 import org.apache.avro.AvroTypeException;
@@ -30,6 +30,7 @@ import org.apache.avro.Schema;
 import org.apache.avro.Schema.Field;
 import org.apache.avro.Schema.Type;
 import org.apache.avro.io.BinaryData;
+import org.apache.avro.util.Utf8;
 
 /** Utilities for generic Java data. */
 public class GenericData {
@@ -120,9 +121,11 @@ public class GenericData {
     public T peek() {
       return (size < elements.length) ? (T)elements[size] : null;
     }
+    @Override
     public int hashCode() {
       return GenericData.get().hashCode(this, schema);
     }
+    @Override
     public boolean equals(Object o) {
       if (o == this) return true;                 // identical object
       if (!(o instanceof Array)) return false;    // not an array
@@ -147,6 +150,7 @@ public class GenericData {
         right--;
       }
     }
+    @Override
     public String toString() {
       StringBuffer buffer = new StringBuffer();
       buffer.append("[");
@@ -173,14 +177,17 @@ public class GenericData {
 
     public byte[] bytes() { return bytes; }
 
+    @Override
     public boolean equals(Object o) {
       if (o == this) return true;
       return o instanceof GenericFixed
         && Arrays.equals(bytes, ((GenericFixed)o).bytes());
     }
 
+    @Override
     public int hashCode() { return Arrays.hashCode(bytes); }
 
+    @Override
     public String toString() { return Arrays.toString(bytes); }
 
     public int compareTo(Fixed that) {
@@ -194,14 +201,17 @@ public class GenericData {
     private String symbol;
     public EnumSymbol(String symbol) { this.symbol = symbol; }
 
+    @Override
     public boolean equals(Object o) {
       if (o == this) return true;
       return o instanceof GenericEnumSymbol
         && symbol.equals(o.toString());
     }
 
+    @Override
     public int hashCode() { return symbol.hashCode(); }
 
+    @Override
     public String toString() { return symbol; }
   }
 
@@ -219,8 +229,8 @@ public class GenericData {
     case ENUM:
       return schema.getEnumSymbols().contains(datum.toString());
     case ARRAY:
-      if (!(datum instanceof GenericArray)) return false;
-      for (Object element : (GenericArray)datum)
+      if (!(datum instanceof Collection)) return false;
+      for (Object element : (Collection<?>)datum)
         if (!validate(schema.getElementType(), element))
           return false;
       return true;
@@ -273,7 +283,7 @@ public class GenericData {
       }
       buffer.append("}");
     } else if (datum instanceof Collection) {
-      Collection array = (Collection)datum;
+      Collection<?> array = (Collection<?>)datum;
       buffer.append("[");
       long last = array.size()-1;
       int i = 0;
@@ -317,7 +327,7 @@ public class GenericData {
       return ((IndexedRecord)datum).getSchema();
     } else if (datum instanceof Collection) {
       Schema elementType = null;
-      for (Object element : (Collection)datum) {
+      for (Object element : (Collection<?>)datum) {
         if (elementType == null) {
           elementType = induce(element);
         } else if (!elementType.equals(induce(element))) {
@@ -453,8 +463,8 @@ public class GenericData {
       }
       return hashCode;
     case ARRAY:
-      GenericArray a = (GenericArray)o;
-      Schema elementType = a.getSchema().getElementType();
+      Collection<?> a = (Collection<?>)o;
+      Schema elementType = s.getElementType();
       for (Object e : a)
         hashCode = hashCodeAdd(hashCode, e, elementType);
       return hashCode;
@@ -464,6 +474,8 @@ public class GenericData {
       return s.getEnumOrdinal(o.toString());
     case NULL:
       return 0;
+    case STRING:
+      return (o instanceof Utf8 ? o : new Utf8(o.toString())).hashCode();
     default:
       return o.hashCode();
     }
@@ -499,11 +511,11 @@ public class GenericData {
     case ENUM:
       return s.getEnumOrdinal(o1.toString()) - s.getEnumOrdinal(o2.toString());
     case ARRAY:
-      GenericArray a1 = (GenericArray)o1;
-      GenericArray a2 = (GenericArray)o2;
+      Collection a1 = (Collection)o1;
+      Collection a2 = (Collection)o2;
       Iterator e1 = a1.iterator();
       Iterator e2 = a2.iterator();
-      Schema elementType = a1.getSchema().getElementType();
+      Schema elementType = s.getElementType();
       while(e1.hasNext() && e2.hasNext()) {
         int compare = compare(e1.next(), e2.next(), elementType);
         if (compare != 0) return compare;
@@ -519,6 +531,10 @@ public class GenericData {
         : i1 - i2;
     case NULL:
       return 0;
+    case STRING:
+      Utf8 u1 = o1 instanceof Utf8 ? (Utf8)o1 : new Utf8(o1.toString());
+      Utf8 u2 = o2 instanceof Utf8 ? (Utf8)o2 : new Utf8(o2.toString());
+      return u1.compareTo(u2);
     default:
       return ((Comparable)o1).compareTo(o2);
     }

Modified: avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java (original)
+++ avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericDatumWriter.java Tue Sep 21 19:35:10 2010
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Collection;
 
 import org.apache.avro.AvroTypeException;
@@ -29,7 +28,6 @@ import org.apache.avro.Schema;
 import org.apache.avro.Schema.Field;
 import org.apache.avro.io.DatumWriter;
 import org.apache.avro.io.Encoder;
-import org.apache.avro.util.Utf8;
 
 /** {@link DatumWriter} for generic Java objects. */
 public class GenericDatumWriter<D> implements DatumWriter<D> {
@@ -188,9 +186,7 @@ public class GenericDatumWriter<D> imple
   /** Called to write a string.  May be overridden for alternate string
    * representations.*/
   protected void writeString(Object datum, Encoder out) throws IOException {
-    out.writeString(datum instanceof Utf8
-                    ? (Utf8)datum
-                    : new Utf8(datum.toString()));
+    out.writeString((CharSequence) datum);
   }
 
   /** Called to write a bytes.  May be overridden for alternate bytes

Modified: avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/BinaryEncoder.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/BinaryEncoder.java?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/BinaryEncoder.java (original)
+++ avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/BinaryEncoder.java Tue Sep 21 19:35:10 2010
@@ -130,10 +130,20 @@ public class BinaryEncoder extends Encod
 
   @Override
   public void writeString(Utf8 utf8) throws IOException {
-    encodeLong(utf8.getLength(), out);
-    out.write(utf8.getBytes(), 0, utf8.getLength());
+    encodeString(utf8.getBytes(), 0, utf8.getByteLength());
   }
-
+  
+  @Override
+  public void writeString(String string) throws IOException {
+    byte[] bytes = Utf8.getBytesFor(string);
+    encodeString(bytes, 0, bytes.length);
+  }
+  
+  private void encodeString(byte[] bytes, int offset, int length) throws IOException {
+    encodeLong(length, out);
+    out.write(bytes, offset, length);
+  }
+  
   @Override
   public void writeBytes(ByteBuffer bytes) throws IOException {
     byteWriter.write(bytes);

Modified: avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/BlockingBinaryEncoder.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/BlockingBinaryEncoder.java?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/BlockingBinaryEncoder.java (original)
+++ avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/BlockingBinaryEncoder.java Tue Sep 21 19:35:10 2010
@@ -85,7 +85,7 @@ public class BlockingBinaryEncoder exten
        *  _containing_ this block must be in the {@link #OVERFLOW}
        *  state. */
      OVERFLOW
-    };
+    }
 
     /** The type of this blocked value (ARRAY or MAP). */
     public Schema.Type type;
@@ -313,9 +313,15 @@ public class BlockingBinaryEncoder exten
 
   @Override
   public void writeString(Utf8 utf8) throws IOException {
-    writeBytes(utf8.getBytes(), 0, utf8.getLength());
-
-    assert check();
+    writeBytes(utf8.getBytes(), 0, utf8.getByteLength());
+    // assert called in writeBytes
+  }
+  
+  @Override
+  public void writeString(String str) throws IOException {
+    byte[] utf8bytes = Utf8.getBytesFor(str);
+    writeBytes(utf8bytes, 0, utf8bytes.length);
+    // assert called in writeBytes
   }
 
   @Override

Modified: avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/Encoder.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/Encoder.java?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/Encoder.java (original)
+++ avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/Encoder.java Tue Sep 21 19:35:10 2010
@@ -98,7 +98,9 @@ public abstract class Encoder implements
   public abstract void writeString(Utf8 utf8) throws IOException;
 
   /**
-   * Write a Unicode character string.
+   * Write a Unicode character string.  The default implementation converts
+   * the String to a {@link org.apache.avro.util.Utf8}.  Some Encoder 
+   * implementations may want to do something different as a performance optimization.
    * @throws AvroTypeException If this is a stateful writer and a
    * char-string is not expected
    */
@@ -107,6 +109,20 @@ public abstract class Encoder implements
   }
 
   /**
+   * Write a Unicode character string.  If the CharSequence is an
+   * {@link org.apache.avro.util.Utf8} it writes this directly, otherwise
+   * the CharSequence is converted to a String via toString() and written.
+   * @throws AvroTypeException If this is a stateful writer and a
+   * char-string is not expected
+   */
+  public void writeString(CharSequence charSequence) throws IOException {
+    if (charSequence instanceof Utf8)
+      writeString((Utf8)charSequence);
+    else
+      writeString(charSequence.toString());
+  }
+  
+  /**
    * Write a byte string.
    * @throws AvroTypeException If this is a stateful writer and a
    *         byte-string is not expected

Modified: avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/JsonEncoder.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/JsonEncoder.java?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/JsonEncoder.java (original)
+++ avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/JsonEncoder.java Tue Sep 21 19:35:10 2010
@@ -109,12 +109,17 @@ public class JsonEncoder extends Parsing
 
   @Override
   public void writeString(Utf8 utf8) throws IOException {
+    writeString(utf8.toString());
+  }
+  
+  @Override 
+  public void writeString(String str) throws IOException {
     parser.advance(Symbol.STRING);
     if (parser.topSymbol() == Symbol.MAP_KEY_MARKER) {
       parser.advance(Symbol.MAP_KEY_MARKER);
-      out.writeFieldName(utf8.toString());
+      out.writeFieldName(str);
     } else {
-      out.writeString(utf8.toString());
+      out.writeString(str);
     }
   }
 

Modified: avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/ValidatingEncoder.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/ValidatingEncoder.java?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/ValidatingEncoder.java (original)
+++ avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/io/ValidatingEncoder.java Tue Sep 21 19:35:10 2010
@@ -105,6 +105,18 @@ public class ValidatingEncoder extends P
     parser.advance(Symbol.STRING);
     out.writeString(utf8);
   }
+  
+  @Override
+  public void writeString(String str) throws IOException {
+    parser.advance(Symbol.STRING);
+    out.writeString(str);
+  }
+  
+  @Override
+  public void writeString(CharSequence charSequence) throws IOException {
+    parser.advance(Symbol.STRING);
+    out.writeString(charSequence);
+  }
 
   @Override
   public void writeBytes(ByteBuffer bytes) throws IOException {

Modified: avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/util/Utf8.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/util/Utf8.java?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/util/Utf8.java (original)
+++ avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/util/Utf8.java Tue Sep 21 19:35:10 2010
@@ -18,6 +18,7 @@
 package org.apache.avro.util;
 
 import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
 
 import org.apache.avro.io.BinaryData;
 
@@ -27,6 +28,10 @@ import org.apache.avro.io.BinaryData;
 public class Utf8 implements Comparable<Utf8>, CharSequence {
   private static final byte[] EMPTY = new byte[0];
 
+  private static final Charset UTF8_CS;
+  static {
+    UTF8_CS = Charset.forName("UTF-8");
+  }
   private byte[] bytes = EMPTY;
   private int length;
   private String string;
@@ -34,11 +39,7 @@ public class Utf8 implements Comparable<
   public Utf8() {}
 
   public Utf8(String string) {
-    try {
-      this.bytes = string.getBytes("UTF-8");
-    } catch (UnsupportedEncodingException e) {
-      throw new RuntimeException(e);
-    }
+    this.bytes = string.getBytes(UTF8_CS);
     this.length = bytes.length;
     this.string = string;
   }
@@ -79,6 +80,7 @@ public class Utf8 implements Comparable<
     return this;
   }
 
+  @Override
   public String toString() {
     if (this.string == null)
       try {
@@ -89,6 +91,7 @@ public class Utf8 implements Comparable<
     return this.string;
   }
 
+  @Override
   public boolean equals(Object o) {
     if (o == this) return true;
     if (!(o instanceof Utf8)) return false;
@@ -101,6 +104,7 @@ public class Utf8 implements Comparable<
     return true;
   }
 
+  @Override
   public int hashCode() {
     int hash = 0;
     for (int i = 0; i < this.length; i++)
@@ -120,5 +124,9 @@ public class Utf8 implements Comparable<
     return toString().subSequence(start, end);
   }
 
+  /** Gets the UTF-8 bytes for a String */
+  public static byte[] getBytesFor(String str) {
+    return str.getBytes(UTF8_CS);
+  }
 
 }

Modified: avro/branches/branch-1.4/lang/java/src/test/java/org/apache/avro/generic/TestGenericData.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/java/src/test/java/org/apache/avro/generic/TestGenericData.java?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/java/src/test/java/org/apache/avro/generic/TestGenericData.java (original)
+++ avro/branches/branch-1.4/lang/java/src/test/java/org/apache/avro/generic/TestGenericData.java Tue Sep 21 19:35:10 2010
@@ -19,6 +19,8 @@ package org.apache.avro.generic;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Collection;
+import java.util.ArrayDeque;
 
 import static org.junit.Assert.*;
 
@@ -28,6 +30,7 @@ import org.apache.avro.Schema;
 import org.apache.avro.Schema.Field;
 import org.apache.avro.AvroRuntimeException;
 import org.apache.avro.Schema.Type;
+import org.apache.avro.util.Utf8;
 
 import org.junit.Test;
 
@@ -59,6 +62,43 @@ public class TestGenericData {
     GenericData.get().hashCode(null, Schema.create(Type.NULL));
     GenericData.get().hashCode(null, Schema.createUnion(
         Arrays.asList(Schema.create(Type.BOOLEAN), Schema.create(Type.STRING))));
+    List<CharSequence> stuff = new ArrayList<CharSequence>();
+    stuff.add("string");
+    Schema schema = recordSchema();
+    GenericRecord r = new GenericData.Record(schema);
+    r.put(0, stuff);
+    GenericData.get().hashCode(r, schema);
+  }
+  
+  @Test
+  public void testEquals() {
+    Schema s = recordSchema();
+    GenericRecord r0 = new GenericData.Record(s);
+    GenericRecord r1 = new GenericData.Record(s);
+    GenericRecord r2 = new GenericData.Record(s);
+    Collection<CharSequence> l0 = new ArrayDeque<CharSequence>();
+    List<CharSequence> l1 = new ArrayList<CharSequence>();
+    GenericArray<CharSequence> l2 = 
+      new GenericData.Array<CharSequence>(1,s.getFields().get(0).schema());
+    String foo = "foo";
+    l0.add(new StringBuffer(foo));
+    l1.add(foo);
+    l2.add(new Utf8(foo));
+    r0.put(0, l0);
+    r1.put(0, l1);
+    r2.put(0, l2);
+    assertEquals(r0, r1);
+    assertEquals(r0, r2);
+    assertEquals(r1, r2);
+  }
+  
+  private Schema recordSchema() {
+    List<Field> fields = new ArrayList<Field>();
+    fields.add(new Field("anArray", Schema.createArray(Schema.create(Type.STRING)), null, null));
+    Schema schema = Schema.createRecord("arrayFoo", "test", "mytest", false);
+    schema.setFields(fields);
+    
+    return schema;
   }
 
   @Test

Modified: avro/branches/branch-1.4/lang/ruby/test/tool.rb
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/ruby/test/tool.rb?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/ruby/test/tool.rb (original)
+++ avro/branches/branch-1.4/lang/ruby/test/tool.rb Tue Sep 21 19:35:10 2010
@@ -49,7 +49,7 @@ end
 def run_server(uri, proto, msg, datum)
   uri = URI.parse(uri)
   $responder = GenericResponder.new(proto, msg, datum)
-  server = WEBrick::HTTPServer.new(:Host => uri.host,
+  server = WEBrick::HTTPServer.new(:BindAddress => uri.host,
                                    :Port => uri.port,
                                    :Logger => Logger.new(StringIO.new))
   server.mount '/', GenericHandler

Modified: avro/branches/branch-1.4/share/test/interop/bin/test_rpc_interop.sh
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/share/test/interop/bin/test_rpc_interop.sh?rev=999568&r1=999567&r2=999568&view=diff
==============================================================================
--- avro/branches/branch-1.4/share/test/interop/bin/test_rpc_interop.sh (original)
+++ avro/branches/branch-1.4/share/test/interop/bin/test_rpc_interop.sh Tue Sep 21 19:35:10 2010
@@ -58,9 +58,20 @@ do
 	    echo TEST: $c
 	    for client in "${clients[@]}"
 	    do
+        rm -rf $portfile
 		$server http://127.0.0.1:0/ $proto $msg -file $c/response.avro \
 		    > $portfile &
-		sleep 1				  # wait for server to start
+        count=0
+        while [ ! -s $portfile ]
+        do
+            sleep 1
+            if [ $count -ge 10 ]
+            then
+                echo $server did not start.
+                exit 1
+            fi
+            count=`expr $count + 1`
+        done
 		read ignore port < $portfile
 	    	$client http://127.0.0.1:$port $proto $msg -file $c/request.avro
 		wait