Skip to content

Commit 4a10654

Browse files
chore(ICP-Archive): remove migration to stable structures code (#4478)
This allows us to also remove the dependency on deprecated `dfn_core::stable` which was used during the migration.
1 parent 9662ae2 commit 4a10654

File tree

7 files changed

+53
-203
lines changed

7 files changed

+53
-203
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rs/ledger_suite/icp/archive/BUILD.bazel

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ rust_canister(
3636
"//rs/ledger_suite/common/ledger_core",
3737
"//rs/ledger_suite/icp:icp_ledger",
3838
"//rs/nns/constants",
39-
"//rs/rust_canisters/dfn_core",
4039
"//rs/rust_canisters/http_types",
4140
"//rs/types/base_types",
4241
"@crate_index//:candid",

rs/ledger_suite/icp/archive/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ documentation.workspace = true
99
[dependencies]
1010
candid = { workspace = true }
1111
ciborium = { workspace = true }
12-
dfn_core = { path = "../../../rust_canisters/dfn_core" }
1312
ic-base-types = { path = "../../../types/base_types" }
1413
ic-canisters-http-types = { path = "../../../rust_canisters/http_types" }
1514
ic-cdk = { workspace = true }

rs/ledger_suite/icp/archive/src/main.rs

Lines changed: 19 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use candid::{candid_method, Decode};
2-
use dfn_core::stable;
32
use ic_base_types::{CanisterId, PrincipalId};
43
use ic_canisters_http_types::{HttpRequest, HttpResponse, HttpResponseBuilder};
5-
use ic_cdk::api::{
6-
call::{arg_data_raw, reply, reply_raw},
7-
caller, print,
4+
use ic_cdk::{
5+
api::{
6+
call::{arg_data_raw, reply, reply_raw},
7+
caller, print,
8+
},
9+
post_upgrade, query,
810
};
9-
use ic_cdk::query;
1011
use ic_icp_archive::ArchiveUpgradeArgument;
1112
use ic_ledger_canister_core::range_utils;
1213
use ic_ledger_canister_core::runtime::heap_memory_size_bytes;
@@ -28,15 +29,6 @@ use icp_ledger::{
2829
use serde::{Deserialize, Serialize};
2930
use std::{borrow::Cow, cell::RefCell};
3031

31-
#[derive(Debug, Deserialize, Serialize)]
32-
struct ArchiveNodeState {
33-
pub max_memory_size_bytes: usize,
34-
pub block_height_offset: u64,
35-
pub blocks: Vec<EncodedBlock>,
36-
pub total_block_size: usize,
37-
pub ledger_canister_id: CanisterId,
38-
}
39-
4032
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
4133
struct ArchiveState {
4234
pub max_memory_size_bytes: u64,
@@ -382,63 +374,24 @@ fn get_blocks_candid_() {
382374
reply((get_blocks(args),));
383375
}
384376

385-
#[export_name = "canister_post_upgrade"]
386-
fn post_upgrade() {
387-
ic_cdk::setup();
388-
377+
#[post_upgrade]
378+
fn post_upgrade(upgrade_arg: Option<ArchiveUpgradeArgument>) {
389379
set_last_upgrade_timestamp(ic_cdk::api::time());
390380

391-
let args = arg_data_raw();
392-
let arg_max_memory_size_bytes = if args.is_empty() {
393-
print("Upgrading archive without an upgrade argument.");
394-
None
395-
} else {
396-
match Decode!(&args, ArchiveUpgradeArgument) {
397-
Ok(args) => args.max_memory_size_bytes,
398-
Err(e) => {
399-
ic_cdk::trap(&format!("Unable to decode archive upgrade argument: {}", e));
400-
}
401-
}
381+
let arg_max_memory_size_bytes = match upgrade_arg {
382+
Some(upgrade_arg) => upgrade_arg.max_memory_size_bytes,
383+
None => None,
402384
};
403385

404-
let bytes = stable::get();
405-
let state: ArchiveNodeState = match ciborium::de::from_reader(std::io::Cursor::new(&bytes)) {
406-
Ok(state) => state,
407-
Err(_) => {
408-
// Already migrated to stable structures
409-
assert_eq!(stable_memory_version(), MEMORY_VERSION_MEM_MGR_INSTALLED);
410-
if let Some(max_memory_size_bytes) = arg_max_memory_size_bytes {
411-
print(format!(
412-
"Changing the max_memory_size_bytes to {}",
413-
max_memory_size_bytes
414-
));
415-
set_max_memory_size_bytes(max_memory_size_bytes);
416-
}
417-
print("Archive state already migrated to stable structures, exiting post_upgrade.");
418-
return;
419-
}
420-
};
421-
422-
assert_eq!(stable_memory_version(), MEMORY_VERSION_NO_MEM_MGR);
423-
set_stable_memory_version();
424-
425-
for block in &state.blocks {
426-
append_block(block);
427-
}
428-
429-
set_ledger_canister_id(state.ledger_canister_id);
430-
set_block_height_offset(state.block_height_offset);
431-
match arg_max_memory_size_bytes {
432-
Some(max_memory_size_bytes) => {
433-
print(format!(
434-
"Changing the max_memory_size_bytes to {}",
435-
max_memory_size_bytes
436-
));
437-
set_max_memory_size_bytes(max_memory_size_bytes);
438-
}
439-
None => set_max_memory_size_bytes(state.max_memory_size_bytes as u64),
386+
// We do not support migration from scratch stable memory anymore
387+
assert_eq!(stable_memory_version(), MEMORY_VERSION_MEM_MGR_INSTALLED);
388+
if let Some(max_memory_size_bytes) = arg_max_memory_size_bytes {
389+
print(format!(
390+
"Changing the max_memory_size_bytes to {}",
391+
max_memory_size_bytes
392+
));
393+
set_max_memory_size_bytes(max_memory_size_bytes);
440394
}
441-
assert_eq!(state.total_block_size as u64, total_block_size());
442395
}
443396

444397
fn encode_metrics(w: &mut MetricsEncoder<Vec<u8>>) -> std::io::Result<()> {

rs/ledger_suite/icp/archive/tests/tests.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,7 @@ impl Setup {
7979
}
8080

8181
fn upgrade(&self, upgrade_arg: Option<ArchiveUpgradeArgument>, expected_error: Option<String>) {
82-
let upgrade_arg = if let Some(upgrade_arg) = upgrade_arg {
83-
Encode!(&upgrade_arg).expect("should encode archive upgrade args")
84-
} else {
85-
vec![]
86-
};
82+
let upgrade_arg = Encode!(&upgrade_arg).expect("should encode archive upgrade args");
8783
match self.pocket_ic.upgrade_canister(
8884
Principal::from(self.canister_id),
8985
self.archive_wasm.clone(),

rs/ledger_suite/icp/tests/golden_nns_state.rs

Lines changed: 16 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use candid::{Decode, Encode};
2-
use canister_test::{Wasm, WasmResult};
2+
use canister_test::Wasm;
33
use ic_base_types::CanisterId;
4-
use ic_icp_archive::ArchiveUpgradeArgument;
54
use ic_ledger_core::block::BlockType;
65
use ic_ledger_core::Tokens;
76
use ic_ledger_suite_state_machine_tests::in_memory_ledger::{
@@ -27,8 +26,6 @@ use ic_state_machine_tests::{ErrorCode, StateMachine, UserError};
2726
use icp_ledger::{
2827
AccountIdentifier, Archives, Block, FeatureFlags, LedgerCanisterPayload, UpgradeArgs,
2928
};
30-
use std::collections::BTreeMap;
31-
use std::str::FromStr;
3229
use std::time::Instant;
3330

3431
/// The number of instructions that can be executed in a single canister upgrade as per
@@ -259,7 +256,7 @@ fn should_create_state_machine_with_golden_nns_state() {
259256
// For breaking changes, e.g., if mainnet is running a version with balances and allowances in
260257
// stable structures, but master also has blocks in stable structures, `ledger_is_downgradable`
261258
// should be set to `false`, otherwise `true`.
262-
setup.downgrade_to_mainnet(true, true);
259+
setup.downgrade_to_mainnet(true);
263260

264261
// Verify ledger balance and allowance state
265262
// As before, the allowance check needs to be skipped for the mainnet version of the ledger.
@@ -285,8 +282,6 @@ enum ExpectMigration {
285282
No,
286283
}
287284

288-
const LARGE_ARCHIVE_CAPACITY: u64 = 10 * 1024 * 1024 * 1024;
289-
290285
impl Setup {
291286
pub fn new() -> Self {
292287
let state_machine = new_state_machine_with_golden_nns_state_or_panic();
@@ -320,18 +315,13 @@ impl Setup {
320315
wait_ledger_ready(&self.state_machine, LEDGER_CANISTER_ID, 100);
321316
}
322317
self.check_ledger_metrics(expect_migration);
323-
let upgrade_args = BTreeMap::from([(
324-
CanisterId::from_str("q3fc5-haaaa-aaaaa-aaahq-cai").unwrap(),
325-
2 * LARGE_ARCHIVE_CAPACITY,
326-
)]);
327-
self.upgrade_archive_canisters(&self.master_wasms.archive, true, upgrade_args);
318+
self.upgrade_archive_canisters(
319+
&self.master_wasms.archive,
320+
Encode!(&()).expect("failed to encode archive upgrade arg"),
321+
);
328322
}
329323

330-
pub fn downgrade_to_mainnet(
331-
&self,
332-
ledger_is_downgradable: bool,
333-
archive_is_downgradable: bool,
334-
) {
324+
pub fn downgrade_to_mainnet(&self, ledger_is_downgradable: bool) {
335325
println!("Downgrading to mainnet version");
336326
self.upgrade_index(&self.mainnet_wasms.index);
337327
match (
@@ -362,11 +352,7 @@ impl Setup {
362352
}
363353
}
364354
self.check_ledger_metrics(ExpectMigration::No);
365-
self.upgrade_archive_canisters(
366-
&self.mainnet_wasms.archive,
367-
archive_is_downgradable,
368-
BTreeMap::new(),
369-
);
355+
self.upgrade_archive_canisters(&self.mainnet_wasms.archive, vec![]);
370356
}
371357

372358
pub fn perform_upgrade_downgrade_testing(
@@ -426,85 +412,16 @@ impl Setup {
426412
.expect("failed to decode archives response")
427413
}
428414

429-
fn get_remaining_capacity(&self, archive_canister_id: CanisterId) -> u64 {
430-
let wasm_result = self
431-
.state_machine
432-
.execute_ingress(
433-
archive_canister_id,
434-
"remaining_capacity",
435-
Encode!(&()).expect("should encode empty args"),
436-
)
437-
.unwrap();
438-
match wasm_result {
439-
WasmResult::Reply(bytes) => Decode!(&bytes, u64).expect("failed to decode usize"),
440-
WasmResult::Reject(reason) => panic!("failed to query remaining_capacity: {reason}"),
441-
}
442-
}
443-
444-
fn upgrade_archive(
445-
&self,
446-
archive_canister_id: CanisterId,
447-
wasm_bytes: Vec<u8>,
448-
archive_is_upgradable: bool,
449-
upgrade_arg_max_capacity: Option<u64>,
450-
) {
451-
let (upgrade_arg, expect_large_capacity) =
452-
if let Some(upgrade_arg_max_capacity) = upgrade_arg_max_capacity {
453-
(
454-
Encode!(&ArchiveUpgradeArgument {
455-
max_memory_size_bytes: Some(upgrade_arg_max_capacity)
456-
})
457-
.expect("should encode archive upgrade args"),
458-
archive_is_upgradable,
459-
)
460-
} else {
461-
(vec![], false)
462-
};
463-
let initial_capacity = self.get_remaining_capacity(archive_canister_id);
464-
match self
465-
.state_machine
466-
.upgrade_canister(archive_canister_id, wasm_bytes, upgrade_arg)
467-
{
468-
Ok(_) => {
469-
if !archive_is_upgradable {
470-
panic!("upgrade should fail")
471-
}
472-
}
473-
Err(e) => {
474-
if archive_is_upgradable {
475-
panic!(
476-
"should successfully upgrade archive '{}' to new local version: {}",
477-
archive_canister_id, e
478-
)
479-
} else {
480-
assert!(e.description().contains("Decoding stable memory failed"));
481-
}
482-
}
483-
}
484-
let final_capacity = self.get_remaining_capacity(archive_canister_id);
485-
if expect_large_capacity {
486-
// We increased the total capacity to 2 * LARGE_ARCHIVE_CAPACITY,
487-
// so the remaining capacity should be larger than LARGE_ARCHIVE_CAPACITY.
488-
assert!(final_capacity > LARGE_ARCHIVE_CAPACITY);
489-
} else {
490-
assert_eq!(initial_capacity, final_capacity);
491-
}
492-
}
493-
494-
fn upgrade_archive_canisters(
495-
&self,
496-
wasm: &Wasm,
497-
archive_is_upgradable: bool,
498-
upgrade_arg: BTreeMap<CanisterId, u64>,
499-
) {
415+
fn upgrade_archive_canisters(&self, wasm: &Wasm, upgrade_arg: Vec<u8>) {
500416
let archives = self.list_archives().archives;
501417
for archive_info in &archives {
502-
self.upgrade_archive(
503-
archive_info.canister_id,
504-
wasm.clone().bytes(),
505-
archive_is_upgradable,
506-
upgrade_arg.get(&archive_info.canister_id).cloned(),
507-
);
418+
self.state_machine
419+
.upgrade_canister(
420+
archive_info.canister_id,
421+
wasm.clone().bytes(),
422+
upgrade_arg.clone(),
423+
)
424+
.expect("failed to upgrade archive");
508425
}
509426
}
510427

rs/ledger_suite/icp/tests/upgrade_downgrade.rs

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -177,45 +177,32 @@ impl Setup {
177177
);
178178
}
179179

180-
fn upgrade_archive_canisters(
181-
&self,
182-
upgrade_to_version: UpgradeToVersion,
183-
should_succeed: bool,
184-
) {
185-
let archive_wasm_bytes = match upgrade_to_version {
186-
UpgradeToVersion::MainNet => build_mainnet_ledger_archive_wasm().bytes(),
187-
UpgradeToVersion::Latest => build_ledger_archive_wasm().bytes(),
180+
fn upgrade_archive_canisters(&self, upgrade_to_version: UpgradeToVersion) {
181+
let (archive_wasm_bytes, upgrade_arg) = match upgrade_to_version {
182+
UpgradeToVersion::MainNet => (build_mainnet_ledger_archive_wasm().bytes(), vec![]),
183+
UpgradeToVersion::Latest => {
184+
(build_ledger_archive_wasm().bytes(), Encode!(&()).unwrap())
185+
}
188186
};
189187
let mainnet_archive_module_hash = mainnet_archive_canister_sha256sum();
190188
let ledger_archives = archives(&self.pocket_ic);
191189
for archive_canister_id in ledger_archives
192190
.iter()
193191
.map(|archive| candid::Principal::from(archive.canister_id))
194192
{
195-
match self.pocket_ic.upgrade_canister(
196-
archive_canister_id,
197-
archive_wasm_bytes.clone(),
198-
vec![],
199-
None,
200-
) {
201-
Ok(_) => {
202-
if !should_succeed {
203-
panic!("Upgrade should fail!");
204-
}
205-
}
206-
Err(e) => {
207-
if should_succeed {
208-
panic!("Upgrade should succeed!");
209-
} else {
210-
assert!(e.reject_message.contains("Decoding stable memory failed"));
211-
}
212-
}
213-
};
193+
self.pocket_ic
194+
.upgrade_canister(
195+
archive_canister_id,
196+
archive_wasm_bytes.clone(),
197+
upgrade_arg.clone(),
198+
None,
199+
)
200+
.expect("failed to upgrade the archive canister");
214201

215202
self.assert_canister_module_hash(
216203
archive_canister_id,
217204
&mainnet_archive_module_hash,
218-
upgrade_to_version == UpgradeToVersion::MainNet && should_succeed,
205+
upgrade_to_version == UpgradeToVersion::MainNet,
219206
);
220207
}
221208
}
@@ -457,13 +444,13 @@ fn should_upgrade_and_downgrade_canister_suite() {
457444

458445
setup.upgrade_index_canister(UpgradeToVersion::Latest);
459446
setup.upgrade_ledger_canister(UpgradeToVersion::Latest, true);
460-
setup.upgrade_archive_canisters(UpgradeToVersion::Latest, true);
447+
setup.upgrade_archive_canisters(UpgradeToVersion::Latest);
461448

462449
setup.assert_index_ledger_parity(true);
463450

464451
setup.upgrade_index_canister(UpgradeToVersion::MainNet);
465452
setup.upgrade_ledger_canister(UpgradeToVersion::MainNet, true);
466-
setup.upgrade_archive_canisters(UpgradeToVersion::MainNet, true);
453+
setup.upgrade_archive_canisters(UpgradeToVersion::MainNet);
467454

468455
setup.assert_index_ledger_parity(true);
469456
}

0 commit comments

Comments
 (0)