mirror of
https://github.com/fumiama/go-registry.git
synced 2026-06-29 23:30:35 +08:00
同步时序
This commit is contained in:
39
reg.go
39
reg.go
@@ -4,6 +4,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
tea "github.com/fumiama/gofastTEA"
|
tea "github.com/fumiama/gofastTEA"
|
||||||
@@ -21,11 +22,13 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Regedit struct {
|
type Regedit struct {
|
||||||
|
sync.Mutex
|
||||||
conn net.Conn
|
conn net.Conn
|
||||||
addr string
|
addr string
|
||||||
tp tea.TEA
|
tp tea.TEA
|
||||||
ts *tea.TEA
|
ts *tea.TEA
|
||||||
seq byte
|
seq byte
|
||||||
|
isopen bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRegedit(addr, pwd, sps string) *Regedit {
|
func NewRegedit(addr, pwd, sps string) *Regedit {
|
||||||
@@ -52,21 +55,37 @@ func NewRegReader(addr, pwd string) *Regedit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *Regedit) Connect() (err error) {
|
func (r *Regedit) Connect() (err error) {
|
||||||
|
r.Lock()
|
||||||
r.conn, err = net.Dial("tcp", r.addr)
|
r.conn, err = net.Dial("tcp", r.addr)
|
||||||
|
if err != nil {
|
||||||
|
r.isopen = true
|
||||||
|
}
|
||||||
|
r.Unlock()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Regedit) ConnectIn(wait time.Duration) (err error) {
|
func (r *Regedit) ConnectIn(wait time.Duration) (err error) {
|
||||||
|
r.Lock()
|
||||||
r.conn, err = net.DialTimeout("tcp", r.addr, wait)
|
r.conn, err = net.DialTimeout("tcp", r.addr, wait)
|
||||||
|
if err != nil {
|
||||||
|
r.isopen = true
|
||||||
|
}
|
||||||
|
r.Unlock()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Regedit) Close() (err error) {
|
func (r *Regedit) Close() (err error) {
|
||||||
|
r.Lock()
|
||||||
|
defer r.Unlock()
|
||||||
|
if r.isopen {
|
||||||
p := NewCmdPacket(CMDEND, []byte("fill"), &r.tp)
|
p := NewCmdPacket(CMDEND, []byte("fill"), &r.tp)
|
||||||
r.conn.Write(p.Encrypt(r.seq))
|
r.conn.Write(p.Encrypt(r.seq))
|
||||||
p.Put()
|
p.Put()
|
||||||
r.seq = 0
|
r.seq = 0
|
||||||
|
r.isopen = false
|
||||||
return r.conn.Close()
|
return r.conn.Close()
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Regedit) Get(key string) (string, error) {
|
func (r *Regedit) Get(key string) (string, error) {
|
||||||
@@ -75,18 +94,21 @@ func (r *Regedit) Get(key string) (string, error) {
|
|||||||
}
|
}
|
||||||
p := NewCmdPacket(CMDGET, StringToBytes(key), &r.tp)
|
p := NewCmdPacket(CMDGET, StringToBytes(key), &r.tp)
|
||||||
defer p.Put()
|
defer p.Put()
|
||||||
|
r.Lock()
|
||||||
r.conn.Write(p.Encrypt(r.seq))
|
r.conn.Write(p.Encrypt(r.seq))
|
||||||
r.seq++
|
r.seq++
|
||||||
err := r.ack(p)
|
err := r.ack(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
r.Unlock()
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
err = p.Decrypt(r.seq)
|
err = p.Decrypt(r.seq)
|
||||||
|
r.seq++
|
||||||
|
r.Unlock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", ErrDecAck
|
return "", ErrDecAck
|
||||||
}
|
}
|
||||||
a := string(p.data)
|
a := string(p.data)
|
||||||
r.seq++
|
|
||||||
if a == "erro" {
|
if a == "erro" {
|
||||||
return "", ErrInternalServer
|
return "", ErrInternalServer
|
||||||
}
|
}
|
||||||
@@ -108,20 +130,23 @@ func (r *Regedit) Set(key, value string) error {
|
|||||||
}
|
}
|
||||||
p := NewCmdPacket(CMDSET, StringToBytes(key), r.ts)
|
p := NewCmdPacket(CMDSET, StringToBytes(key), r.ts)
|
||||||
defer p.Put()
|
defer p.Put()
|
||||||
|
r.Lock()
|
||||||
r.conn.Write(p.Encrypt(r.seq))
|
r.conn.Write(p.Encrypt(r.seq))
|
||||||
r.seq++
|
r.seq++
|
||||||
ack := NewCmdPacket(CMDACK, nil, &r.tp)
|
ack := NewCmdPacket(CMDACK, nil, &r.tp)
|
||||||
defer ack.Put()
|
defer ack.Put()
|
||||||
err := r.ack(ack)
|
err := r.ack(ack)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
r.Unlock()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = ack.Decrypt(r.seq)
|
err = ack.Decrypt(r.seq)
|
||||||
|
r.seq++
|
||||||
|
r.Unlock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrDecAck
|
return ErrDecAck
|
||||||
}
|
}
|
||||||
a := BytesToString(ack.data)
|
a := BytesToString(ack.data)
|
||||||
r.seq++
|
|
||||||
if a == "erro" {
|
if a == "erro" {
|
||||||
return ErrInternalServer
|
return ErrInternalServer
|
||||||
}
|
}
|
||||||
@@ -129,18 +154,21 @@ func (r *Regedit) Set(key, value string) error {
|
|||||||
return ErrUnknownAck
|
return ErrUnknownAck
|
||||||
}
|
}
|
||||||
p.Refresh(CMDDAT, StringToBytes(value), r.ts)
|
p.Refresh(CMDDAT, StringToBytes(value), r.ts)
|
||||||
|
r.Lock()
|
||||||
r.conn.Write(p.Encrypt(r.seq))
|
r.conn.Write(p.Encrypt(r.seq))
|
||||||
r.seq++
|
r.seq++
|
||||||
err = r.ack(ack)
|
err = r.ack(ack)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
r.Unlock()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = ack.Decrypt(r.seq)
|
err = ack.Decrypt(r.seq)
|
||||||
|
r.seq++
|
||||||
|
r.Unlock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrDecAck
|
return ErrDecAck
|
||||||
}
|
}
|
||||||
a = BytesToString(ack.data)
|
a = BytesToString(ack.data)
|
||||||
r.seq++
|
|
||||||
if a == "erro" {
|
if a == "erro" {
|
||||||
return ErrInternalServer
|
return ErrInternalServer
|
||||||
}
|
}
|
||||||
@@ -159,20 +187,23 @@ func (r *Regedit) Del(key string) error {
|
|||||||
}
|
}
|
||||||
p := NewCmdPacket(CMDDEL, StringToBytes(key), r.ts)
|
p := NewCmdPacket(CMDDEL, StringToBytes(key), r.ts)
|
||||||
defer p.Put()
|
defer p.Put()
|
||||||
|
r.Lock()
|
||||||
r.conn.Write(p.Encrypt(r.seq))
|
r.conn.Write(p.Encrypt(r.seq))
|
||||||
r.seq++
|
r.seq++
|
||||||
ack := NewCmdPacket(CMDACK, nil, &r.tp)
|
ack := NewCmdPacket(CMDACK, nil, &r.tp)
|
||||||
defer ack.Put()
|
defer ack.Put()
|
||||||
err := r.ack(ack)
|
err := r.ack(ack)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
r.Unlock()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = ack.Decrypt(r.seq)
|
err = ack.Decrypt(r.seq)
|
||||||
|
r.seq++
|
||||||
|
r.Unlock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrDecAck
|
return ErrDecAck
|
||||||
}
|
}
|
||||||
a := BytesToString(ack.data)
|
a := BytesToString(ack.data)
|
||||||
r.seq++
|
|
||||||
if a == "erro" {
|
if a == "erro" {
|
||||||
return ErrInternalServer
|
return ErrInternalServer
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user