예제 #1
0
 def check_bigger_replication_degree(self, message, addr):
     data = Data(self.db_path)
     file_id = message.split(" ")[2]
     chunk_number = message.split(" ")[3]
     replication_degree = data.get_chunk_replication_degree(file_id, chunk_number)
     minimum_replication_degree = data.get_chunk_minimum_replication_degree(file_id, chunk_number)
     if (data.chunk_owner(file_id) and replication_degree >= minimum_replication_degree and not data.chunk_have_replication_host(file_id, chunk_number, addr[0])):
         print_message("Sending a chunk delete  to "+str(addr[0])+" because the replication degree was already enough")
         message="deletechunk " + file_id + " "+ chunk_number
         self.shell.sendto(message, (addr[0], SHELL_PORT))
         return True
     return False
예제 #2
0
 def handle_request(self, message,addr):
     operation=message.split(" ")[0].strip(' \t\n\r')
     message=message.strip(' \t\n\r')
     if (operation == "PUTCHUNK"):
         data = Data(self.db_path)
         file_id=message.split(" ")[2]
         chunk_number=message.split(" ")[3]
         now=datetime.now()
         try:
             body = message.split(CRLF+CRLF)[1]
         except:
             print_message("Invalid message from "+str(addr))
         if(len(body)<2): 
             print_message("The PUTCHUNK split failed")
             return False
         can_store=True
         if(data.chunk_owner(file_id)):
             can_store=False
         if((file_id+chunk_number) in self.reject_putchunks and now<self.reject_putchunks[file_id+chunk_number]):
             can_store=False
         if ((self.backup_size - self.check_directory_size(self.backup_dir)) <= len(body)):
             can_store=False 
         if(can_store):
             self.backup_chunk(message)
         else: 
             print_message("PUTCHUNK rejected")
             
     elif(operation == "GETCHUNK"):
         self.create_restore_subscription(message)
         self.get_and_send_chunk(message)
     elif(operation == "CHUNK"):
         print message.split(CRLF+CRLF)[0]
         self.save_chunk_to_restore(message)
     elif(operation=="DELETE"):
         self.can_send_removed=False
         self.delete_chunks(message)
         time.sleep(1)
         self.can_send_removed=True
     elif(operation=="DELETE2"):
         self.can_send_removed=False
         self.delete_chunks(message)
         file_id=message.split(" ")[1].strip(CRLF+CRLF)
         self.mc.sendto("deleted "+str(file_id),(addr[0],SHELL_PORT))
         time.sleep(1)
         self.can_send_removed=True   
     elif(operation=="STORED"):
         if (not self.check_bigger_replication_degree(message, addr)):
             self.increment_chunk_replication_degree(message,addr)
     elif(operation=="REMOVED"):
         self.update_chunk_replication_degree(message,addr)