[e-cvs] cvs commit: e/src/jsrc/org/erights/e/elib/tests TestELib.java

markm@eros.cs.jhu.edu markm@eros.cs.jhu.edu
Wed, 22 Aug 2001 10:26:14 -0400


markm       01/08/22 10:26:14

  Modified:    src/jsrc/net/captp/jcomm LocatorUnum.java NonceLocator.java
                        ProxyConnection.java RemoteHandler.java
                        SturdyRef.java
               src/jsrc/org/erights/e/elib/ref Ref.java
               src/jsrc/org/erights/e/elib/serial PersistenceReplacer.java
               src/jsrc/org/erights/e/elib/tests TestELib.java
  Log:
  better captp error reporting.  DeliverOp args order changed

Revision  Changes    Path
1.7       +3 -3      e/src/jsrc/net/captp/jcomm/LocatorUnum.java

Index: LocatorUnum.java
===================================================================
RCS file: /cvs/e/src/jsrc/net/captp/jcomm/LocatorUnum.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- LocatorUnum.java	2001/08/21 14:28:14	1.6
+++ LocatorUnum.java	2001/08/22 14:26:14	1.7
@@ -75,7 +75,7 @@
     }
     
     /**
-     * The basic operation underlying 'SturdyRef.getPass()'. This is where
+     * The basic operation underlying 'SturdyRef.getGrip()'. This is where
      * a reference to a remote object actually gets the various underlying 
      * comm systems connected so that we can send messages.
      *
@@ -87,14 +87,14 @@
      *                   via whoever we got it from long enough to fetch our 
      *                   own Remote reference via this lookup.  
      */
