aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2021-07-23 20:54:03 -0700
committerChris Lu <chris.lu@gmail.com>2021-07-23 20:54:03 -0700
commitac286118176f757e039df9e0349f132be0b126bf (patch)
treeffb8d1b7d9452ecc54b12220585a3153dd0c9f9e
parent5c14da0f1efbd835e076433c0b7f1a80aebf61c2 (diff)
downloadseaweedfs-ac286118176f757e039df9e0349f132be0b126bf.tar.xz
seaweedfs-ac286118176f757e039df9e0349f132be0b126bf.zip
snowflake sequencer need an unique id
fix https://github.com/chrislusf/seaweedfs/issues/2213
-rw-r--r--weed/command/scaffold/master.toml2
-rw-r--r--weed/sequence/snowflake_sequencer.go5
-rw-r--r--weed/server/master_server.go4
3 files changed, 9 insertions, 2 deletions
diff --git a/weed/command/scaffold/master.toml b/weed/command/scaffold/master.toml
index f550f0ad6..60a7dbcfc 100644
--- a/weed/command/scaffold/master.toml
+++ b/weed/command/scaffold/master.toml
@@ -26,6 +26,8 @@ type = "raft" # Choose [raft|etcd|snowflake] type for storing the file id se
# when sequencer.type = etcd, set listen client urls of etcd cluster that store file id sequence
# example : http://127.0.0.1:2379,http://127.0.0.1:2389
sequencer_etcd_urls = "http://127.0.0.1:2379"
+# when sequencer.type = snowflake, the snowflake id must be different from other masters
+sequencer_snowflake_id = 0 # any number between 1~1023
# configurations for tiered cloud storage
diff --git a/weed/sequence/snowflake_sequencer.go b/weed/sequence/snowflake_sequencer.go
index 300449fa0..381933b3a 100644
--- a/weed/sequence/snowflake_sequencer.go
+++ b/weed/sequence/snowflake_sequencer.go
@@ -13,8 +13,11 @@ type SnowflakeSequencer struct {
node *snowflake.Node
}
-func NewSnowflakeSequencer(nodeid string) (*SnowflakeSequencer, error) {
+func NewSnowflakeSequencer(nodeid string, snowflakeId int) (*SnowflakeSequencer, error) {
nodeid_hash := hash(nodeid) & 0x3ff
+ if snowflakeId != 0 {
+ nodeid_hash = uint32(snowflakeId)
+ }
glog.V(0).Infof("use snowflake seq id generator, nodeid:%s hex_of_nodeid: %x", nodeid, nodeid_hash)
node, err := snowflake.NewNode(int64(nodeid_hash))
if err != nil {
diff --git a/weed/server/master_server.go b/weed/server/master_server.go
index 11dc95ded..9d222a342 100644
--- a/weed/server/master_server.go
+++ b/weed/server/master_server.go
@@ -28,6 +28,7 @@ import (
const (
SequencerType = "master.sequencer.type"
SequencerEtcdUrls = "master.sequencer.sequencer_etcd_urls"
+ SequencerSnowflakeId = "master.sequencer.sequencer_snowflake_id"
)
type MasterOption struct {
@@ -293,7 +294,8 @@ func (ms *MasterServer) createSequencer(option *MasterOption) sequence.Sequencer
}
case "snowflake":
var err error
- seq, err = sequence.NewSnowflakeSequencer(fmt.Sprintf("%s:%d", option.Host, option.Port))
+ snowflakeId := v.GetInt(SequencerSnowflakeId)
+ seq, err = sequence.NewSnowflakeSequencer(fmt.Sprintf("%s:%d", option.Host, option.Port), snowflakeId)
if err != nil {
glog.Error(err)
seq = nil