Documentation ¶
Index ¶
- Variables
- type NodeInfo
- func (m *NodeInfo) AddSlaveNode(n *NodeInfo) (bool, error)
- func (m *NodeInfo) AfterDelete(tx *gorm.DB) (err error)
- func (m *NodeInfo) CommitSelfAsMasterNode() (bool, error)
- func (m *NodeInfo) GetAllSlaveNodes() (*[]NodeInfo, error)
- func (m *NodeInfo) GetLogActiveLatest() (*NodeLog.NodeLog, error)
- func (m *NodeInfo) GetLogMasterReportSlaveInactive(targetID uint64) (*NodeLog.NodeLog, error)
- func (m *NodeInfo) GetLogSlaveReportMasterInactive(targetID uint64) (*NodeLog.NodeLog, error)
- func (m *NodeInfo) GetNodeBySocket() (*NodeInfo, error)
- func (m *NodeInfo) GetSuperiorNode(specifySuperior bool) (*NodeInfo, error)
- func (m *NodeInfo) HandoverMasterNode(candidate *NodeInfo) error
- func (m *NodeInfo) IsEqual(target *NodeInfo) error
- func (m *NodeInfo) IsEqualToRegistered(target *models.RegisteredNodeInfo) error
- func (m *NodeInfo) IsSocketEqual(target *NodeInfo) bool
- func (m *NodeInfo) IsSocketEqualToRegistered(target *models.RegisteredNodeInfo) bool
- func (m *NodeInfo) IsSubordinate(slave *NodeInfo) bool
- func (m *NodeInfo) IsSuperior(master *NodeInfo) bool
- func (m *NodeInfo) Log() string
- func (m *NodeInfo) LogActiveLatest() func(db *gorm.DB) *gorm.DB
- func (m *NodeInfo) LogMasterReportSlaveInactiveLatest(targetID uint64) func(db *gorm.DB) *gorm.DB
- func (m *NodeInfo) LogReportActive() (int64, error)
- func (m *NodeInfo) LogReportExistedMasterWithdrawn() (int64, error)
- func (m *NodeInfo) LogReportExistedNodeMasterDetectedSlaveInactive(id uint64, retry uint8) (int64, error)
- func (m *NodeInfo) LogReportExistedNodeMasterReportSlaveInactive(slave *NodeInfo) (int64, error)
- func (m *NodeInfo) LogReportExistedNodeSlaveReportMasterInactive(master *NodeInfo) (int64, error)
- func (m *NodeInfo) LogReportExistedSlaveWithdrawn(existed *NodeInfo) (int64, error)
- func (m *NodeInfo) LogReportFreshMasterJoined() (int64, error)
- func (m *NodeInfo) LogReportFreshSlaveJoined(fresh *NodeInfo) (int64, error)
- func (m *NodeInfo) LogSlaveReportMasterInactiveLatest(targetID uint64) func(db *gorm.DB) *gorm.DB
- func (m *NodeInfo) NewNodeLog(logType uint8, target uint64) *NodeLog.NodeLog
- func (m *NodeInfo) Refresh() error
- func (m *NodeInfo) RemoveSelf() (bool, error)
- func (m *NodeInfo) RemoveSlaveNode(slave *NodeInfo) (bool, error)
- func (m *NodeInfo) ScopeSocket() func(db *gorm.DB) *gorm.DB
- func (m *NodeInfo) Socket() string
- func (m *NodeInfo) Subordinate() func(db *gorm.DB) *gorm.DB
- func (m *NodeInfo) Superior() func(db *gorm.DB) *gorm.DB
- func (m *NodeInfo) SupersedeMasterNode(master *NodeInfo) error
- func (m *NodeInfo) TableName() string
- func (m *NodeInfo) ToFreshNodeInfo() *models.FreshNodeInfo
- func (m *NodeInfo) ToRegisteredNodeInfo() *models.RegisteredNodeInfo
Constants ¶
This section is empty.
Variables ¶
var ErrMasterNodeIsNotSuperior = errors.New("the specified master node is not my superior")
var ErrModelInvalid = errors.New("slave not invalid")
ErrModelInvalid 表示删除出错。 TODO: 此为暂定名。
var ErrNodeDatabaseError = errors.New("node database error") // TODO: 具体错误信息待完善。
var ErrNodeIsNotEqualBecauseOfDifferentID = errors.New("the two are not equal because of their different ID")
var ErrNodeIsNotEqualBecauseOfLevelAndTurn = errors.New("the two are not equal because of their different level and turn")
var ErrNodeIsNotEqualBecauseOfNil = errors.New("at least one of the two is empty")
var ErrNodeIsNotEqualBecauseOfSocket = errors.New("the two are not equal because of their different socket")
var ErrNodeSuperiorNotExist = errors.New("superior node not exist")
var ErrSlaveNodeIsNotSubordinate = errors.New("the specified slave node is not my subordinate")
Functions ¶
This section is empty.
Types ¶
type NodeInfo ¶
type NodeInfo struct { ID uint64 `gorm:"column:id;primaryKey;autoIncrement;<-:false" json:"id"` Name string `gorm:"column:name;default:''" json:"name"` NodeVersion string `gorm:"column:node_version;default:'';<-:create" json:"node_version"` Host string `gorm:"column:host;<-:create" json:"Host"` Port uint16 `gorm:"column:port;<-:create" json:"Port"` Level uint8 `gorm:"column:level" json:"Level"` SuperiorID uint64 `gorm:"column:superior_id" json:"superior_id"` Turn uint32 `gorm:"column:turn" json:"turn"` CreatedAt time.Time `gorm:"column:created_at;autoCreateTime:milli" json:"created_at"` UpdatedAt time.Time `gorm:"column:updated_at;autoUpdateTime:milli" json:"updated_at"` Version optimisticlock.Version `gorm:"column:version;default:0" json:"version"` }
func GetNodeInfo ¶
GetNodeInfo 根据指定ID获取NodeInfo记录。若指定ID的记录不存在,则报 gorm.ErrRecordNotFound。
func NewNodeInfo ¶
NewNodeInfo creates a new NodeInfo instance.
func (*NodeInfo) AddSlaveNode ¶
AddSlaveNode 添加从节点信息到数据库。 从节点的上级节点为当前节点。 从节点的 Level 为当前节点 + 1。 从节点的 Turn 为当前所有节点最大 Turn + 1。如果没有从节点,则默认为 1。
func (*NodeInfo) AfterDelete ¶
AfterDelete NodeInfo 删除后将最后一刻数据移入 models.NodeInfoLegacy 中。 TODO: 1. 插入操作出错是否报错。若报错,则会阻断删除。若不报错,则会掩盖 models.NodeInfoLegacy 异常。
func (*NodeInfo) CommitSelfAsMasterNode ¶
func (*NodeInfo) GetAllSlaveNodes ¶
GetAllSlaveNodes 获取当前节点的所有从节点。
func (*NodeInfo) GetLogActiveLatest ¶
func (*NodeInfo) GetLogMasterReportSlaveInactive ¶
func (*NodeInfo) GetLogSlaveReportMasterInactive ¶
func (*NodeInfo) GetNodeBySocket ¶
func (*NodeInfo) GetSuperiorNode ¶
GetSuperiorNode 获得当前级别的上级节点。如果要指定上级,则 specifySuperior = true。 如果为发现上级阶段,则不指定上级。如果为检查上级,则需要指定。 如果已经是最高级,则报 ErrNodeLevelAlreadyHighest。 如果查询数据库不存在上级节点,则报 ErrNodeSuperiorNotExist。其它数据库错误则报 ErrNodeDatabaseError。
func (*NodeInfo) HandoverMasterNode ¶
HandoverMasterNode 主节点主动通知候选节点接替自己。
此方法涉及到一系列数据库操作,需要在事务中进行。其中某次数据库操作报错,所有之前的操作都将会滚。
步骤如下:
1. 查询 candidate 对应的 ID、Host、Port、Level 是否与数据表内一致。如果不一致,则报 gorm.ErrRecordNotFound。如果不是自己的直接下属,则报 ErrSlaveNodeIsNotSubordinate。
2. 删除 master 记录。如果查询记录已不存在,则不会报错。
3. 修改 candidate 的记录:level -=1,candidate.SuperiorID = master.SuperiorID,candidate.Turn = master.Turn。
4. 修改其它节点的 SuperiorID 为自己。
func (*NodeInfo) IsEqualToRegistered ¶
func (m *NodeInfo) IsEqualToRegistered(target *models.RegisteredNodeInfo) error
func (*NodeInfo) IsSocketEqual ¶
IsSocketEqual determine whether the sockets of two nodes are equal.
func (*NodeInfo) IsSocketEqualToRegistered ¶
func (m *NodeInfo) IsSocketEqualToRegistered(target *models.RegisteredNodeInfo) bool
func (*NodeInfo) IsSubordinate ¶
func (*NodeInfo) IsSuperior ¶
func (*NodeInfo) LogActiveLatest ¶
LogActiveLatest 附加当前节点报告活跃日志,按最后更新时间倒序排序。
func (*NodeInfo) LogMasterReportSlaveInactiveLatest ¶
func (*NodeInfo) LogReportActive ¶
func (*NodeInfo) LogReportExistedMasterWithdrawn ¶
func (*NodeInfo) LogReportExistedNodeMasterDetectedSlaveInactive ¶
func (*NodeInfo) LogReportExistedNodeMasterReportSlaveInactive ¶
func (*NodeInfo) LogReportExistedNodeSlaveReportMasterInactive ¶
func (*NodeInfo) LogReportExistedSlaveWithdrawn ¶
func (*NodeInfo) LogReportFreshMasterJoined ¶
func (*NodeInfo) LogReportFreshSlaveJoined ¶
func (*NodeInfo) LogSlaveReportMasterInactiveLatest ¶
func (*NodeInfo) NewNodeLog ¶
func (*NodeInfo) RemoveSlaveNode ¶
func (*NodeInfo) Subordinate ¶
Subordinate 附加当前节点的下级条件。
func (*NodeInfo) SupersedeMasterNode ¶
SupersedeMasterNode 主节点异常时从节点尝试接替。
此方法涉及到一系列数据库操作,需要在事务中进行。其中某次数据库操作报错,所有之前的操作都将会滚。
步骤如下:
1. 查询 master 对应的 ID、Host、Port、Level 是否与数据表内一致。如果不一致,则报错。
2. 记录 master 的ID、SuperiorID和turn,然后删除 master 记录
3. 修改自己的记录:level -=1,m.SuperiorID = master.SuperiorID,m.Turn = master.Turn。
4. 修改其它节点的 SuperiorID 为自己。
func (*NodeInfo) ToFreshNodeInfo ¶
func (m *NodeInfo) ToFreshNodeInfo() *models.FreshNodeInfo
func (*NodeInfo) ToRegisteredNodeInfo ¶
func (m *NodeInfo) ToRegisteredNodeInfo() *models.RegisteredNodeInfo