mirror of
https://github.com/0glabs/0g-storage-node.git
synced 2024-12-26 08:15:17 +00:00
Fix tests.
This commit is contained in:
parent
9e0beb6e05
commit
e0bb902194
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -5834,6 +5834,7 @@ dependencies = [
|
|||||||
"task_executor",
|
"task_executor",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
"zgs_spec",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -11,7 +11,7 @@ abigen!(PoraMine, "../../storage-contracts-abis/PoraMine.json");
|
|||||||
#[cfg(not(feature = "dev"))]
|
#[cfg(not(feature = "dev"))]
|
||||||
abigen!(
|
abigen!(
|
||||||
ChunkLinearReward,
|
ChunkLinearReward,
|
||||||
"../../0g-storage-contracts/artifacts/contracts/reward/ChunkLinearReward.sol/ChunkLinearReward.json"
|
"../../storage-contracts-abis/ChunkLinearReward.json"
|
||||||
);
|
);
|
||||||
|
|
||||||
#[cfg(feature = "dev")]
|
#[cfg(feature = "dev")]
|
||||||
@ -29,5 +29,5 @@ abigen!(
|
|||||||
#[cfg(feature = "dev")]
|
#[cfg(feature = "dev")]
|
||||||
abigen!(
|
abigen!(
|
||||||
ChunkLinearReward,
|
ChunkLinearReward,
|
||||||
"../../0g-storage-contracts/artifacts/contracts/reward/ChunkLinearReward.sol/ChunkLinearReward.json"
|
"../../0g-storage-contracts-dev/artifacts/contracts/reward/ChunkLinearReward.sol/ChunkLinearReward.json"
|
||||||
);
|
);
|
||||||
|
@ -15,3 +15,4 @@ tracing = "0.1.40"
|
|||||||
ethereum-types = "0.14.1"
|
ethereum-types = "0.14.1"
|
||||||
contract-interface = { path = "../../common/contract-interface" }
|
contract-interface = { path = "../../common/contract-interface" }
|
||||||
ethers = "^2"
|
ethers = "^2"
|
||||||
|
zgs_spec = { path = "../../common/spec" }
|
@ -8,16 +8,20 @@ use std::path::PathBuf;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use storage::config::{ShardConfig, SHARD_CONFIG_KEY};
|
use storage::config::{ShardConfig, SHARD_CONFIG_KEY};
|
||||||
|
use storage::log_store::log_manager::PORA_CHUNK_SIZE;
|
||||||
use storage_async::Store;
|
use storage_async::Store;
|
||||||
use task_executor::TaskExecutor;
|
use task_executor::TaskExecutor;
|
||||||
use tokio::sync::{broadcast, mpsc};
|
use tokio::sync::{broadcast, mpsc};
|
||||||
use tracing::{debug, info};
|
use tracing::{debug, info};
|
||||||
|
use zgs_spec::SECTORS_PER_PRICING;
|
||||||
|
|
||||||
// Start pruning when the db directory size exceeds 0.9 * limit.
|
// Start pruning when the db directory size exceeds 0.9 * limit.
|
||||||
const PRUNE_THRESHOLD: f32 = 0.9;
|
const PRUNE_THRESHOLD: f32 = 0.9;
|
||||||
|
|
||||||
const FIRST_REWARDABLE_CHUNK_KEY: &str = "first_rewardable_chunk";
|
const FIRST_REWARDABLE_CHUNK_KEY: &str = "first_rewardable_chunk";
|
||||||
|
|
||||||
|
const CHUNKS_PER_PRICING: u64 = (SECTORS_PER_PRICING / PORA_CHUNK_SIZE) as u64;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct PrunerConfig {
|
pub struct PrunerConfig {
|
||||||
pub shard_config: ShardConfig,
|
pub shard_config: ShardConfig,
|
||||||
@ -110,6 +114,7 @@ impl Pruner {
|
|||||||
self.prune_in_batch(no_reward_list).await?;
|
self.prune_in_batch(no_reward_list).await?;
|
||||||
self.put_first_rewardable_chunk_index(new_first_rewardable)
|
self.put_first_rewardable_chunk_index(new_first_rewardable)
|
||||||
.await?;
|
.await?;
|
||||||
|
self.first_rewardable_chunk = new_first_rewardable;
|
||||||
}
|
}
|
||||||
tokio::time::sleep(self.config.check_time).await;
|
tokio::time::sleep(self.config.check_time).await;
|
||||||
}
|
}
|
||||||
@ -140,7 +145,12 @@ impl Pruner {
|
|||||||
config.num_shard *= 2;
|
config.num_shard *= 2;
|
||||||
|
|
||||||
// Generate delete list
|
// Generate delete list
|
||||||
let flow_len = self.store.get_context().await?.1;
|
let flow_len = self
|
||||||
|
.store
|
||||||
|
.get_context()
|
||||||
|
.await?
|
||||||
|
.1
|
||||||
|
.div_ceil(PORA_CHUNK_SIZE as u64);
|
||||||
let start_index = old_shard_id + (!rand_bit) as usize * old_num_shard;
|
let start_index = old_shard_id + (!rand_bit) as usize * old_num_shard;
|
||||||
Ok(Some(Box::new(
|
Ok(Some(Box::new(
|
||||||
(start_index as u64..flow_len).step_by(config.num_shard),
|
(start_index as u64..flow_len).step_by(config.num_shard),
|
||||||
@ -162,7 +172,8 @@ impl Pruner {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
Ok(Some(Box::new(
|
Ok(Some(Box::new(
|
||||||
self.first_rewardable_chunk..new_first_rewardable,
|
self.first_rewardable_chunk * CHUNKS_PER_PRICING
|
||||||
|
..new_first_rewardable * CHUNKS_PER_PRICING,
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ build_config! {
|
|||||||
(db_dir, (String), "db".to_string())
|
(db_dir, (String), "db".to_string())
|
||||||
(db_max_num_chunks, (Option<usize>), None)
|
(db_max_num_chunks, (Option<usize>), None)
|
||||||
(prune_check_time_s, (u64), 60)
|
(prune_check_time_s, (u64), 60)
|
||||||
(prune_batch_size, (usize), 1024)
|
(prune_batch_size, (usize), 16 * 1024)
|
||||||
(prune_batch_wait_time_ms, (u64), 1000)
|
(prune_batch_wait_time_ms, (u64), 1000)
|
||||||
|
|
||||||
// misc
|
// misc
|
||||||
|
@ -14,24 +14,24 @@ class PrunerTest(TestFramework):
|
|||||||
self.num_blockchain_nodes = 1
|
self.num_blockchain_nodes = 1
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.zgs_node_configs[0] = {
|
self.zgs_node_configs[0] = {
|
||||||
"db_max_num_chunks": 16 * 1024,
|
"db_max_num_chunks": 32 * 1024 * 1024,
|
||||||
"miner_key": GENESIS_PRIV_KEY,
|
# "miner_key": GENESIS_PRIV_KEY,
|
||||||
"prune_check_time_s": 1,
|
"prune_check_time_s": 1,
|
||||||
"prune_batch_wait_time_ms": 10,
|
"prune_batch_wait_time_ms": 1,
|
||||||
}
|
}
|
||||||
self.enable_market = True
|
self.enable_market = True
|
||||||
self.mine_period = int(45 / self.block_time)
|
self.mine_period = int(45 / self.block_time)
|
||||||
self.lifetime_seconds = 60
|
self.lifetime_seconds = 240
|
||||||
self.launch_wait_seconds = 15
|
self.launch_wait_seconds = 15
|
||||||
self.log.info("Contract Info: Est. block time %.2f, Mine period %d", self.block_time, self.mine_period)
|
self.log.info("Contract Info: Est. block time %.2f, Mine period %d", self.block_time, self.mine_period)
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
difficulty = int(2**256 / 5 / estimate_st_performance())
|
# difficulty = int(2**256 / 5 / estimate_st_performance())
|
||||||
self.mine_contract.set_quality(difficulty)
|
# self.mine_contract.set_quality(difficulty)
|
||||||
|
|
||||||
client = self.nodes[0]
|
client = self.nodes[0]
|
||||||
|
|
||||||
chunk_data = b"\x02" * 16 * 256 * 1024
|
chunk_data = b"\x02" * 5 * 1024 * 1024 * 1024
|
||||||
submissions, data_root = create_submission(chunk_data)
|
submissions, data_root = create_submission(chunk_data)
|
||||||
self.contract.submit(submissions, tx_prarams = {"value": int(len(chunk_data) / 256 * PRICE_PER_SECTOR * 1.1)})
|
self.contract.submit(submissions, tx_prarams = {"value": int(len(chunk_data) / 256 * PRICE_PER_SECTOR * 1.1)})
|
||||||
wait_until(lambda: self.contract.num_submissions() == 1)
|
wait_until(lambda: self.contract.num_submissions() == 1)
|
||||||
@ -45,19 +45,14 @@ class PrunerTest(TestFramework):
|
|||||||
shard_id = int(shard_config["shardId"])
|
shard_id = int(shard_config["shardId"])
|
||||||
num_shard = int(shard_config["numShard"])
|
num_shard = int(shard_config["numShard"])
|
||||||
|
|
||||||
|
wait_until(lambda: self.reward_contract.first_rewardable_chunk() != 0, timeout=180)
|
||||||
|
first_rewardable = self.reward_contract.first_rewardable_chunk() * 32 * 1024
|
||||||
|
# Wait for 1 sec for the no reward segments to be pruned.
|
||||||
|
time.sleep(1)
|
||||||
|
# Wait for chunks to be removed.
|
||||||
for i in range(len(segment)):
|
for i in range(len(segment)):
|
||||||
seg = client.zgs_download_segment(data_root, i * 1024, (i + 1) * 1024)
|
seg = client.zgs_download_segment(data_root, i * 1024, (i + 1) * 1024)
|
||||||
if i % num_shard == shard_id:
|
if i < first_rewardable or i % num_shard != shard_id:
|
||||||
# base64 encoding size
|
|
||||||
assert_equal(len(seg), 349528)
|
|
||||||
else:
|
|
||||||
assert_equal(seg, None)
|
|
||||||
|
|
||||||
wait_until(lambda: self.reward_contract.first_rewardable_chunk() != 0)
|
|
||||||
first_rewardable = self.reward_contract.first_rewardable_chunk()
|
|
||||||
for i in range(shard_id, len(segment), num_shard):
|
|
||||||
seg = client.zgs_download_segment(data_root, i * 1024, (i + 1) * 1024)
|
|
||||||
if i < first_rewardable:
|
|
||||||
assert_equal(seg, None)
|
assert_equal(seg, None)
|
||||||
else:
|
else:
|
||||||
assert_equal(len(seg), 349528)
|
assert_equal(len(seg), 349528)
|
||||||
|
@ -17,11 +17,11 @@ class ContractProxy:
|
|||||||
else self.blockchain_nodes[node_idx].get_contract(self.contract_address)
|
else self.blockchain_nodes[node_idx].get_contract(self.contract_address)
|
||||||
)
|
)
|
||||||
|
|
||||||
def _call(self, fn_name, node_idx, **args):
|
def _call(self, fn_name, node_idx, *args):
|
||||||
assert node_idx < len(self.blockchain_nodes)
|
assert node_idx < len(self.blockchain_nodes)
|
||||||
|
|
||||||
contract = self._get_contract(node_idx)
|
contract = self._get_contract(node_idx)
|
||||||
return getattr(contract.functions, fn_name)(**args).call()
|
return getattr(contract.functions, fn_name)(*args).call()
|
||||||
|
|
||||||
def _send(self, fn_name, node_idx, **args):
|
def _send(self, fn_name, node_idx, **args):
|
||||||
assert node_idx < len(self.blockchain_nodes)
|
assert node_idx < len(self.blockchain_nodes)
|
||||||
@ -114,3 +114,9 @@ class RewardContractProxy(ContractProxy):
|
|||||||
|
|
||||||
def base_reward(self, node_idx = 0):
|
def base_reward(self, node_idx = 0):
|
||||||
return self._call("baseReward", node_idx)
|
return self._call("baseReward", node_idx)
|
||||||
|
|
||||||
|
def first_rewardable_chunk(self, node_idx = 0):
|
||||||
|
return self._call("firstRewardableChunk", node_idx)
|
||||||
|
|
||||||
|
def reward_deadline(self, node_idx = 0):
|
||||||
|
return self._call("rewardDeadline", node_idx, 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user