Example #1
0
    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)
Example #2
0
 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)