Skip to content

Commit 454df75

Browse files
authored
Merge branch 'develop' into fix/clone-double-reference
2 parents 958cbbf + ad84ef6 commit 454df75

File tree

21 files changed

+3990
-1476
lines changed

21 files changed

+3990
-1476
lines changed

stackslib/src/net/chat.rs

Lines changed: 1227 additions & 1034 deletions
Large diffs are not rendered by default.

stackslib/src/net/codec.rs

Lines changed: 100 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -835,12 +835,17 @@ impl StacksMessageCodec for StackerDBChunkInvData {
835835
return Err(codec_error::ArrayTooLong);
836836
}
837837
write_next(fd, &self.slot_versions)?;
838+
write_next(fd, &self.num_outbound_replicas)?;
838839
Ok(())
839840
}
840841

841842
fn consensus_deserialize<R: Read>(fd: &mut R) -> Result<StackerDBChunkInvData, codec_error> {
842843
let slot_versions: Vec<u32> = read_next_at_most(fd, stackerdb::STACKERDB_INV_MAX.into())?;
843-
Ok(StackerDBChunkInvData { slot_versions })
844+
let num_outbound_replicas: u32 = read_next(fd)?;
845+
Ok(StackerDBChunkInvData {
846+
slot_versions,
847+
num_outbound_replicas,
848+
})
844849
}
845850
}
846851

@@ -890,6 +895,26 @@ impl StacksMessageCodec for StackerDBChunkData {
890895
}
891896
}
892897

898+
impl StacksMessageCodec for StackerDBPushChunkData {
899+
fn consensus_serialize<W: Write>(&self, fd: &mut W) -> Result<(), codec_error> {
900+
contract_id_consensus_serialize(fd, &self.contract_id)?;
901+
write_next(fd, &self.rc_consensus_hash)?;
902+
write_next(fd, &self.chunk_data)?;
903+
Ok(())
904+
}
905+
906+
fn consensus_deserialize<R: Read>(fd: &mut R) -> Result<StackerDBPushChunkData, codec_error> {
907+
let contract_id: ContractId = contract_id_consensus_deserialize(fd)?;
908+
let rc_consensus_hash: ConsensusHash = read_next(fd)?;
909+
let chunk_data: StackerDBChunkData = read_next(fd)?;
910+
Ok(StackerDBPushChunkData {
911+
contract_id,
912+
rc_consensus_hash,
913+
chunk_data,
914+
})
915+
}
916+
}
917+
893918
impl StacksMessageCodec for RelayData {
894919
fn consensus_serialize<W: Write>(&self, fd: &mut W) -> Result<(), codec_error> {
895920
write_next(fd, &self.peer)?;
@@ -937,6 +962,7 @@ impl StacksMessageType {
937962
StacksMessageType::StackerDBChunkInv(ref _m) => StacksMessageID::StackerDBChunkInv,
938963
StacksMessageType::StackerDBGetChunk(ref _m) => StacksMessageID::StackerDBGetChunk,
939964
StacksMessageType::StackerDBChunk(ref _m) => StacksMessageID::StackerDBChunk,
965+
StacksMessageType::StackerDBPushChunk(ref _m) => StacksMessageID::StackerDBPushChunk,
940966
}
941967
}
942968

@@ -968,6 +994,7 @@ impl StacksMessageType {
968994
StacksMessageType::StackerDBChunkInv(ref _m) => "StackerDBChunkInv",
969995
StacksMessageType::StackerDBGetChunk(ref _m) => "StackerDBGetChunk",
970996
StacksMessageType::StackerDBChunk(ref _m) => "StackerDBChunk",
997+
StacksMessageType::StackerDBPushChunk(ref _m) => "StackerDBPushChunk",
971998
}
972999
}
9731000

