0

たとえば、Floodlight openflow スタックはその IO に Netty を使用し、次のパイプライン ファクトリ クラスを定義します。

public class OpenflowPipelineFactory implements ChannelPipelineFactory {

    protected Controller controller;
    protected ThreadPoolExecutor pipelineExecutor;
    protected Timer timer;
    protected IdleStateHandler idleHandler;
    protected ReadTimeoutHandler readTimeoutHandler;

    public OpenflowPipelineFactory(Controller controller,
                                   ThreadPoolExecutor pipelineExecutor) {
        super();
        this.controller = controller;
        this.pipelineExecutor = pipelineExecutor;
        this.timer = new HashedWheelTimer();
        this.idleHandler = new IdleStateHandler(timer, 20, 25, 0);
        this.readTimeoutHandler = new ReadTimeoutHandler(timer, 30);
    }

    @Override
    public ChannelPipeline getPipeline() throws Exception {
        OFChannelState state = new OFChannelState();

        ChannelPipeline pipeline = Channels.pipeline();
        pipeline.addLast("ofmessagedecoder", new OFMessageDecoder());
        pipeline.addLast("ofmessageencoder", new OFMessageEncoder());
        pipeline.addLast("idle", idleHandler);
        pipeline.addLast("timeout", readTimeoutHandler);
        pipeline.addLast("handshaketimeout",
                         new HandshakeTimeoutHandler(state, timer, 15));
        if (pipelineExecutor != null)
            pipeline.addLast("pipelineExecutor",
                             new ExecutionHandler(pipelineExecutor));
        pipeline.addLast("handler", controller.getChannelHandler(state));
        return pipeline;
    }

}

しかし実際には、Floodlight はコンストラクターの 2 番目の引数に null を与えるため、実行ハンドラーとエグゼキューター オブジェクトがパイプラインに割り当てられることはありません。

...
final ServerBootstrap bootstrap = createServerBootStrap();

bootstrap.setOption("reuseAddr", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.sendBufferSize", Controller.SEND_BUFFER_SIZE);

ChannelPipelineFactory pfact = new OpenflowPipelineFactory(this, null);
bootstrap.setPipelineFactory(pfact);
InetSocketAddress sa = new InetSocketAddress(openFlowPort);
final ChannelGroup cg = new DefaultChannelGroup();
cg.add(bootstrap.bind(sa));
...

私の質問は、「パイプライン エグゼキューターがパイプラインに設定されていない場合はどうなるか」ということです。デフォルトのパイプラインエグゼキュータは想定されていますか? もしそうなら、OrderedMemoryAwareThreadPoolExecutor エグゼキューターは常に仮定されますか?

よろしくお願いいたします。Netty と Floodlight のスペシャリストからのサポートをお待ちしております。

4

1 に答える 1

0

ChannelPipeline に ExecutionHandler がない場合、すべてのイベントは IO スレッドによって処理されます。ExecutionHandler が追加された場合、イベントは、ExecutionHandler の後のハンドラー用の追加の Thread-Pool にオフロードされます。これにより、ブロック操作が可能になります。

于 2013-03-29T06:33:37.143 に答える