def send_segment(self, file_, seg_id, start, n_bytes, seg_given=False): if seg_given: # entire segment (and thus its name) was given seg_name = '{}'.format(file_.split('/', 1)[-1]) # strip "cache/" prefix else: # file is being dispersed, so we must create segment name seg_name = '{}_{}'.format(file_.split('/')[-1:][0], seg_id) # Find the chord node in which to store the given segment, # and send a request to that node. ip, port = self.find_successor(hash_(seg_name)).split(':') s = self.send(Address(ip, port), 'store {} {}'.format(seg_name, n_bytes)) if s.recv(512).decode('utf-8') == 'OK': f = open(file_, 'rb+') print("sending file...") s.sendfile(f, int(start), int(n_bytes)) print("waiting for ack...") data = s.recv(1024).decode('utf-8') print('ack received') s.close() f.close() return 'segment {}: {} bytes sent, {} recieved'.format( seg_id, n_bytes, data) else: s.close() return 'Error sending segment {} to {}:{}'.format(seg_id, ip, port)
def pull(self, file_): f = open(file_, 'r') file_meta = [] for line in f: file_meta.append(line) f.close() name = file_meta[0].replace('\n', '') size = int(file_meta[1].replace('\n', '')) n_segments = int(file_meta[2].replace('\n', '')) checksum_ = file_meta[3].replace('\n', '') data = ''.encode() # chunk = ''.encode() threads = [] data_array = [None] * n_segments for i in range(0, n_segments): seg_name = name + '_' + str(i) ip, port = self.find_successor(hash_(seg_name)).split(':') s = self.send(Address(ip, port), 'return_segment {}'.format(seg_name)) seg_size = int(s.recv(1024).decode('utf-8')) print('seg_size:', seg_size) s.sendall('READY'.encode()) # chunk = s.recv(seg_size) t = Thread(target=get_segment, args=(s, data_array, seg_name, seg_size, i)) t.start() threads.append(t) # while True: # chunk += s.recv(seg_size) # if len(chunk) >= seg_size: # break # data += chunk # print('{}: {}/{} bytes recieved'.format(seg_name, len(chunk), seg_size)) # chunk = b'' # # chunk = len(data) # s.close() for th in threads: th.join() for b in data_array: data += b f = open(name, 'wb+') f.write(data) f.close() if checksum_ == checksum(name): return 'File pulled successfully' else: os.remove(name) return 'Failed to pull file/Corrupted file'
def send_segment(self, file_, seg_id, start, n_bytes): seg_name = '{}_{}'.format(file_.split('/')[-1:][0], seg_id) ip, port = self.find_successor(hash_(seg_name)).split(':') s = self.send(Address(ip, port), 'store {} {}'.format(seg_name, n_bytes)) if s.recv(512).decode('utf-8') == 'OK': f = open(file_, 'rb+') print("sending file...") s.sendfile(f, int(start), int(n_bytes)) print("waiting for ack...") data = s.recv(1024).decode('utf-8') print('ack received') s.close() f.close() return 'segment {}: {} bytes sent, {} recieved'.format(seg_id, n_bytes, data) else: s.close() return 'Error sending segment {} to {}:{}'.format(seg_id, ip, port)
def get_hash(self, str_=None): if str_ != None: return str(hash_(str)) return str(self.state.id)