Esempio n. 1
0
    def run_test(self):
        num_nodes = len(self.nodes)

        # setup monitor to report the current block count periodically
        cur_block_count = self.nodes[0].getblockcount()
        monitor_thread = threading.Thread(target=self.monitor,
                                          args=(cur_block_count, ),
                                          daemon=True)
        monitor_thread.start()

        # generate blocks
        threads = {}
        rpc_times = []
        for i in range(1, self.options.num_blocks + 1):
            wait_sec = random.expovariate(1000 /
                                          self.options.generation_period_ms)
            start = time.time()

            # find an idle node to generate block
            p = random.randint(0, num_nodes - 1)
            retry = 0
            while retry < 10:
                pre_thread = threads.get(p)
                if pre_thread is not None and pre_thread.is_alive():
                    p = random.randint(0, num_nodes - 1)
                    retry += 1
                else:
                    break

            if retry >= 10:
                self.log.warn(
                    "too many nodes are busy to generate block, stop to analyze logs."
                )
                break

            thread = GenerateThread(self.nodes, p, self.options.txs_per_block,
                                    self.options.generate_tx_data_len,
                                    self.log, rpc_times)
            thread.start()
            threads[p] = thread

            if i % self.options.block_sync_step == 0:
                self.log.info("[PROGRESS] %d blocks generated async", i)

            elapsed = time.time() - start
            if elapsed < wait_sec:
                self.log.debug("%d generating block %.2f", p, elapsed)
                time.sleep(wait_sec - elapsed)
            else:
                self.log.warn("%d generating block slowly %.2f", p, elapsed)

        monitor_thread.join()
        self.sync_blocks()

        self.log.info("generateoneblock RPC latency: {}".format(
            Statistics(rpc_times, 3).__dict__))
        self.log.info("Best block: {}".format(
            RpcClient(self.nodes[0]).best_block_hash()))
Esempio n. 2
0
    def generate_blocks_async(self):
        num_nodes = len(self.nodes)

        max_retry = 200
        # generate blocks
        threads = {}
        rpc_times = []
        for i in range(1, self.options.num_blocks + 1):
            wait_sec = random.expovariate(1000 /
                                          self.options.generation_period_ms)
            start = time.time()

            # find an idle node to generate block
            p = random.randint(0, num_nodes - 1)
            retry = 0
            while retry < max_retry:
                pre_thread = threads.get(p)
                if pre_thread is not None and pre_thread.is_alive():
                    p = random.randint(0, num_nodes - 1)
                    retry += 1
                    time.sleep(0.05)
                else:
                    break

            if retry >= max_retry:
                self.log.warn(
                    "too many nodes are busy to generate block, stop to analyze logs."
                )
                break

            if self.enable_tx_propagation:
                # Generate a block with the transactions in the node's local tx pool
                thread = SimpleGenerateThread(
                    self.nodes, p, self.options.max_block_size_in_bytes,
                    self.log, rpc_times)
            else:
                # Generate a fixed-size block with fake tx
                thread = GenerateThread(self.nodes, p,
                                        self.options.txs_per_block,
                                        self.options.generate_tx_data_len,
                                        self.log, rpc_times)
            thread.start()
            threads[p] = thread

            if i % self.options.report_progress_blocks == 0:
                self.log.info("[PROGRESS] %d blocks generated async", i)

            self.progress = i

            elapsed = time.time() - start
            if elapsed < wait_sec:
                self.log.debug("%d generating block %.2f", p, elapsed)
                time.sleep(wait_sec - elapsed)
            elif elapsed > 0.01:
                self.log.warn("%d generating block slowly %.2f", p, elapsed)
        self.log.info("generateoneblock RPC latency: {}".format(
            Statistics(rpc_times, 3).__dict__))
