def start_network():
ip_table = [self]
data
ROOT_NODE, ROOT_IP, ROOT_PORT
ip_table=[]
data_table=[]
def join()
join_request(ROOT_IP, ROOT_PORT, IP, PORT, id)
handle_join_request(发送ACK; 更改node_table, data_table)
{NodeTable:add_node(data_table, id, ip, port)
DataTable:add_node(id)}
node_table <- request_node_table(ROOT_IP, ROOT_PORT, IP, PORT)
handle_request_node_table(发送table)
for node in node_table:
join_request(node.ip, node.port, IP, PORT)
handle_join_request(发送ACK; 更改node_table, data_table)
[data_id, node] <- Datatable:search_personal_data_from_table(id, data_table)
for data_id, node in [data_id, node]:
request_data(node.ip, node.port, IP, PORT, data_id)
handle_request_data(发送数据)
ip_table
data_table
def quit()
for node in node_table:
quit_request(node.ip, node.port, IP, PORT)
handle_quit_request(在获得所有需要的数据后,返回ACK; 确认哪些是需要自己存储的数据, 更改node_table, data_table)
NodeTable:quit_node(data_table, id, ip, port)
DataTable:quit_node(id)
[data_id, node] <- Datatable:quit_data_transmission(id, data_table)
for data_id, node in [data_id, node]:
request_data(node.ip, node.port, IP, PORT, data_id)
return ACK
shut_down
ip_table
data_table
def store():
node_table <- add_data(ip_table, data_table, data, id)
for node in node_table:
send_data(node.ip, node.port, IP, PORT, data)
# 在存储数据后返回ACK, add_data内部判断是否存储
handle_send_data(sender.ip, sender.port, data)
node_table <- add_data(ip_table, data_table, data, id)
return ACK
---------- history: when dealing with ACK together -----------
def WaitACK([node], port) -> [node]
监听port, wait 3s
if node_1 <- message:
[node] <- [node]/{node_1}
return
ROOT_NODE, ROOT_IP, ROOT_PORT
ip_table=[]
data_table=[]
def join()
join_request(ROOT_IP, ROOT_PORT, IP, PORT, id)
handle_join_request(发送ACK; 更改node_table, data_table)
NodeTable:add_node(data_table, id, ip, port)
DataTable:add_node(id)
node_table <- request_node_table(ROOT_IP, ROOT_PORT, IP, PORT)
handle_request_node_table(发送table)
data_table <- request_data_table(ROOT_IP, ROOT_PORT, IP, PORT)
handle_request_data_table(发送table)
unreceived_ack_list_init = node_table/{self, root_node}
unreceived_ack_list = node_table/{self, root_node} #这是因为在循环遍历的过程中不能改变数组
while unreceived_ack_list_init ≠ []:
for node in unreceived_ack_list:
join_request(node.ip, node.port, IP, PORT)
unreceived_ack_list_init = unreceived_ack_list
handle_join_request(发送ACK; 更改node_table, data_table)
[data_id, node] <- Datatable:search_personal_data_from_table(id, data_table)
unreceived_data_list_init = [data_id, node]
unreceived_data_list = [data_id, node]
while unreceived_ack_list ≠ []:
for data_id, node in unreceived_ack_list:
request_data(node.ip, node.port, IP, PORT, data_id)
handle_request_data(发送数据)
unreceived_data_list_init = unreceived_data_list