Closed
Description
We had this issue during a stress test. orders used the Trie module and had a total of 798 records.
Only this data was encountered unreadable, most of the other data can be read normally.
canister-id: ynbvm-hiaaa-aaaak-adbqa-cai
- Can get the data using Trie.filter().
code:
private func keyb(t: Blob) : Trie.Key<Blob> { return { key = t; hash = Blob.hash(t) }; };
public query func testTrieFilter() : async TrieList<Txid, TradingOrder>{
let _txid : Text = "000000c28ca1e305eeaeaccdd069e91a45f9668d6a3407e31a5c0db7c9372b28"; // blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+("
var txid : Blob = Blob.fromArray([]);
switch(Hex.decode(_txid)){
case(#ok(r)){ txid := Blob.fromArray(r); };
case(_){};
};
var trie = icdex_orders;
let page = 1;
let size = 10;
trie := Trie.filter<Txid, TradingOrder>(trie, func (k:Txid, v:TradingOrder): Bool{
k == txid;
});
return trieItems<Txid, TradingOrder>(trie, page, size);
};
execute:
dfx canister --network ic call ynbvm-hiaaa-aaaak-adbqa-cai testTrieFilter
returns:
(
record {
total = 1 : nat;
data = vec {
record {
blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+(";
record {
fee = record { fee0 = 0 : nat; fee1 = 0 : nat };
gas = record { gas0 = 0 : nat; gas1 = 0 : nat };
status = variant { Pending };
toids = vec {};
data = null;
time = 1_668_476_725_633_900_968 : int;
txid = blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+(";
icrc1Account = opt record {
owner = principal "vlpmr-zi3rn-n6nwy-qx6jf-snrkm-nwoje-jghma-7j3lv-irskf-yojl3-eqe";
subaccount = null;
};
orderType = variant { LMT };
filled = vec {};
expiration = 1_676_252_725_633_900_968 : int;
nonce = 194 : nat;
account = blob "\c1\e9\a9\c94\8f\ef\c3\e04\c9\08L\cd\0b\b0\0f\c4\9a\8e\c2\0a\0f\89\14\b2\a5R\f3\c3P\bc";
remaining = record {
quantity = variant { Sell = 100_000_000 : nat };
price = 300 : nat;
};
index = 940 : nat;
orderPrice = record {
quantity = variant { Sell = 100_000_000 : nat };
price = 300 : nat;
};
refund = record { 0 : nat; 0 : nat; 0 : nat };
};
};
};
totalPage = 1 : nat;
},
)
- Can get the data using Trie.mapFilter().
code:
public query func testTrieMapFilter() : async TrieList<Txid, TradingOrder>{
let _txid : Text = "000000c28ca1e305eeaeaccdd069e91a45f9668d6a3407e31a5c0db7c9372b28"; // blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+("
var txid : Blob = Blob.fromArray([]);
switch(Hex.decode(_txid)){
case(#ok(r)){ txid := Blob.fromArray(r); };
case(_){};
};
var trie = icdex_orders;
let page = 1;
let size = 10;
trie := Trie.mapFilter<Txid, TradingOrder, TradingOrder>(trie, func (k:Txid, v:TradingOrder): ?TradingOrder{
if (k == txid){
return ?v;
}else { return null; };
});
return trieItems<Txid, TradingOrder>(trie, page, size);
};
execute:
dfx canister --network ic call ynbvm-hiaaa-aaaak-adbqa-cai testTrieMapFilter
returns:
(
record {
total = 1 : nat;
data = vec {
record {
blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+(";
record {
fee = record { fee0 = 0 : nat; fee1 = 0 : nat };
gas = record { gas0 = 0 : nat; gas1 = 0 : nat };
status = variant { Pending };
toids = vec {};
data = null;
time = 1_668_476_725_633_900_968 : int;
txid = blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+(";
icrc1Account = opt record {
owner = principal "vlpmr-zi3rn-n6nwy-qx6jf-snrkm-nwoje-jghma-7j3lv-irskf-yojl3-eqe";
subaccount = null;
};
orderType = variant { LMT };
filled = vec {};
expiration = 1_676_252_725_633_900_968 : int;
nonce = 194 : nat;
account = blob "\c1\e9\a9\c94\8f\ef\c3\e04\c9\08L\cd\0b\b0\0f\c4\9a\8e\c2\0a\0f\89\14\b2\a5R\f3\c3P\bc";
remaining = record {
quantity = variant { Sell = 100_000_000 : nat };
price = 300 : nat;
};
index = 940 : nat;
orderPrice = record {
quantity = variant { Sell = 100_000_000 : nat };
price = 300 : nat;
};
refund = record { 0 : nat; 0 : nat; 0 : nat };
};
};
};
totalPage = 1 : nat;
},
)
- Cannot query the data using Trie.get()
code:
public query func testTrieGet() : async OrderStatusResponse{
let _txid : Text = "000000c28ca1e305eeaeaccdd069e91a45f9668d6a3407e31a5c0db7c9372b28"; // blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+("
var txid : Blob = Blob.fromArray([]);
switch(Hex.decode(_txid)){
case(#ok(r)){ txid := Blob.fromArray(r); };
case(_){};
};
switch(Trie.get(icdex_orders, keyb(txid), Blob.equal)){
case(?(order)){ return #Pending(order); };
case(_){ return #None; };
};
};
execute:
dfx canister --network ic call ynbvm-hiaaa-aaaak-adbqa-cai testTrieGet
returns:
(variant { None })
It is also
(variant { 870_530_776 })
- Cannot query the data using Trie.find()
code:
public query func testTrieFind() : async OrderStatusResponse{
let _txid : Text = "000000c28ca1e305eeaeaccdd069e91a45f9668d6a3407e31a5c0db7c9372b28"; // blob "\00\00\00\c2\8c\a1\e3\05\ee\ae\ac\cd\d0i\e9\1aE\f9f\8dj4\07\e3\1a\5c\0d\b7\c97+("
var txid : Blob = Blob.fromArray([]);
switch(Hex.decode(_txid)){
case(#ok(r)){ txid := Blob.fromArray(r); };
case(_){};
};
switch(Trie.find(icdex_orders, keyb(txid), Blob.equal)){
case(?(order)){ return #Pending(order)};
case(_){ return #None; };
};
};
execute:
dfx canister --network ic call ynbvm-hiaaa-aaaak-adbqa-cai testTrieFind
returns:
(variant { None })
It is also
(variant { 870_530_776 })
Metadata
Metadata
Assignees
Labels
No labels