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




另外那个模式我看不懂 也调试了 就是进不去那个函数

画个图

3 Traffic Server中transform的理解