第一步 命令解析 process_mset_command
- 解析命令参数,参数验证,预处理,命令类型
- 最主要的:分配item存储空间,事实上是do_slabs_alloc,每次分配都是一旦空间不足就1mb的slab page一次性分配一页
- 设置连接状态为conn_nread
- 准备接收数据
第二步 处理链接 实际写入
最关键代码:
memcached.c
drive_machine(...){
...
case conn_nread:
if (c->rlbytes == 0) { //检查点,如果c->rlbytes(剩余需要读取的字节数(remaining read length bytes))已经变为0,表示所有预期的数据已经完全读取完毕
complete_nread(c);
break;
}
/* Check if rbytes < 0, to prevent crash */
if (c->rlbytes < 0) {
if (settings.verbose) {
fprintf(stderr, "Invalid rlbytes to read: len %d\n", c->rlbytes);
}
conn_set_state(c, conn_closing);
break;
}
if (c->item_malloced || ((((item *)c->item)->it_flags & ITEM_CHUNKED) == 0) ) { //ITEM_CHUNKED意味着是多块存储的大item,特殊情况标志,等存储后会将数据分散在多个链接的chunk中
//如果c->item_malloced为true,表示当前正在处理一个特殊的单独分配的item,而不是从标准slab池中获取;
//或者,如果c->item的it_flags字段的ITEM_CHUNKED位为0,表示当前处理的是一个不是分块存储的item. 也就是一般的通常的情况
/* first check if we have leftovers in the conn_read buffer */
if (c->rbytes > 0) {
int tocopy = c->rbytes > c->rlbytes ? c->rlbytes : c-