Hochwasser/rpc/dottir.go

66 lines
1.4 KiB
Go
Raw Normal View History

package rpc
import (
"fmt"
2020-02-12 11:20:15 +01:00
"image"
"log"
2020-02-11 14:46:58 +01:00
"net"
"net/rpc"
2020-02-12 11:20:15 +01:00
"time"
2020-02-12 11:20:15 +01:00
"github.com/SpeckiJ/Hochwasser/pixelflut"
)
2020-02-11 14:46:58 +01:00
func ConnectHevring(ránAddress string) {
2020-02-11 14:46:58 +01:00
rpc.Register(new(Hevring))
2020-02-11 14:46:58 +01:00
fmt.Printf("[hevring] greeting Rán at %s\n", ránAddress)
conn, err := net.Dial("tcp", ránAddress)
if err != nil {
log.Fatal(err)
}
2020-02-11 14:46:58 +01:00
go rpc.ServeConn(conn)
fmt.Printf("[hevring] awaiting task from Rán\n")
}
2020-02-12 11:20:15 +01:00
type Hevring struct{}
type FlutTask struct {
Address string
MaxConns int
Img *image.NRGBA // bug :imageType: should be image.Image, but can't be serialized. do conversion in task creation?
Offset image.Point
Shuffle bool
}
2020-02-11 14:46:58 +01:00
type FlutAck struct{ Ok bool }
2020-02-12 11:20:15 +01:00
func (h *Hevring) Flut(task FlutTask, reply *FlutAck) error {
// @incomplete: async errorhandling
// @incomplete: stop old task if new task is received
fmt.Printf("[hevring] Rán gave us /w o r k/! %v\n", task)
pixelflut.Flut(task.Img, task.Offset, task.Shuffle, task.Address, task.MaxConns)
2020-02-11 14:46:58 +01:00
reply.Ok = true
return nil
}
func (h *Hevring) Status(x int, reply *FlutAck) error {
2020-02-12 11:20:15 +01:00
// @incomplete: provide performance metrics
2020-02-11 14:46:58 +01:00
reply.Ok = true
return nil
}
func (h *Hevring) Stop(x int, reply *FlutAck) error {
reply.Ok = true
return nil
}
2020-02-12 11:20:15 +01:00
func (h *Hevring) Die(x int, reply *FlutAck) error {
go func() { // @cleanup: hacky
time.Sleep(100 * time.Millisecond)
log.Fatal("[hevring] Rán disconnected, stopping")
}()
reply.Ok = true
return nil
}