Esempio n. 3
0
    def run_test(self):
        num_nodes = len(self.nodes)

        if self.tx_propagation_enabled:
            #setup usable accounts

            start_time = time.time()
            current_index = 1
            for i in range(len(self.nodes)):
                client = RpcClient(self.nodes[i])
                client.send_usable_genesis_accounts(current_index)
                current_index += self.options.txgen_account_count
            self.log.info(
                "Time spend (s) on setting up genesis accounts: {}".format(
                    time.time() - start_time))

        # setup monitor to report the current block count periodically
        cur_block_count = self.nodes[0].getblockcount()
        # The monitor will check the block_count of nodes[0]
        monitor_thread = threading.Thread(target=self.monitor,
                                          args=(cur_block_count, 100),
                                          daemon=True)
        monitor_thread.start()

        # generate blocks
        threads = {}
        rpc_times = []
        for i in range(1, self.options.num_blocks + 1):
            wait_sec = random.expovariate(1000 /
                                          self.options.generation_period_ms)
            start = time.time()

            # find an idle node to generate block
            p = random.randint(0, num_nodes - 1)
            retry = 0
            while retry < 10:
                pre_thread = threads.get(p)
                if pre_thread is not None and pre_thread.is_alive():
                    p = random.randint(0, num_nodes - 1)
                    retry += 1
                    time.sleep(0.01)
                else:
                    break

            if retry >= 10:
                self.log.warn(
                    "too many nodes are busy to generate block, stop to analyze logs."
                )
                break

            if self.tx_propagation_enabled:
                # Generate a block with the transactions in the node's local tx pool
                thread = SimpleGenerateThread(
                    self.nodes, p, self.options.txs_per_block,
                    self.options.generate_tx_data_len, self.log, rpc_times)
            else:
                # Generate a fixed-size block with fake tx
                thread = GenerateThread(self.nodes, p,
                                        self.options.txs_per_block,
                                        self.options.generate_tx_data_len,
                                        self.log, rpc_times)
            thread.start()
            threads[p] = thread

            if i % self.options.block_sync_step == 0:
                self.log.info("[PROGRESS] %d blocks generated async", i)

            self.progress = i

            elapsed = time.time() - start
            if elapsed < wait_sec:
                self.log.debug("%d generating block %.2f", p, elapsed)
                time.sleep(wait_sec - elapsed)
            elif elapsed > 0.01:
                self.log.warn("%d generating block slowly %.2f", p, elapsed)

        monitor_thread.join()
        self.log.info("Goodput: {}".format(self.nodes[0].getgoodput()))
        self.sync_blocks()

        self.log.info("generateoneblock RPC latency: {}".format(
            Statistics(rpc_times, 3).__dict__))
        self.log.info("Best block: {}".format(
            RpcClient(self.nodes[0]).best_block_hash()))
Esempio n. 4
0
    def run_test(self):
        num_nodes = len(self.nodes)

        if self.tx_propagation_enabled:
            # Setup balance for each node
            client = RpcClient(self.nodes[0])
            for i in range(num_nodes):
                pub_key = self.nodes[i].key
                addr = self.nodes[i].addr
                self.log.info("%d has addr=%s pubkey=%s", i, encode_hex(addr),
                              pub_key)
                tx = client.new_tx(value=int(default_config["TOTAL_COIN"] /
                                             (num_nodes + 1)) - 21000,
                                   receiver=encode_hex(addr),
                                   nonce=i)
                client.send_tx(tx)

        # setup monitor to report the current block count periodically
        cur_block_count = self.nodes[0].getblockcount()
        # The monitor will check the block_count of nodes[0]
        monitor_thread = threading.Thread(target=self.monitor,
                                          args=(cur_block_count, 100),
                                          daemon=True)
        monitor_thread.start()

        # generate blocks
        threads = {}
        rpc_times = []
        for i in range(1, self.options.num_blocks + 1):
            wait_sec = random.expovariate(1000 /
                                          self.options.generation_period_ms)
            start = time.time()

            # find an idle node to generate block
            p = random.randint(0, num_nodes - 1)
            retry = 0
            while retry < 10:
                pre_thread = threads.get(p)
                if pre_thread is not None and pre_thread.is_alive():
                    p = random.randint(0, num_nodes - 1)
                    retry += 1
                else:
                    break

            if retry >= 10:
                self.log.warn(
                    "too many nodes are busy to generate block, stop to analyze logs."
                )
                break

            if self.tx_propagation_enabled:
                # Generate a block with the transactions in the node's local tx pool
                thread = SimpleGenerateThread(
                    self.nodes, p, self.options.txs_per_block,
                    self.options.generate_tx_data_len, self.log, rpc_times)
            else:
                # Generate a fixed-size block with fake tx
                thread = GenerateThread(self.nodes, p,
                                        self.options.txs_per_block,
                                        self.options.generate_tx_data_len,
                                        self.log, rpc_times)
            thread.start()
            threads[p] = thread

            if i % self.options.block_sync_step == 0:
                self.log.info("[PROGRESS] %d blocks generated async", i)

            elapsed = time.time() - start
            if elapsed < wait_sec:
                self.log.debug("%d generating block %.2f", p, elapsed)
                time.sleep(wait_sec - elapsed)
            else:
                self.log.warn("%d generating block slowly %.2f", p, elapsed)

        monitor_thread.join()
        self.sync_blocks()

        self.log.info("generateoneblock RPC latency: {}".format(
            Statistics(rpc_times, 3).__dict__))
        self.log.info("Best block: {}".format(
            RpcClient(self.nodes[0]).best_block_hash()))