mirror of
				https://github.com/0glabs/0g-storage-node.git
				synced 2025-11-04 08:37:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			139 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python3
 | 
						|
 | 
						|
from test_framework.test_framework import TestFramework
 | 
						|
from utility.submission import create_submission, submit_data
 | 
						|
from utility.utils import wait_until
 | 
						|
 | 
						|
 | 
						|
class CrashTest(TestFramework):
 | 
						|
    def setup_params(self):
 | 
						|
        self.num_blockchain_nodes = 1
 | 
						|
        self.num_nodes = 4
 | 
						|
 | 
						|
    def run_test(self):
 | 
						|
        # 1. all nodes are running
 | 
						|
        chunk_data = b"\x01" * 256
 | 
						|
        submissions, data_root = create_submission(chunk_data)
 | 
						|
        self.contract.submit(submissions)
 | 
						|
        wait_until(lambda: self.contract.num_submissions() == 1)
 | 
						|
        wait_until(lambda: self.nodes[0].zgs_get_file_info(data_root) is not None)
 | 
						|
 | 
						|
        segment = submit_data(self.nodes[0], chunk_data)
 | 
						|
        self.log.info("segment: %s", segment)
 | 
						|
        wait_until(
 | 
						|
            lambda: self.nodes[0].zgs_get_file_info(data_root)["finalized"] is True
 | 
						|
        )
 | 
						|
 | 
						|
        for i in range(1, self.num_nodes):
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root) is not None)
 | 
						|
            self.nodes[i].admin_start_sync_file(0)
 | 
						|
            self.log.info("wait for node: %s", i)
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root)["finalized"])
 | 
						|
 | 
						|
        # 2: first node runnging, other nodes killed
 | 
						|
        self.log.info("kill node")
 | 
						|
        # kill node to simulate node crash
 | 
						|
        for i in range(1, self.num_nodes):
 | 
						|
            self.nodes[i].stop(kill=True)
 | 
						|
 | 
						|
        chunk_data = b"\x02" * 256 * 1024
 | 
						|
        submissions, data_root = create_submission(chunk_data)
 | 
						|
        self.contract.submit(submissions)
 | 
						|
        wait_until(lambda: self.contract.num_submissions() == 2)
 | 
						|
        wait_until(lambda: self.nodes[0].zgs_get_file_info(data_root) is not None)
 | 
						|
 | 
						|
        segment = submit_data(self.nodes[0], chunk_data)
 | 
						|
        wait_until(lambda: self.nodes[0].zgs_get_file_info(data_root)["finalized"])
 | 
						|
 | 
						|
        self.start_storage_node(1)
 | 
						|
        self.nodes[1].wait_for_rpc_connection()
 | 
						|
        wait_until(lambda: self.nodes[1].zgs_get_file_info(data_root) is not None)
 | 
						|
        self.nodes[1].admin_start_sync_file(1)
 | 
						|
        wait_until(lambda: self.nodes[1].zgs_get_file_info(data_root)["finalized"])
 | 
						|
 | 
						|
        for i in range(2, self.num_nodes):
 | 
						|
            self.start_storage_node(i)
 | 
						|
            self.nodes[i].wait_for_rpc_connection()
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root) is not None)
 | 
						|
            self.nodes[i].admin_start_sync_file(1)
 | 
						|
 | 
						|
            self.nodes[i].stop(kill=True)
 | 
						|
            self.start_storage_node(i)
 | 
						|
            self.nodes[i].wait_for_rpc_connection()
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root) is not None)
 | 
						|
            self.nodes[i].admin_start_sync_file(1)
 | 
						|
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root)["finalized"])
 | 
						|
 | 
						|
        # 4: node[1..] synced contract entries and killed
 | 
						|
        self.log.info("kill node 0")
 | 
						|
        self.nodes[0].stop(kill=True)
 | 
						|
        self.start_storage_node(0)
 | 
						|
        self.nodes[0].wait_for_rpc_connection()
 | 
						|
 | 
						|
        chunk_data = b"\x03" * 256
 | 
						|
        submissions, data_root = create_submission(chunk_data)
 | 
						|
        self.contract.submit(submissions)
 | 
						|
        wait_until(lambda: self.contract.num_submissions() == 3)
 | 
						|
        wait_until(lambda: self.nodes[0].zgs_get_file_info(data_root) is not None)
 | 
						|
 | 
						|
        for i in range(1, self.num_nodes):
 | 
						|
            self.nodes[i].stop(kill=True)
 | 
						|
 | 
						|
        segment = submit_data(self.nodes[0], chunk_data)
 | 
						|
        self.log.info("segment: %s", segment)
 | 
						|
        wait_until(lambda: self.nodes[0].zgs_get_file_info(data_root)["finalized"])
 | 
						|
 | 
						|
        for i in range(1, self.num_nodes):
 | 
						|
            self.log.info("wait for node: %s", i)
 | 
						|
            self.start_storage_node(i)
 | 
						|
            self.nodes[i].wait_for_rpc_connection()
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root) is not None)
 | 
						|
            self.nodes[i].admin_start_sync_file(2)
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root)["finalized"])
 | 
						|
 | 
						|
        # 5: node[1..] synced contract entries and killed, sync disorder
 | 
						|
        self.nodes[0].stop(kill=True)
 | 
						|
        self.start_storage_node(0)
 | 
						|
        self.nodes[0].wait_for_rpc_connection()
 | 
						|
 | 
						|
        chunk_data = b"\x04" * 256 * 1561
 | 
						|
        submissions, data_root = create_submission(chunk_data)
 | 
						|
        self.contract.submit(submissions)
 | 
						|
        wait_until(lambda: self.contract.num_submissions() == 4)
 | 
						|
        wait_until(lambda: self.nodes[0].zgs_get_file_info(data_root) is not None)
 | 
						|
 | 
						|
        for i in range(1, 2):
 | 
						|
            self.nodes[i].stop(kill=True)
 | 
						|
 | 
						|
        chunk_data1 = b"\x05" * 256
 | 
						|
        submissions1, data_root1 = create_submission(chunk_data1)
 | 
						|
        self.contract.submit(submissions1)
 | 
						|
        wait_until(lambda: self.contract.num_submissions() == 5)
 | 
						|
        wait_until(lambda: self.nodes[0].zgs_get_file_info(data_root1) is not None)
 | 
						|
 | 
						|
        for i in range(2, self.num_nodes):
 | 
						|
            self.nodes[i].stop(kill=True)
 | 
						|
 | 
						|
        segment = submit_data(self.nodes[0], chunk_data)
 | 
						|
        wait_until(lambda: self.nodes[0].zgs_get_file_info(data_root)["finalized"])
 | 
						|
 | 
						|
        segment = submit_data(self.nodes[0], chunk_data1)
 | 
						|
        wait_until(lambda: self.nodes[0].zgs_get_file_info(data_root1)["finalized"])
 | 
						|
 | 
						|
        for i in range(1, self.num_nodes):
 | 
						|
            self.log.info("wait for node: %s", i)
 | 
						|
            self.start_storage_node(i)
 | 
						|
            self.nodes[i].wait_for_rpc_connection()
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root1) is not None)
 | 
						|
            self.nodes[i].admin_start_sync_file(4)
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root1)["finalized"])
 | 
						|
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root) is not None)
 | 
						|
            self.nodes[i].admin_start_sync_file(3)
 | 
						|
            wait_until(lambda: self.nodes[i].zgs_get_file_info(data_root)["finalized"])
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    CrashTest().main()
 |