package edu.washington.escience.myria.parallel; import java.util.concurrent.ExecutorService; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder; import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender; import org.jboss.netty.handler.execution.ExecutionHandler; import edu.washington.escience.myria.parallel.ipc.IPCConnectionPool; import edu.washington.escience.myria.parallel.ipc.IPCMessageHandler; /** * Factories of pipelines. * */ public final class IPCPipelineFactories { /** * In JVM pipeline factory for the master. * */ public static class MasterInJVMPipelineFactory implements ChannelPipelineFactory { /** * IPC session management. * */ private final IPCMessageHandler ipcMessageHandler; /** * @param pool the ipc connection pool. * */ public MasterInJVMPipelineFactory(final IPCConnectionPool pool) { ipcMessageHandler = new IPCMessageHandler(pool); } @Override public final ChannelPipeline getPipeline() throws Exception { final ChannelPipeline p = Channels.pipeline(); p.addLast("ipcMessageHandler", ipcMessageHandler); // upstream 5 return p; } } /** * In JVM pipeline factory for workers. * */ public static final class WorkerInJVMPipelineFactory extends MasterInJVMPipelineFactory { /** * @param pool the ipc connection pool. * */ public WorkerInJVMPipelineFactory(final IPCConnectionPool pool) { super(pool); } } /** * Client side pipeline factory for the master. * */ public static class MasterClientPipelineFactory implements ChannelPipelineFactory { /** * IPC session management. * */ private final IPCMessageHandler ipcMessageHandler; /** * pipe line executor. A dedicated executor service who executes the handlers in a the pipeline. * */ private final ExecutionHandler pipelineExecutionHandler; /** * @param pool the owner IPCConnectionPool * @param pipelineExecutor possible pipeline executor, null is allowed. * */ MasterClientPipelineFactory( final IPCConnectionPool pool, final ExecutorService pipelineExecutor) { ipcMessageHandler = new IPCMessageHandler(pool); if (pipelineExecutor != null) { pipelineExecutionHandler = new ExecutionHandler(pipelineExecutor); } else { pipelineExecutionHandler = null; } } @Override public final ChannelPipeline getPipeline() throws Exception { final ChannelPipeline p = Channels.pipeline(); p.addLast("frameDecoder", new ProtobufVarint32FrameDecoder()); // upstream 2 p.addLast("frameEncoder", FRAME_ENCODER); // downstream 2 if (pipelineExecutionHandler != null) { p.addLast("executor", pipelineExecutionHandler); } p.addLast("ipcMessageHandler", ipcMessageHandler); // upstream 5 return p; } } /** * Server side pipeline factory for the master. * */ public static final class MasterServerPipelineFactory extends MasterClientPipelineFactory { /** * @param pool the owner IPCConnectionPool * @param pipelineExecutor possible pipeline executor, null is allowed. * */ MasterServerPipelineFactory( final IPCConnectionPool pool, final ExecutorService pipelineExecutor) { super(pool, pipelineExecutor); } } /** * Server side pipeline factory for the master. * */ public static final class WorkerClientPipelineFactory extends MasterClientPipelineFactory { /** * @param pool the owner IPCConnectionPool * @param pipelineExecutor possible pipeline executor, null is allowed. * */ WorkerClientPipelineFactory( final IPCConnectionPool pool, final ExecutorService pipelineExecutor) { super(pool, pipelineExecutor); } } /** * Client side pipeline factory for workers. * */ public static final class WorkerServerPipelineFactory extends MasterClientPipelineFactory { /** * @param pool the owner IPCConnectionPool * @param pipelineExecutor possible pipeline executor, null is allowed. * */ WorkerServerPipelineFactory( final IPCConnectionPool pool, final ExecutorService pipelineExecutor) { super(pool, pipelineExecutor); } } /** * separate data streams to data frames. * */ static final ProtobufVarint32LengthFieldPrepender FRAME_ENCODER = new ProtobufVarint32LengthFieldPrepender(); /** * Utility class. * */ private IPCPipelineFactories() {} }