diff --git a/Rust/source/src/lib.rs b/Rust/source/src/lib.rs index 0924daedd96dbf27bbfd0daa2b7f7ab360a54d36..080215e965dcb5119faa62a61066798f7440edd4 100644 --- a/Rust/source/src/lib.rs +++ b/Rust/source/src/lib.rs @@ -1,4 +1,5 @@ mod yitgen; + use yitgen::gen::YitIdHelper; use yitgen::contract::*; @@ -8,6 +9,11 @@ pub extern "C" fn SetIdGenerator(options: IdGeneratorOptions) { YitIdHelper::SetIdGenerator(options); } +#[no_mangle] +pub extern "C" fn SetWorkerId(workerId: u32) { + YitIdHelper::SetWorkerId(workerId); +} + #[no_mangle] pub extern "C" fn NextId() -> i64 { YitIdHelper::NextId() diff --git a/Rust/source/src/yitgen/contract/id_generator_options.rs b/Rust/source/src/yitgen/contract/id_generator_options.rs index ab5a63409d9c99d1c7b8436b398cd20aef94a80e..f1905052f8b2721114c1765176f36fcd71ef6a36 100644 --- a/Rust/source/src/yitgen/contract/id_generator_options.rs +++ b/Rust/source/src/yitgen/contract/id_generator_options.rs @@ -16,7 +16,7 @@ pub struct IdGeneratorOptions { pub SeqBitLength: u8, /// 最大序列数(含),(由 SeqBitLength 计算的最大值) pub MaxSeqNumber: u32, - /// 最小序列数(含),默认5,不小于1,不大于 MaxSeqNumber + /// 最小序列数(含),默认5,不小于5,不大于 MaxSeqNumber pub MinSeqNumber: u32, /// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) pub TopOverCostCount: u32, diff --git a/Rust/source/src/yitgen/core/snow_worker_m1.rs b/Rust/source/src/yitgen/core/snow_worker_m1.rs index 0117f7fb90aa1d9a897d040fa8fe7a1810b5e4f6..7ed297ea5cbfb2dc770acbc2e7fc3b8c9c345150 100644 --- a/Rust/source/src/yitgen/core/snow_worker_m1.rs +++ b/Rust/source/src/yitgen/core/snow_worker_m1.rs @@ -89,10 +89,10 @@ impl SnowWorkerM1 { } // MinSeqNumber - if options.MinSeqNumber > maxSeqNumber { - panic!("MinSeqNumber error. (range:[1, {}]", maxSeqNumber); + if options.MinSeqNumber > maxSeqNumber || options.MinSeqNumber < 5 { + panic!("MinSeqNumber error. (range:[5, {}]", maxSeqNumber); } else { - self.MinSeqNumber = options.MinSeqNumber; + self.MinSeqNumber = if options.MinSeqNumber <= 0 { 5 } else { options.MinSeqNumber }; } self.TopOverCostCount = if options.TopOverCostCount == 0 { 2000 } else { options.TopOverCostCount }; diff --git a/Rust/source/src/yitgen/gen/yit_id_helper.rs b/Rust/source/src/yitgen/gen/yit_id_helper.rs index 19bd4030d5b53948b9313ebb468ab07d6336f5d5..ae1e5e7996c85fb8e4f6493de90fa0e5e0262387 100644 --- a/Rust/source/src/yitgen/gen/yit_id_helper.rs +++ b/Rust/source/src/yitgen/gen/yit_id_helper.rs @@ -13,7 +13,6 @@ pub struct YitIdHelper; static mut idGenInstance: Option>> = None; impl YitIdHelper { - fn IdGenInstance() -> Arc> { unsafe { idGenInstance.get_or_insert_with(|| { @@ -28,6 +27,13 @@ impl YitIdHelper { idgen.Worker.SetOptions(options); } + pub fn SetWorkerId(workerId: u32) { + let mut idgenArc = YitIdHelper::IdGenInstance(); + let mut idgen = idgenArc.lock().unwrap(); + let mut options = IdGeneratorOptions::New(workerId); + idgen.Worker.SetOptions(options); + } + pub fn NextId() -> i64 { let mut idgenArc = YitIdHelper::IdGenInstance(); let mut idgen = idgenArc.lock().unwrap();