1
0
mirror of https://github.com/fumiama/go-registry.git synced 2026-06-29 23:30:35 +08:00

同步时序

This commit is contained in:
源文雨
2022-03-07 14:24:43 +08:00
parent b11591d030
commit 5fd402268a

39
reg.go
View File

@@ -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
} }