better error handling
All checks were successful
Build and Publish / BuildAndDeploy (push) Successful in 1m48s

This commit is contained in:
matst80
2024-11-10 19:00:19 +01:00
parent 5aeea62bad
commit b8f964b4ff

View File

@@ -1,7 +1,6 @@
package main package main
import ( import (
"fmt"
"strings" "strings"
"sync" "sync"
) )
@@ -28,17 +27,17 @@ type RemoteGrain struct {
Address string Address string
} }
func NewRemoteGrain(id CartId, address string) *RemoteGrain { func NewRemoteGrain(id CartId, address string) (*RemoteGrain, error) {
client, err := CartDial(address) client, err := CartDial(address)
if err != nil { if err != nil {
return nil return nil, err
} }
return &RemoteGrain{ return &RemoteGrain{
Id: id, Id: id,
Address: address, Address: address,
CartClient: client, CartClient: client,
} }, nil
} }
func (g *RemoteGrain) HandleMessage(message *Message, isReplay bool) ([]byte, error) { func (g *RemoteGrain) HandleMessage(message *Message, isReplay bool) ([]byte, error) {
@@ -81,16 +80,19 @@ func (p *RemoteGrainPool) findRemoteGrain(id CartId) *RemoteGrain {
return grain return grain
} }
func (p *RemoteGrainPool) findOrCreateGrain(id CartId) *RemoteGrain { func (p *RemoteGrainPool) findOrCreateGrain(id CartId) (*RemoteGrain, error) {
grain := p.findRemoteGrain(id) grain := p.findRemoteGrain(id)
if grain == nil {
grain = NewRemoteGrain(id, p.Host)
if grain == nil {
grain, err := NewRemoteGrain(id, p.Host)
if err != nil {
return nil, err
}
p.mu.Lock() p.mu.Lock()
p.grains[id] = grain p.grains[id] = grain
p.mu.Unlock() p.mu.Unlock()
} }
return grain return grain, nil
} }
func (p *RemoteGrainPool) Delete(id CartId) { func (p *RemoteGrainPool) Delete(id CartId) {
@@ -101,10 +103,9 @@ func (p *RemoteGrainPool) Delete(id CartId) {
func (p *RemoteGrainPool) Process(id CartId, messages ...Message) ([]byte, error) { func (p *RemoteGrainPool) Process(id CartId, messages ...Message) ([]byte, error) {
var result []byte var result []byte
var err error grain, err := p.findOrCreateGrain(id)
grain := p.findOrCreateGrain(id) if err != nil {
if grain == nil { return nil, err
return nil, fmt.Errorf("grain not found")
} }
for _, message := range messages { for _, message := range messages {
result, err = grain.HandleMessage(&message, false) result, err = grain.HandleMessage(&message, false)
@@ -113,9 +114,9 @@ func (p *RemoteGrainPool) Process(id CartId, messages ...Message) ([]byte, error
} }
func (p *RemoteGrainPool) Get(id CartId) ([]byte, error) { func (p *RemoteGrainPool) Get(id CartId) ([]byte, error) {
grain := p.findOrCreateGrain(id) grain, err := p.findOrCreateGrain(id)
if grain == nil { if err != nil {
return nil, fmt.Errorf("grain not found") return nil, err
} }
return grain.GetCurrentState() return grain.GetCurrentState()
} }