def Lock(self, request, context): # 为文件加锁 lock_time = self._lock_file(request.text, self.DEFAULT_LOCK_TIME) if lock_time: reply = self.LOCK_RESPONSE % (request.text, lock_time) return service_pb2.SimpleReply(text=reply, flag=True) else: reply = self.FAIL_RESPONSE % (0, str(self.DEFAULT_LOCK_TIME)) return service_pb2.SimpleReply(text=reply, flag=False)
def GetFileServer(self, request, context): # 根据文件名找到相应的服务器,如果不存在,则返回随机一个 # 解析路径 path, file = os.path.split(request.text) name, ext = os.path.splitext(file) filename = hashlib.sha256( request.text.encode('utf-8')).hexdigest() + ext host, port = self._find_host(path) if not host: # 不存在则创建 server_id = self._pick_random_host() self._create_dir(path, server_id) host, port = self._find_host(path) flag = False else: flag = True # 获取有备份的其余文件服务器 slave_string = self._get_slave_string(host, port) reply = self.GET_RESPONSE % (host, port, filename, slave_string) return service_pb2.SimpleReply(flag=flag, text=reply)
def Delete(self, request, context): # 删除服务器上的文件 path = os.path.join(self.BUCKET_LOCATION, request.text) os.system('rm %s' % path) return service_pb2.SimpleReply(flag=True, text=self.DELETE_DONE)
def Update(self, request, context): # 更新服务器上的某个文件 self._write_file(request.text, request.data) return service_pb2.SimpleReply(flag=True, text=self.UPDATE_DONE)
def Upload(self, request, context): # 客户端上传文件到当前文件服务器,并同步更新其他节点 self._write_file(request.text, request.data) self._update_slaves(request) return service_pb2.SimpleReply(flag=True, text=self.UPLOAD_DONE)
def Unlock(self, request, context): # 给文件解锁 lock_time = self._unlock_file(request.text) reply = self.LOCK_RESPONSE % (request.text, lock_time) return service_pb2.SimpleReply(text=reply, flag=True)
def GetSlaves(self, request, context): # 获取其他文件服务器节点 host, port = request.text.split(':') reply = self._get_slave_string(host, port) return service_pb2.SimpleReply(flag=True, text=reply)