|
|
@ -5,6 +5,8 @@ import (
|
|
|
|
"fmt"
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"log"
|
|
|
|
"net"
|
|
|
|
"net"
|
|
|
|
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
@ -51,6 +53,8 @@ type Service struct {
|
|
|
|
store Store
|
|
|
|
store Store
|
|
|
|
addr net.Addr
|
|
|
|
addr net.Addr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wg sync.WaitGroup
|
|
|
|
|
|
|
|
|
|
|
|
logger *log.Logger
|
|
|
|
logger *log.Logger
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -60,18 +64,22 @@ func NewService(ln Listener, store Store) *Service {
|
|
|
|
ln: ln,
|
|
|
|
ln: ln,
|
|
|
|
store: store,
|
|
|
|
store: store,
|
|
|
|
addr: ln.Addr(),
|
|
|
|
addr: ln.Addr(),
|
|
|
|
|
|
|
|
logger: log.New(os.Stderr, "[cluster] ", log.LstdFlags),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Open opens the Service.
|
|
|
|
// Open opens the Service.
|
|
|
|
func (s *Service) Open() error {
|
|
|
|
func (s *Service) Open() error {
|
|
|
|
|
|
|
|
s.wg.Add(1)
|
|
|
|
go s.serve()
|
|
|
|
go s.serve()
|
|
|
|
|
|
|
|
s.logger.Println("service listening on", s.ln.Addr())
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Close closes the service.
|
|
|
|
// Close closes the service.
|
|
|
|
func (s *Service) Close() error {
|
|
|
|
func (s *Service) Close() error {
|
|
|
|
s.ln.Close()
|
|
|
|
s.ln.Close()
|
|
|
|
|
|
|
|
s.wg.Wait()
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -124,6 +132,8 @@ func (s *Service) SetPeers(raftAddr, apiAddr string) error {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Service) serve() error {
|
|
|
|
func (s *Service) serve() error {
|
|
|
|
|
|
|
|
defer s.wg.Done()
|
|
|
|
|
|
|
|
|
|
|
|
for {
|
|
|
|
for {
|
|
|
|
conn, err := s.ln.Accept()
|
|
|
|
conn, err := s.ln.Accept()
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|