@@ -1058,6 +1085,17 @@ impl StacksMessageType {
10581085
m.data.len()
10591086
)
10601087
}
1088+
StacksMessageType::StackerDBPushChunk(ref m) => {
1089+
format!(
1090+
"StackerDBPushChunk({},{},{},{},{},sz={})",
1091+
&m.contract_id,
1092+
&m.rc_consensus_hash,
1093+
m.chunk_data.slot_id,
1094+
m.chunk_data.slot_version,
1095+
&m.chunk_data.sig,
1096+
m.chunk_data.data.len()
1097+
)
1098+
}
10611099
}
10621100
}
10631101
}
@@ -1104,6 +1142,9 @@ impl StacksMessageCodec for StacksMessageID {
11041142
StacksMessageID::StackerDBGetChunk
11051143
}
11061144
x if x == StacksMessageID::StackerDBChunk as u8 => StacksMessageID::StackerDBChunk,
1145+
x if x == StacksMessageID::StackerDBPushChunk as u8 => {
1146+
StacksMessageID::StackerDBPushChunk
1147+
}
11071148
_ => {
11081149
return Err(codec_error::DeserializeError(
11091150
"Unknown message ID".to_string(),
@@ -1145,6 +1186,7 @@ impl StacksMessageCodec for StacksMessageType {
11451186
StacksMessageType::StackerDBChunkInv(ref m) => write_next(fd, m)?,
11461187
StacksMessageType::StackerDBGetChunk(ref m) => write_next(fd, m)?,
11471188
StacksMessageType::StackerDBChunk(ref m) => write_next(fd, m)?,
1189+
StacksMessageType::StackerDBPushChunk(ref m) => write_next(fd, m)?,
11481190
}
11491191
Ok(())
11501192
}
@@ -1243,6 +1285,10 @@ impl StacksMessageCodec for StacksMessageType {
12431285
let m: StackerDBChunkData = read_next(fd)?;
12441286
StacksMessageType::StackerDBChunk(m)
12451287
}
1288+
StacksMessageID::StackerDBPushChunk => {
1289+
let m: StackerDBPushChunkData = read_next(fd)?;
1290+
StacksMessageType::StackerDBPushChunk(m)
1291+
}
12461292
StacksMessageID::Reserved => {
12471293
return Err(codec_error::DeserializeError(
12481294
"Unsupported message ID 'reserved'".to_string(),
@@ -2215,6 +2261,7 @@ pub mod test {
22152261
fn codec_StackerDBChunkInvData() {
22162262
let data = StackerDBChunkInvData {
22172263
slot_versions: vec![0, 1, 2, 3],
2264+
num_outbound_replicas: 4,
22182265
};
22192266

22202267
let bytes = vec![
@@ -2223,7 +2270,8 @@ pub mod test {
22232270
0x00, 0x00, 0x00, 0x00, // 1u32
22242271
0x00, 0x00, 0x00, 0x01, // 2u32
22252272
0x00, 0x00, 0x00, 0x02, // 3u32
2226-
0x00, 0x00, 0x00, 0x03,
2273+
0x00, 0x00, 0x00, 0x03, // num_outbound_replicas
2274+
0x00, 0x00, 0x00, 0x04,
22272275
];
22282276

22292277
check_codec_and_corruption::<StackerDBChunkInvData>(&data, &bytes);
@@ -2280,6 +2328,45 @@ pub mod test {
22802328
check_codec_and_corruption::<StackerDBChunkData>(&data, &bytes);
22812329
}
22822330

2331+
#[test]
2332+
fn codec_StackerDBPushChunkData() {
2333+
let data = StackerDBChunkData {
2334+
slot_id: 2,
2335+
slot_version: 3,
2336+
sig: MessageSignature::from_raw(&vec![0x44; 65]),
2337+
data: vec![
2338+
0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
2339+
],
2340+
};
2341+
2342+
let push_data = StackerDBPushChunkData {
2343+
contract_id: ContractId::parse("SP8QPP8TVXYAXS1VFSERG978A6WKBF59NSYJQEMN.foo").unwrap(),
2344+
rc_consensus_hash: ConsensusHash([0x01; 20]),
2345+
chunk_data: data,
2346+
};
2347+
2348+
let bytes = vec![
2349+
// SP8QPP8TVXYAXS1VFSERG978A6WKBF59NSYJQEMN
2350+
0x16, 0x11, 0x7b, 0x59, 0x1a, 0xdf, 0x7c, 0xae, 0xe4, 0x3b, 0x7e, 0x5d, 0x88, 0x24,
2351+
0xe8, 0x51, 0xb9, 0x35, 0xbc, 0xa9, 0xae, // len(foo)
2352+
0x03, // foo
2353+
0x66, 0x6f, 0x6f, // rc consensus hash
2354+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
2355+
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // slot id
2356+
0x00, 0x00, 0x00, 0x02, // slot version
2357+
0x00, 0x00, 0x00, 0x03, // signature
2358+
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2359+
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2360+
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2361+
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
2362+
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, // length
2363+
0x00, 0x00, 0x00, 0x0b, // data
2364+
0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
2365+
];
2366+
2367+
check_codec_and_corruption::<StackerDBPushChunkData>(&push_data, &bytes);
2368+
}
2369+
22832370
#[test]
22842371
fn codec_StacksMessage() {
22852372
let payloads: Vec<StacksMessageType> = vec![
@@ -2429,6 +2516,7 @@ pub mod test {
24292516
}),
24302517
StacksMessageType::StackerDBChunkInv(StackerDBChunkInvData {
24312518
slot_versions: vec![0, 1, 2, 3],
2519+
num_outbound_replicas: 4,
24322520
}),
24332521
StacksMessageType::StackerDBGetChunk(StackerDBGetChunkData {
24342522
contract_id: ContractId::parse("SP8QPP8TVXYAXS1VFSERG978A6WKBF59NSYJQEMN.foo").unwrap(),
@@ -2442,6 +2530,16 @@ pub mod test {
24422530
sig: MessageSignature::from_raw(&vec![0x44; 65]),
24432531
data: vec![0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff]
24442532
}),
2533+
StacksMessageType::StackerDBPushChunk(StackerDBPushChunkData {
2534+
contract_id: ContractId::parse("SP8QPP8TVXYAXS1VFSERG978A6WKBF59NSYJQEMN.foo").unwrap(),
2535+
rc_consensus_hash: ConsensusHash([0x01; 20]),
2536+
chunk_data: StackerDBChunkData {
2537+
slot_id: 2,
2538+
slot_version: 3,
2539+
sig: MessageSignature::from_raw(&vec![0x44; 65]),
2540+
data: vec![0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff]
2541+
}
2542+
}),
24452543
];
24462544

24472545
let mut maximal_relayers: Vec<RelayData> = vec![];

stackslib/src/net/connection.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ pub struct ConnectionOptions {
399399
pub disable_inbound_walks: bool,
400400
pub disable_natpunch: bool,
401401
pub disable_inbound_handshakes: bool,
402+
pub disable_stackerdb_get_chunks: bool,
402403
pub force_disconnect_interval: Option<u64>,
403404
}
404405

@@ -487,6 +488,7 @@ impl std::default::Default for ConnectionOptions {
487488
disable_inbound_walks: false,
488489
disable_natpunch: false,
489490
disable_inbound_handshakes: false,
491+
disable_stackerdb_get_chunks: false,
490492
force_disconnect_interval: None,
491493
}
492494
}

stackslib/src/net/db.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ impl PeerDB {
734734
OpenFlags::SQLITE_OPEN_READ_ONLY
735735
};
736736

737-
let conn = sqlite_open(path, open_flags, false)?;
737+
let conn = sqlite_open(path, open_flags, true)?;
738738

739739
let db = PeerDB {
740740
conn: conn,
@@ -743,7 +743,28 @@ impl PeerDB {
743743
Ok(db)
744744
}
745745

746-
/// Open a burn database in memory (used for testing)
746+
/// Open an existing peer DB
747+
pub fn open(path: &str, readwrite: bool) -> Result<PeerDB, db_error> {
748+
if fs::metadata(path).is_err() {
749+
return Err(db_error::NoDBError);
750+
}
751+
752+
let open_flags = if readwrite {
753+
OpenFlags::SQLITE_OPEN_READ_WRITE
754+
} else {
755+
OpenFlags::SQLITE_OPEN_READ_ONLY
756+
};
757+
let conn = sqlite_open(path, open_flags, true)?;
758+
759+
let db = PeerDB {
760+
conn: conn,
761+
readwrite: readwrite,
762+
};
763+
764+
Ok(db)
765+
}
766+
767+
/// Open a peer database in memory (used for testing)
747768
#[cfg(test)]
748769
pub fn connect_memory(
749770
network_id: u32,

0 commit comments

Comments
 (0)