首页
登录 | 注册

traffic server合并回源分析

合并回源流程如下: 

1.对于同一个URL请求,如果当前已经有请求A回源了,那么后续请求B首先读取已回源请求A的内容

2.当请求A由于种种问题(例如网络不好)没有在500ms内拉回响应,那么请求B判断本地是否有对应副本(肯定是已过期的副本,否则A就不会回源>了)

3.请求B通过索引判断本地是否有副本:如果副本有对应的索引,则试图读取本地内容(先是mem,再disk);如果本地没有副本对应的索引,则直>接走proxy_only(回源但不缓存副本)流程

4.如果在读取本地副本的所有流程中出现任何error(包括,mem不可用,disk不可用等等,内容头magic有问题等等),直接走proxy_only流程

5.如果读取本地副本没有任何问题,那么在响应uaheader中,加上一个113status codeWarning),表示读取本地过期缓存

Patch主要程序分析:

1. int ret = openReadChooseWriter(event, e);

如果ret == EVENT_CONT,表示现在已经有writer,但是没有合法的副本;

 

修改前:

修改后:



解析:

解析1.

首先解释两个函数,VC_SCHED_WRITER_RETRY()是修改前用的函数;VC_SCHED_WRITER_COUNT_RETRY()是修改后使用的函数;并且WRITER_RETRY_DELAY:50ms

 

VC_SCHED_WRITER_RETRY:意思是每try一次,都会在_t时间后状态机返回EVENT_CONT;在ret == EVENT_CONT后调用VC_SCHED_WRITER_RETRY函数,表示已经有writes了,会一直等待合法的副本;

 

#define VC_SCHED_WRITER_RETRY() \

  do { \

    ink_assert(!trigger); \

    writer_lock_retry++; \

    ink_hrtime _t = WRITER_RETRY_DELAY; \ 

    if (writer_lock_retry > 2) \  

      _t = WRITER_RETRY_DELAY * 2; \

    else if (writer_lock_retry > 5) \

      _t = WRITER_RETRY_DELAY * 10; \

    else if (writer_lock_retry > 10) \

      _t = WRITER_RETRY_DELAY * 100; \

    trigger = mutex->thread_holding->schedule_in_local(this, _t); \

    return EVENT_CONT; \

  } while (0)

 

VC_SCHED_WRITER_COUNT_RETRY:只要尝试次数小于8,则每次_t都会延长一倍,并且会在_t时间后状态机返回EVENT_CONT;并且尝试次数大于等于8,则不尝试了;

+#define VC_SCHED_WRITER_COUNT_RETRY() \

+  do { \

+    ink_assert(!trigger); \

+    writer_lock_retry++; \

+    ink_hrtime _t = WRITER_RETRY_DELAY; \

+    if (writer_lock_retry > 2) \

+      _t = WRITER_RETRY_DELAY * 2; \

+    if (writer_lock_retry < 8) { \

+      trigger = mutex->thread_holding->schedule_in_local(this, _t); \

+      return EVENT_CONT; \

+    } else { \

+         \

+    } \

+  } while (0)

+

 

解析2

当超过尝试次数以后,就会设置is_retry_count_exceeded = true;如果slow_os_use_staletrue,则通知状态机回调CacheVC::openReadStartHead



解析3:

进入CacheVC::openReadStartHead函数,由于f.read_from_writer_called=0(上次已经调用了openReadFromWriter,在openReadFromWriter中已经设置f.read_from_writer_called = 1),所以查找索引,如果查到,则返回。不过这个索引查找到的数据可能是旧的数据


2.由于返回的是旧的数据,所以http打了一个warnning的头部;User-Agent:jddebug会打出相应的debug信息



相关文章

  • 来源:http://csrd.aliapp.com/?p=842 Traffic Server设计的思想是将一个大系统划分为若干个小的子系统,每个子系统负责专门的任务或应用.比如,Event子系统负责提供任务调度服务,Net子系统负责提供网 ...
  • ptmalloc中的fastbin chunk的合并过程
    ptmalloc中的fastbin chunk的合并过程     最近在设计一个memcache协议队列的内存管理模块,其实malloc和free并不是想象中的那种,malloc完空间free就会马上把内存返回给操作系统,所以了解一下gli ...
  • 1. 背景:     一直以为OpenStack的创建快照的操作是在线创建快照(live snapshot), 并且应该是增量的快照,即利用virsh或者qemu的live snapshot来实现的:          virsh  sna ...
  • GNU C 增加一个 __atttribute__ 关键字用来声明一个函数.变量或类型的特殊属性.声明这个特殊属性有什么用呢?主要用途就是指导编译器在编译程序时进行特定方面的优化或代码检查.比如,我们可以通过使用属性声明指定某个变量的数据边 ...
  • [高级内部资料].NET数据批量写入性能分析 第二篇                在上一篇文章中,我们已经讲述了一些铺垫性的知识,那么从本篇开始,就开始正式的研究批量插入性能问题.          首先来看看,我们主要测试那些东西.因为 ...
  •      初学数据库编程我们可能会有一些对"空值"的疑问,比如通过编程新建的一个表中所有数据皆显示为,手动添加并删除文字后又变成了空白:一个字符串类型的字段,明明没有填值,却不等于"":用ADO.NE ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.013 s.
苏ICP备12049786号-20