major refactor
This commit is contained in:
@@ -3,7 +3,6 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||
@@ -13,6 +12,25 @@ func (id CartId) String() string {
|
||||
return strings.Trim(string(id[:]), "\x00")
|
||||
}
|
||||
|
||||
type CartIdPayload struct {
|
||||
Id CartId
|
||||
Data []byte
|
||||
}
|
||||
|
||||
func MakeCartInnerFrame(id CartId, payload []byte) []byte {
|
||||
return append(id[:], payload...)
|
||||
}
|
||||
|
||||
func GetCartFrame(data []byte) (*CartIdPayload, error) {
|
||||
if len(data) < 16 {
|
||||
return nil, fmt.Errorf("data too short")
|
||||
}
|
||||
return &CartIdPayload{
|
||||
Id: CartId(data[:16]),
|
||||
Data: data[16:],
|
||||
}, nil
|
||||
}
|
||||
|
||||
func ToCartId(id string) CartId {
|
||||
var result [16]byte
|
||||
copy(result[:], []byte(id))
|
||||
@@ -20,21 +38,16 @@ func ToCartId(id string) CartId {
|
||||
}
|
||||
|
||||
type RemoteGrain struct {
|
||||
*CartClient
|
||||
*Connection
|
||||
Id CartId
|
||||
Host string
|
||||
}
|
||||
|
||||
func NewRemoteGrain(id CartId, host string) (*RemoteGrain, error) {
|
||||
client, err := CartDial(fmt.Sprintf("%s:1337", host))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &RemoteGrain{
|
||||
Id: id,
|
||||
Host: host,
|
||||
CartClient: client,
|
||||
Connection: NewConnection(fmt.Sprintf("%s:1337", host)),
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -49,47 +62,35 @@ var (
|
||||
})
|
||||
)
|
||||
|
||||
var start time.Time
|
||||
// var start time.Time
|
||||
|
||||
func MeasureLatency(fn func() (*CallResult, error)) (*CallResult, error) {
|
||||
start = time.Now()
|
||||
data, err := fn()
|
||||
if err != nil {
|
||||
return data, err
|
||||
}
|
||||
elapsed := time.Since(start).Milliseconds()
|
||||
go func() {
|
||||
remoteCartLatency.Add(float64(elapsed))
|
||||
remoteCartCallsTotal.Inc()
|
||||
}()
|
||||
return data, nil
|
||||
}
|
||||
// func MeasureLatency(fn func() (*CallResult, error)) (*CallResult, error) {
|
||||
// start = time.Now()
|
||||
// data, err := fn()
|
||||
// if err != nil {
|
||||
// return data, err
|
||||
// }
|
||||
// elapsed := time.Since(start).Milliseconds()
|
||||
// go func() {
|
||||
// remoteCartLatency.Add(float64(elapsed))
|
||||
// remoteCartCallsTotal.Inc()
|
||||
// }()
|
||||
// return data, nil
|
||||
// }
|
||||
|
||||
func (g *RemoteGrain) HandleMessage(message *Message, isReplay bool) (*CallResult, error) {
|
||||
func (g *RemoteGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPayload, error) {
|
||||
|
||||
data, err := GetData(message.Write)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
reply, err := MeasureLatency(func() (*CallResult, error) {
|
||||
return g.Call(RemoteHandleMutation, g.Id, RemoteHandleMutationReply, data)
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return reply, err
|
||||
}
|
||||
|
||||
func (g *RemoteGrain) Close() {
|
||||
g.CartClient.PersistentConnection.Close()
|
||||
return g.Call(RemoteHandleMutation, MakeCartInnerFrame(g.Id, data))
|
||||
}
|
||||
|
||||
func (g *RemoteGrain) GetId() CartId {
|
||||
return g.Id
|
||||
}
|
||||
|
||||
func (g *RemoteGrain) GetCurrentState() (*CallResult, error) {
|
||||
return MeasureLatency(func() (*CallResult, error) { return g.Call(RemoteGetState, g.Id, RemoteGetStateReply, []byte{}) })
|
||||
func (g *RemoteGrain) GetCurrentState() (*FrameWithPayload, error) {
|
||||
return g.Call(RemoteGetState, MakeCartInnerFrame(g.Id, nil))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user