Lab 2: Key/Value Server

news/2024/11/16 14:26:05/文章来源:https://www.cnblogs.com/INnoVationv2/p/18383162

6.5840 Lab 2: Key/Value Server

1.Introduction

本次Lab将构建一个单机的键值服务器,该服务器保证即使存在网络故障,每个操作也都只执行一次,并且这些操作线性化执行。后续Lab中,将复制这样的服务器来处理服务器崩溃的情况。

键值服务器支持三种RPC(远程过程调用)操作:Put(key, value)Append(key, arg)Get(key)。服务器在内存中维护一个Map。键和值都是字符串。

  • Put(key, value) 在Map中添加或替换特定键的值,并返回新的值
  • Append(key, arg)arg追加到Key对应的Value后面,并返回旧值
  • Get(key) 获取值。如果key不存在,返回空字符串

对不存在的Key进行Append操作应当视原值为一个空字符串。客户端通过Clerk与服务器交互,Clerk提供Put/Append/Get方法,并管理与服务器的RPC交互。

你的服务器必须确保对ClerkGet/Put/Append方法的调用是线性化的。如果客户端请求没有并发,每个客户端的Get/Put/Append调用应观察到之前一系列调用对状态的修改。对于并发调用,返回值和最终状态必须与这些操作按某种顺序一次执行时的结果相同。如果调用在时间上重叠,例如客户端 X 调用了Clerk.Put(),同时客户端 Y 调用了Clerk.Append(),然后客户端 X 的调用返回。一个调用必须观察到在该调用开始前已经完成的所有调用的效果。

Getting Started

src/kvsrv中提供了基础代码和测试。你可以修改kvsrv/client.gokvsrv/server.gokvsrv/common.go

可通过以下命令启动Server,别忘了经常执行git pull更新代码

$ cd ~/6.5840
$ git pull
...
$ cd src/kvsrv
$ go test
...
$

没有网络故障的KV服务器(easy)

第一个任务是完成一个在没有网络故障、不会丢失消息情景下的KV服务器。

