3 Traffic Server中transform的理解
在主协程的回调中一般是TS_EVENT_HTTP_READ_RESPONSE_HDR 钩子
先判断http响应值 若是200 :
就TSTransformCreate(xxx_transform, ...) 即创建transform状态机 钩子是TS_HTTP_RESPONSE_TRANSFORM_HOOK (返回出一个虚拟链接TSVConn状态机
--现在称为上层状态机)
函数结束后 就一直轮序xxx_transform()回调函数 即上层状态机 轮序三个事件/状态:
TS_EVENT_ERROR TS_EVENT_VCONN_WRITE_COMPLETE TS_EVENT_VCONN_WRITE_READY(default)
举个栗子 null_transform.c中:
TS_EVENT_VCONN_WRITE_READY情况下调用 handle_transform(para:上层状态机)
根据上层状态机 获取downstream状态机的output_conn
同理 获取upstream的输入io: input_vio-------就是从这个vio中读取源站发过来的数据
设置上层状态机私有data(私有数据只与output有关 包括output_buffer/reader/vio(vio是buffer和reader的抽象)):
创建buffer和reader: output_buffer output_reader
初始化downstream状态机 要从外部读入多少字节 这样downstream状态机才能向上层状态机发出以上三种状态
++++++++++++++++++
场景建立:
upstream状态机 只有input_vio input_vio只记录当前消费多少字节 和 累计消费(完成发送)多少字节
downstream状态机 有vio vconn
++++++++++++++++++
检测upstream是否能拿到数据
取upstream input_vio中的数据个数 根据实际buffer决定是否truncated 假设这个数据为n
接下来就简单了 三部曲:
a 从input_vio拷贝 n字节数据到output_vio
b 从input_vio消费了 n字节数据
c 设置input_vio累计完成了 多少字节数据的拷贝
再次取upstream input_vio中的数据个数 来决定三种状态
若数据个数为0 则设置output_vio 累计消费字节数 重新使能output_vio 设置TS_EVENT_VCONN_WRITE_COMPLETE
若还有数据 则重新使能output_vio 设置TS_EVENT_VCONN_WRITE_READY
另外那个模式我看不懂 也调试了 就是进不去那个函数
画个图