Beanstalkd源码分析—touch命令的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zg_hover/article/details/82181615

概述

本文讲述beanstalkd touch命令的实现原理。

touch命令说明

该命令允许消费者(worker)请求更多的时间执行job,当需要预留更多的时间来执行该jog是,该命令很有用。消费者(worker)可用周期的告诉服务器它仍然在执行job。

  • touch命令的格式如下:
touch <id>\r\n
  • 参数说明
    • id:为job id
    • 响应
      • TOUCHED\r\n 表明成功
      • NOT_FOUND\r\n 如果job不存在或者client没有预订此job

touch命令实现原理说明

touch命令的实现步骤如下:

  • 获取参数:job id
  • 从全局job哈希表中查找该job,若该job所在的连接是当前连接,且job的状态是Reserved,则重置该job的过期时间

这样,可以让该job处于ready状态的时间更长,让该job拥有更长的执行时间。

源码分析

touch功能是在下面的函数中实现的:

j = touch_job(c, job_find(id));

job_find()函数的功能是:从全局变量all_jobs哈希表中查找对应id的job。

  • touch_job函数
//若job的订阅者(reserver)是当前连接,且job的状态是Reserved,返回该Job
static job
find_reserved_job_in_conn(Conn *c, job j) 
{
    return (j && j->reserver == c && j->r.state == Reserved) ? j : NULL;
}


// 重新设置该job的过期时间(j->r.deadline_at字段)值为:j->ttr+now()
static job
touch_job(Conn *c, job j)
{
    j = find_reserved_job_in_conn(c, j);
    if (j) {
        j->r.deadline_at = nanoseconds() + j->r.ttr;
        c->soonest_job = NULL;
    }
    return j;
}

参考资料

猜你喜欢

转载自blog.csdn.net/zg_hover/article/details/82181615