client.go中的Clerk Put/Append/Get方法中添加RPC发送代码,并在server.go中实现``PutAppend()Get()`RPC处理程序。

当通过前两个测试one clientmany clients时,此任务就算完成了。

提示:使用go test -race检查你的代码是否无竞态问题。

会丢失消息的Key/value服务器(easy)

修改代码,以便在消息丢失的情况下正常执行。如果消息丢失,则客户端的ck.server.Call()将返回false(更准确地说,Call()等待一段时间,如果在这段时间内没有回复,则返回false)。您将面临的一个问题是,Clerk可能需要多次发送RPC才能成功。但是,每次调用Clerk.Put()Clerk.Append()都应该只执行一次,因此您必须确保重新发送不会导致服务器执行两次请求。

如果未收到回复,请向Clerk添加代码以重试,如果操作需要,请向server.go添加代码以过滤重复项。这些说明包括有关重复检测的指导。

提示

  • 您需要唯一地标识客户端操作以确保键/值服务器只执行一次。
  • 您必须仔细考虑服务器必须维持什么状态来处理重复的Get()Put()Append()请求(如果有)。
  • 您的重复检测方案应快速释放服务器内存,例如通过让每个RPC暗示客户端已看到其上一个RPC的回复。可以假设客户端每次只会调用Clerk一次。

你的代码现在应该通过所有测试,如下所示:

$ go test
Test: one client ...... Passed -- t  3.8 nrpc 31135 ops 31135
Test: many clients ...... Passed -- t  4.7 nrpc 102853 ops 102853
Test: unreliable net, many clients ...... Passed -- t  4.1 nrpc   580 ops  496
Test: concurrent append to same key, unreliable ...... Passed -- t  0.6 nrpc    61 ops   52
Test: memory use get ...... Passed -- t  0.4 nrpc     4 ops    0
Test: memory use put ...... Passed -- t  0.2 nrpc     2 ops    0
Test: memory use append ...... Passed -- t  0.4 nrpc     2 ops    0
Test: memory use many puts ...... Passed -- t 11.5 nrpc 100000 ops    0
Test: memory use many gets ...... Passed -- t 12.2 nrpc 100001 ops    0
PASS
ok      6.5840/kvsrv    39.000s

每个Passed 后的数字是实际时间(以秒为单位)、发送的 RPC 数量(包括客户端 RPC)以及执行的键/值操作数量(Clerk Get/Put/Append 调用)。

思路

Lab 2.1

很简单,需要注意,使用Clerk/server进行RPC调用,不用复制Lab1中的远程调用实现

type Clerk struct {server *labrpc.ClientEnd
}

Lab 2.2

  1. 为消息添加ClientID和ID以便Server判断消息是否重复
  2. 对于Put和Append方法,每次更新前,保存旧值,以便之后响应重复请求
  3. 添加新的RPC方法:Report,当Client接收到结果后,使用Report报告Server该记录已经处理完成,Server此时就可清除用于响应重复请求保存的旧值。

结果

代码:

https://github.com/INnoVationv2/6.5840/commit/66b34ae954ee875c5a7bad035ae8b9c33cbb55ef

测试:

image-20240827171655249

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/788068.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

esp-idf vscode debug command espIdf.getXtensaGdb not found

esp32 idf vscode debug错误 vscode中配置文件采用的是正点原子的,调用gdb的时候,提示报错,找不到相应的命令 launch.json文件中gdb的配置如下 {"version": "0.2.0","configurations": [ { "name": "GDB", "type&qu…

Debian12、Ubuntu22安装英特尔wifi驱动

1、打开英特尔无线适配器的 Linux* 支持查看wifi所需的内核版本 以AX200为例,需要Linux内核版本为5.1,Debian12默认内核版本为6.1,Ubuntu24默认内核版本为6..8,因此不需要更新内核。2、打开适用于 Linux* 的英特尔 无线 Wi-Fi 驱动程序下载内核(非必要步骤)和驱动。3、安…

牛客周赛 Round 57

B 可以直接统计每条边两个点的情况即可,不用DFS。 F 写法和这个差不多。可以用map、set、统计这些方法,计算动态的一个数组的最大数。 可以直接用map统计就行,map已经自动给你排好序了(从小到大)。1 #include <bits/stdc++.h>2 using namespace std;3 #define LL lo…

RMQ

RMQ - OI Wiki (oi-wiki.org) 这么说构建和查询,时间复杂度最小的是线段树。最好写的是ST表,emmm,其实线段树也很好写,就是代码量相对多一点。

labelme标注后的数据根据面积过滤,把小面积的多边形改成另一种标签

修改前代码:点击查看代码 import cv2 import numpy as np import json def remove_specific_labels(json_file):# 读取JSON文件with open(json_file, r) as f:data = json.load(f)data_small=dataif"shapes" in data:new_shapes=[]new_shapes_small=[]# 提取闭合区域…

压缩流使用

压缩流场景:需要将一些数据,以及这些数据关联的附件压缩下载,数据导出为一个Excel,附件导出到一个文件夹中 这里使用easyexcel 导出excel 从华为云 obs 下载附件 并交给浏览器public void downloadAllEliminate(HttpServletResponse response) throws IOException {// 响应…

快来领取迅雷加速器7天会员,让你的《黑神话悟空》更新速度嗖嗖嗖!⚡️

嘿,各位《黑神话悟空》的小伙伴们!😆 最近大家肯定都在Steam上体验这款国产3A大作吧?游戏的画质、玩法是不是让你眼前一亮?😍 但是!😫 大家有没有发现,游戏加载和更新时总是龟速,让人望穿秋水?原来是Steam的下载速度太慢啦!🐌 别急别急,今天就给大家安利一个…

Nginx 记录POST记录并设置日志只允许追加

之前想融入到默认配置中。但是还是有一些会出现疑问。只能以文章的形式来配置 之前想过异步的存储日志的方式。但是udp 的方式也是挺消耗性能的无果 一、Nginx 的默认日志文件如下:#设定日志格式,main是默认的格式 log_format main $remote_addr - $remote_user [$time_loca…

pygame手搓贪吃蛇

代码:#coding=utf-8import os,sys,re,time import pygame import random from win32api import GetSystemMetrics import copypygame.init() pygame.display.set_caption("贪吃蛇")percent = 0.6 screen_width = GetSystemMetrics(0) screen_height = GetSystemMetr…

AI创新,DataOps聚能 | 白鲸开源DTCC共话DataOps新篇章

近日,由IT168联合旗下ITPUB、ChinaUnix两大技术社区主办的第15届中国数据库技术大会(DTCC 2024)隆重召开。大会以“自研创新 数智未来”为主题,吸引了数百位行业专家和广大数据领域从业者共聚这场年度数据库技术交流盛宴,共同探讨新时代下数据库的技术动态和应用实践。作为…

Android taskset用法详解

一、简介taskset 命令用于设置或者获取一直指定的 PID 对于 CPU 核的运行依赖关系。通过 taskset 命令可将某个进程与某个CPU核心绑定,使得其仅在与之绑定的CPU核心上运行 关于绑核的解释绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity)。设定以后,Linux调度…

Builder 模式在 Go 语言中的应用

Builder 模式在 Go 语言中的应用 江湖十年 Go编程世界2024年08月27日 07:21 浙江Builder 模式是一种创建型模式,即用来创建对象。 Builder 模式,中文翻译不太统一,有时候被翻译为建造者模式或构建者模式,有时候也被翻译为生成器模式。为了不给读者造成困扰,我还是直接叫它…