package water;
import water.H2O.H2OCountedCompleter;
import water.UDP.udp;
/**
* A class to handle the work of a received UDP packet. Typically we'll do a
* small amount of work based on the packet contents (such as returning a Value
* requested by another Node, or recording a heartbeat).
*
* @author <a href="mailto:cliffc@h2o.ai"></a>
* @version 1.0
*/
class FJPacket extends H2OCountedCompleter {
final AutoBuffer _ab;
final int _ctrl; // 1st byte of packet
FJPacket( AutoBuffer ab, int ctrl ) {
// Run at max priority until we decrypt the packet enough to get priorities out
super(UDP.udp.UDPS[ctrl]._prior);
_ab = ab; _ctrl = ctrl;
assert 0 < _ctrl && _ctrl < udp.UDPS.length;
assert udp.UDPS[_ctrl]._udp != null:"missing udp " + _ctrl;
}
@Override
public void compute2() {
_ab.getPort(); // skip past the port
if( _ctrl <= UDP.udp.nack.ordinal() ) {
AutoBuffer ab = UDP.udp.UDPS[_ctrl]._udp.call(_ab);
if(ab != null && !ab.isClosed()) ab.close();
} else
RPC.remote_exec(_ab);
tryComplete();
}
/** Exceptional completion path; mostly does printing if the exception was
* not handled earlier in the stack. */
@Override public boolean onExceptionalCompletion(Throwable ex, jsr166y.CountedCompleter caller) {
System.err.println("onExCompletion for "+this);
ex.printStackTrace();
water.util.Log.err(ex);
return true;
}
}