Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

swarm: Reinstate Pss Protocol add call through swarm service #19117

Merged
merged 2 commits into from
Feb 18, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 56 additions & 51 deletions swarm/swarm.go
Original file line number Diff line number Diff line change
Expand Up @@ -344,51 +344,51 @@ Start is called when the stack is started
* TODO: start subservices like sword, swear, swarmdns
*/
// implements the node.Service interface
func (self *Swarm) Start(srv *p2p.Server) error {
func (s *Swarm) Start(srv *p2p.Server) error {
startTime := time.Now()

self.tracerClose = tracing.Closer
s.tracerClose = tracing.Closer

// update uaddr to correct enode
newaddr := self.bzz.UpdateLocalAddr([]byte(srv.Self().String()))
newaddr := s.bzz.UpdateLocalAddr([]byte(srv.Self().String()))
log.Info("Updated bzz local addr", "oaddr", fmt.Sprintf("%x", newaddr.OAddr), "uaddr", fmt.Sprintf("%s", newaddr.UAddr))
// set chequebook
//TODO: Currently if swap is enabled and no chequebook (or inexistent) contract is provided, the node would crash.
//Once we integrate back the contracts, this check MUST be revisited
if self.config.SwapEnabled && self.config.SwapAPI != "" {
if s.config.SwapEnabled && s.config.SwapAPI != "" {
ctx := context.Background() // The initial setup has no deadline.
err := self.SetChequebook(ctx)
err := s.SetChequebook(ctx)
if err != nil {
return fmt.Errorf("Unable to set chequebook for SWAP: %v", err)
}
log.Debug(fmt.Sprintf("-> cheque book for SWAP: %v", self.config.Swap.Chequebook()))
log.Debug(fmt.Sprintf("-> cheque book for SWAP: %v", s.config.Swap.Chequebook()))
} else {
log.Debug(fmt.Sprintf("SWAP disabled: no cheque book set"))
}

log.Info("Starting bzz service")

err := self.bzz.Start(srv)
err := s.bzz.Start(srv)
if err != nil {
log.Error("bzz failed", "err", err)
return err
}
log.Info("Swarm network started", "bzzaddr", fmt.Sprintf("%x", self.bzz.Hive.BaseAddr()))
log.Info("Swarm network started", "bzzaddr", fmt.Sprintf("%x", s.bzz.Hive.BaseAddr()))

if self.ps != nil {
self.ps.Start(srv)
if s.ps != nil {
s.ps.Start(srv)
}

// start swarm http proxy server
if self.config.Port != "" {
addr := net.JoinHostPort(self.config.ListenAddr, self.config.Port)
server := httpapi.NewServer(self.api, self.config.Cors)
if s.config.Port != "" {
addr := net.JoinHostPort(s.config.ListenAddr, s.config.Port)
server := httpapi.NewServer(s.api, s.config.Cors)

if self.config.Cors != "" {
log.Debug("Swarm HTTP proxy CORS headers", "allowedOrigins", self.config.Cors)
if s.config.Cors != "" {
log.Debug("Swarm HTTP proxy CORS headers", "allowedOrigins", s.config.Cors)
}

log.Debug("Starting Swarm HTTP proxy", "port", self.config.Port)
log.Debug("Starting Swarm HTTP proxy", "port", s.config.Port)
go func() {
err := server.ListenAndServe(addr)
if err != nil {
Expand All @@ -399,7 +399,7 @@ func (self *Swarm) Start(srv *p2p.Server) error {

doneC := make(chan struct{})

self.cleanupFuncs = append(self.cleanupFuncs, func() error {
s.cleanupFuncs = append(s.cleanupFuncs, func() error {
close(doneC)
return nil
})
Expand All @@ -409,54 +409,54 @@ func (self *Swarm) Start(srv *p2p.Server) error {
select {
case <-time.After(updateGaugesPeriod):
uptimeGauge.Update(time.Since(startTime).Nanoseconds())
requestsCacheGauge.Update(int64(self.netStore.RequestsCacheLen()))
requestsCacheGauge.Update(int64(s.netStore.RequestsCacheLen()))
case <-doneC:
return
}
}
}(startTime)

startCounter.Inc(1)
self.streamer.Start(srv)
s.streamer.Start(srv)
return nil
}

// implements the node.Service interface
// stops all component services.
func (self *Swarm) Stop() error {
if self.tracerClose != nil {
err := self.tracerClose.Close()
func (s *Swarm) Stop() error {
if s.tracerClose != nil {
err := s.tracerClose.Close()
if err != nil {
return err
}
}

if self.ps != nil {
self.ps.Stop()
if s.ps != nil {
s.ps.Stop()
}
if ch := self.config.Swap.Chequebook(); ch != nil {
if ch := s.config.Swap.Chequebook(); ch != nil {
ch.Stop()
ch.Save()
}
if self.swap != nil {
self.swap.Close()
if s.swap != nil {
s.swap.Close()
}
if self.accountingMetrics != nil {
self.accountingMetrics.Close()
if s.accountingMetrics != nil {
s.accountingMetrics.Close()
}
if self.netStore != nil {
self.netStore.Close()
if s.netStore != nil {
s.netStore.Close()
}
self.sfs.Stop()
s.sfs.Stop()
stopCounter.Inc(1)
self.streamer.Stop()
s.streamer.Stop()

err := self.bzz.Stop()
if self.stateStore != nil {
self.stateStore.Close()
err := s.bzz.Stop()
if s.stateStore != nil {
s.stateStore.Close()
}

for _, cleanF := range self.cleanupFuncs {
for _, cleanF := range s.cleanupFuncs {
err = cleanF()
if err != nil {
log.Error("encountered an error while running cleanup function", "err", err)
Expand All @@ -482,68 +482,73 @@ func (s *Swarm) Protocols() (protos []p2p.Protocol) {

// implements node.Service
// APIs returns the RPC API descriptors the Swarm implementation offers
func (self *Swarm) APIs() []rpc.API {
func (s *Swarm) APIs() []rpc.API {

apis := []rpc.API{
// public APIs
{
Namespace: "bzz",
Version: "3.0",
Service: &Info{self.config, chequebook.ContractParams},
Service: &Info{s.config, chequebook.ContractParams},
Public: true,
},
// admin APIs
{
Namespace: "bzz",
Version: "3.0",
Service: api.NewInspector(self.api, self.bzz.Hive, self.netStore),
Service: api.NewInspector(s.api, s.bzz.Hive, s.netStore),
Public: false,
},
{
Namespace: "chequebook",
Version: chequebook.Version,
Service: chequebook.NewAPI(self.config.Swap.Chequebook),
Service: chequebook.NewAPI(s.config.Swap.Chequebook),
Public: false,
},
{
Namespace: "swarmfs",
Version: fuse.Swarmfs_Version,
Service: self.sfs,
Service: s.sfs,
Public: false,
},
{
Namespace: "accounting",
Version: protocols.AccountingVersion,
Service: protocols.NewAccountingApi(self.accountingMetrics),
Service: protocols.NewAccountingApi(s.accountingMetrics),
Public: false,
},
}

apis = append(apis, self.bzz.APIs()...)
apis = append(apis, s.bzz.APIs()...)

if self.ps != nil {
apis = append(apis, self.ps.APIs()...)
if s.ps != nil {
apis = append(apis, s.ps.APIs()...)
}

return apis
}

// SetChequebook ensures that the local checquebook is set up on chain.
func (self *Swarm) SetChequebook(ctx context.Context) error {
err := self.config.Swap.SetChequebook(ctx, self.backend, self.config.Path)
func (s *Swarm) SetChequebook(ctx context.Context) error {
err := s.config.Swap.SetChequebook(ctx, s.backend, s.config.Path)
if err != nil {
return err
}
log.Info(fmt.Sprintf("new chequebook set (%v): saving config file, resetting all connections in the hive", self.config.Swap.Contract.Hex()))
log.Info(fmt.Sprintf("new chequebook set (%v): saving config file, resetting all connections in the hive", s.config.Swap.Contract.Hex()))
return nil
}

// RegisterPssProtocol adds a devp2p protocol to the swarm node's Pss instance
func (s *Swarm) RegisterPssProtocol(topic *pss.Topic, spec *protocols.Spec, targetprotocol *p2p.Protocol, options *pss.ProtocolParams) (*pss.Protocol, error) {
return pss.RegisterProtocol(s.ps, topic, spec, targetprotocol, options)
}

// serialisable info about swarm
type Info struct {
*api.Config
*chequebook.Params
}

func (self *Info) Info() *Info {
return self
func (s *Info) Info() *Info {
return s
}