-    public Object getPass(ConstList searchPath,
+    public Object getGrip(ConstList searchPath,
                           String vatID, 
                           BigInteger swissNum,
                           Object optFarVine)
     throws IOException, IndexOutOfBoundsException {
         if (Trace.captp.debug && Trace.ON) {
             Trace.captp.debugm
-                ("" + this + ".getPass(" + searchPath + ", " + vatID + 
+                ("" + this + ".getGrip(" + searchPath + ", " + vatID + 
                  ", " + swissNum + ", " + optFarVine + ")");
         }
         ProxyConnection optProxyConn = 



1.5       +23 -8     e/src/jsrc/net/captp/jcomm/NonceLocator.java

Index: NonceLocator.java
===================================================================
RCS file: /cvs/e/src/jsrc/net/captp/jcomm/NonceLocator.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- NonceLocator.java	2001/08/20 21:17:49	1.4
+++ NonceLocator.java	2001/08/22 14:26:14	1.5
@@ -27,14 +27,16 @@
 import net.captp.tables.NearGiftTable;
 import net.captp.tables.SwissTable;
 import net.captp.tables.Vine;
+import org.erights.e.develop.trace.Trace;
 import org.erights.e.elib.ref.Ref;
 import org.erights.e.meta.java.math.BigIntegerSugar;
 
 /**
- * Made magically available at incoming position 0. <p>
+ * Made magically available at incoming position 0.
+ * <p>
+ * Used to resolve 3-vat live Granovetter introductions, and to log tracing 
+ * info sent from the other vat.
  *
- * Used to resolve 3-vat live Granovetter introductions.
- *
  * @author Mark S. Miller
  */
 public class NonceLocator {
@@ -67,11 +69,11 @@
     /**
      *
      */
-    public NonceLocator(PromiseGiftTable pGifts,
-                        NearGiftTable nGifts,
-                        String ownID,
-                        ProxyMgr proxyMgr,
-                        SwissTable swissTable)
+    /*package*/ NonceLocator(PromiseGiftTable pGifts,
+                             NearGiftTable nGifts,
+                             String ownID,
+                             ProxyMgr proxyMgr,
+                             SwissTable swissTable)
     {
         myPGifts = pGifts;
         myNGifts = nGifts;
@@ -183,5 +185,18 @@
      */
     public Object lookupSwiss(BigInteger swissNum, Object optFarVine) {
         return mySwissTable.lookupSwiss(swissNum);
+    }
+    
+    /**
+     * Enables our counterparty to log a message to our tracing system.
+     * <p>
+     * These messages are tagged with the vatID of our counterparty.  They 
+     * are logged at debug level, and currently to the "captp" subsystem.  
+     * These should probably instead have their own subsystem.
+     */
+    public void traceRemote(String message) {
+        if (Trace.captp.debug && Trace.ON) {
+            Trace.captp.debugm(myOwnID + ": " + message);
+        }
     }
 }



1.23      +74 -25    e/src/jsrc/net/captp/jcomm/ProxyConnection.java

Index: ProxyConnection.java
===================================================================
RCS file: /cvs/e/src/jsrc/net/captp/jcomm/ProxyConnection.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- ProxyConnection.java	2001/08/20 21:17:49	1.22
+++ ProxyConnection.java	2001/08/22 14:26:14	1.23
@@ -108,8 +108,10 @@
 
     /** 
      * Queue delivery of message, resolve answer to the outcome.
+     * <p>
+     * DELIVER_OP as 9 had a different argument order
      */
-    static private final byte DELIVER_OP = 9;
+    static private final byte DELIVER_OP = 13;
 
     /** 
      * An import on the other has gone away dropping some number of 
@@ -626,20 +628,29 @@
             case DELIVER_ONLY_OP: {
                 int recipPos = pis.readInt();
                 String verb = ((String)pis.readUTF()).intern();
-                Object[] args = (Object[])pis.readObject();
+                try {
+                    Object[] args = (Object[])pis.readObject();
                     
-                execDeliverOnlyOp(recipPos, verb, args);
+                    execDeliverOnlyOp(recipPos, verb, args);
+                } catch (Throwable problem) {
+                    whyNoDeliverOnlyOp(recipPos, verb, problem);
+                }
                 break;
             }
             case DELIVER_OP: {
+                int answerPos = pis.readInt();
+                Object rdr = pis.readObject();
                 int recipPos = pis.readInt();
                 String verb = ((String)pis.readUTF()).intern();
-                Object[] args = (Object[])pis.readObject();
-                int answerPos = pis.readInt();
-                Object redirector = pis.readObject();
+                try {
+                    Object[] args = (Object[])pis.readObject();
                     
-                execDeliverOp(recipPos, verb, args,
-                              answerPos, redirector);
+                    execDeliverOp(answerPos, rdr,
+                                  recipPos, verb, args);
+                } catch (Throwable problem) {
+                    whyNoDeliverOp(answerPos, rdr,
+                                   recipPos, verb, problem);
+                }
                 break;
             }
             case GC_EXPORT_OP: {
@@ -684,7 +695,9 @@
     /**
      *
      */
-    private void execDeliverOnlyOp(int recipPos, String verb, Object[] args) {
+    private void execDeliverOnlyOp(int recipPos, String verb,
+                                   Object[] args)
+    {
         if (Trace.captp.debug && Trace.ON) {
             Trace.captp.debugm(
                 "exec DeliverOnlyOp(" + recipPos + ", " + verb + ", " + 
@@ -697,19 +710,56 @@
     /**
      *
      */
-    private void execDeliverOp(int recipPos, String verb, Object[] args,
-                               int answerPos, Object redirector)
+    private void whyNoDeliverOnlyOp(int recipPos, String verb,
+                                    Throwable problem)
     {
+        String msg = "whyNoDeliverOnlyOp(" + recipPos + ", " + verb + ", " +
+                                         problem + ")";
+        //Note: trace level is warning
+        if (Trace.captp.warning && Trace.ON) {
+            Trace.captp.warningm(msg, problem);
+        }
+        if (0 != recipPos || ! "traceRemote".equals(verb)) {
+            //Just locally report a failure to remotely report,
+            //in order to avoid a potential bounce cycle.  All others
+            //are remotely reported as well.
+            E.sendOnly(myRemoteNonceLocator, "traceRemote", msg);
+        }
+    }
+    
+    /**
+     *
+     */
+    private void execDeliverOp(int answerPos, Object rdr,
+                               int recipPos, String verb, Object[] args)
+    {
         if (Trace.captp.debug && Trace.ON) {
             Trace.captp.debugm(
-                "exec DeliverOp(" + recipPos + ", " + verb + ", " + 
-                                argsString(args) + ",\n  " +
-                                answerPos + ", " + redirector + ")");
+                "exec DeliverOp(" + answerPos + ", " + rdr + ",\n  " +
+                                recipPos + ", " + verb + ", " + 
+                                argsString(args) + ")");
         }
         Object recip = getIncoming(recipPos);
         Ref answer = E.sendAll(recip, verb, args);
         myAnswers.put(-answerPos, answer, true);
-        E.sendOnly(answer, "whenMoreResolved", redirector);
+        E.sendOnly(answer, "whenMoreResolved", rdr);
+    }
+    
+    /**
+     *
+     */
+    private void whyNoDeliverOp(int answerPos, Object rdr,
+                                int recipPos, String verb, Throwable problem)
+    {
+        //Note: trace level is warning
+        if (Trace.captp.warning && Trace.ON) {
+            Trace.captp.warningm(
+                "whyNoDeliverOp(" + answerPos + ", " + rdr + ",\n  " +
+                                recipPos + ", " + verb + ", ???)",
+                problem);
+        }
+        myAnswers.put(-answerPos, problem, true);
+        E.sendOnly(problem, "whenMoreResolved", rdr);
     }
     
     /**
@@ -809,29 +859,28 @@
     /**
      *
      */
-    /*package*/ void sendDeliverOp(int recipPos,
+    /*package*/ void sendDeliverOp(int answerPos,
+                                   Object rdr,
+                                   int recipPos,
                                    String verb,
-                                   Object[] args,
-                                   
-                                   int answerPos,
-                                   Object redirector)
+                                   Object[] args)
     {
         if (Trace.captp.debug && Trace.ON) {
             Trace.captp.debugm(
-                "send DeliverOp(" + recipPos + ", " + verb + ", " + 
-                                argsString(args) + ",\n  " +
-                                answerPos + ", " + redirector + ")");
+                "send DeliverOp(" + answerPos + ", " + rdr + ",\n  " +
+                                recipPos + ", " + verb + ", " + 
+                                argsString(args) + ")");
         }
         if (null != myOptProblem) {
             throw ExceptionMgr.asSafe(myOptProblem);
         }
         try {
             ProxyOutputStream pos = makeMsg(DELIVER_OP);
+            pos.writeInt(answerPos);
+            pos.writeObject(rdr);
             pos.writeInt(recipPos);
             pos.writeUTF(verb);
             pos.writeObject(args);
-            pos.writeInt(answerPos);
-            pos.writeObject(redirector);
             sendMsg(pos);
         } catch (Throwable problem) {
             killConnection(problem, false);



1.12      +4 -4      e/src/jsrc/net/captp/jcomm/RemoteHandler.java

Index: RemoteHandler.java
===================================================================
RCS file: /cvs/e/src/jsrc/net/captp/jcomm/RemoteHandler.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- RemoteHandler.java	2001/08/20 21:17:49	1.11
+++ RemoteHandler.java	2001/08/22 14:26:14	1.12
@@ -170,11 +170,11 @@
         }
         ProxyResolver pr = myConn.makeQuestion();
         RemotePromiseHandler rvh = (RemotePromiseHandler)pr.optHandler();
-        myConn.sendDeliverOp(myPos,
+        myConn.sendDeliverOp(rvh.getPos(),
+                             new DelayedRedirector(pr),
+                             myPos,
                              verb,
-                             args,
-                             rvh.getPos(),
-                             new DelayedRedirector(pr));
+                             args);
         return pr.getProxy();
     }
     



1.11      +6 -6      e/src/jsrc/net/captp/jcomm/SturdyRef.java

Index: SturdyRef.java
===================================================================
RCS file: /cvs/e/src/jsrc/net/captp/jcomm/SturdyRef.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- SturdyRef.java	2001/08/21 14:28:14	1.10
+++ SturdyRef.java	2001/08/22 14:26:14	1.11
@@ -128,25 +128,25 @@
      * Return a (live) reference to the object which this SturdyRef 
      * designates.  The result may be either a direct or eventual reference.
      */
-    public Object getPass() throws IOException {
-        return myLocatorUnum.getPass(mySearchPath, 
+    public Object getGrip() throws IOException {
+        return myLocatorUnum.getGrip(mySearchPath, 
                                      myHostID,
                                      mySwissNum,
                                      null);
     }
 
     /**
-     * @deprecated Use getPass() instead.
+     * @deprecated Use getGrip() instead.
      */
     public Object liveRef() throws IOException {
-        return getPass();
+        return getGrip();
     }
 
     /**
-     * @deprecated Use getPass() instead.
+     * @deprecated Use getGrip() instead.
      */
     public Object promiseRef() throws IOException {
-        return getPass();
+        return getGrip();
     }
 
     /**



1.25      +23 -0     e/src/jsrc/org/erights/e/elib/ref/Ref.java

Index: Ref.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/ref/Ref.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- Ref.java	2001/08/21 13:36:19	1.24
+++ Ref.java	2001/08/22 14:26:14	1.25
@@ -154,6 +154,29 @@
     }
 
     /**
+     * Return a Disconnected reference -- a broken reference with the same 
+     * identity as some far reference.
+     * <p>
+     * 'prevRef' must currently be a far or disconnected reference.  While 
+     * it seems sensible to allow one to make a Disconnected reference to a 
+     * Near object, there's no way to provide this in Ref without destroying 
+     * our layering -- the independence of local ELib from the CapTP layer.
+     */
+    static public Ref disconnected(Object problem, Object prevRef) {
+        prevRef = resolution(prevRef);
+        Object id;
+        if (prevRef instanceof FarRef) {
+            id = ((FarRef)prevRef).myIdentity;
+        } else if (prevRef instanceof DisconnectedRef) {
+            id = ((DisconnectedRef)prevRef).myIdentity;
+        } else {
+            throw new RuntimeException("must be far or disconnected " + 
+                                       prevRef);
+        }
+        return new DisconnectedRef(problem, id);
+    }
+
+    /**
      * Does this reference designate an object in this vat?
      * 
      * @see #state(Object)



1.3       +1 -2      e/src/jsrc/org/erights/e/elib/serial/PersistenceReplacer.java

Index: PersistenceReplacer.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/serial/PersistenceReplacer.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- PersistenceReplacer.java	2001/08/20 00:45:04	1.2
+++ PersistenceReplacer.java	2001/08/22 14:26:14	1.3
@@ -60,8 +60,7 @@
         }
         if (Ref.isEventual(ref)) {
             if (Ref.isResolved(ref)) {
-                throw new RuntimeException
-                    ("XXX far ref serialization not yet implemented");
+                return Ref.disconnected("Was far", ref);
             } else {
                 return Ref.broken("Was a promise");
             }



1.20      +1 -5      e/src/jsrc/org/erights/e/elib/tests/TestELib.java

Index: TestELib.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elib/tests/TestELib.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- TestELib.java	2001/04/28 10:00:06	1.19
+++ TestELib.java	2001/08/22 14:26:14	1.20
@@ -22,7 +22,6 @@
 import org.erights.e.develop.exception.PrintStreamWriter;
 import org.erights.e.elib.prim.E;
 import org.erights.e.elib.ref.OneArgFuncAdapter;
-import org.erights.e.elib.ref.Ref;
 
 /**
  * TestELib -- simple tester to send a message to an object and
@@ -84,7 +83,7 @@
         // Send the message.  The following is the
         // equivelent of: returnVal = target.addOne(startVal);
         // "p" is the returned promise.
-        Ref p = E.send(target, "addOne", new Integer(startVal));
+        Object p = E.send(target, "addOne", new Integer(startVal));
 
         // Now send "whenMoreResolved" to the promise p.
         // "this" will be the NEAR reactor for the promise.
@@ -105,9 +104,6 @@
      *
      */
     public void reactToAddOneResolved(Object resolution) {
-        PrintStreamWriter.out().println
-            ("WhenAddOneResolved... Ref.state(resolution) = " + 
-             Ref.state(resolution)); 
         PrintStreamWriter.out().println
             ("WhenAddOneresolved... result is " + resolution);
     }