aboutsummaryrefslogtreecommitdiff
path: root/build
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-07-10 16:28:18 +0100
committerNeil Alexander <neilalexander@users.noreply.github.com>2020-07-10 16:28:18 +0100
commit08e9d996b6e9f726425d815820e3857c12ebc0b3 (patch)
tree6202a6b0c68d0ba2b36688732ff899b91f157f15 /build
parentabf26c12f1a97fd2894a0509de9cf4a91c79d3ab (diff)
Yggdrasil demo updates
Squashed commit of the following: commit 6c2c48f862c1b6f8e741c57804282eceffe02487 Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Fri Jul 10 16:28:09 2020 +0100 Add README.md commit 5eeefdadf8e3881dd7a32559a92be49bd7ddaf47 Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Fri Jul 10 10:18:50 2020 +0100 Fix wedge in federation sender commit e2ebffbfba25cf82378393940a613ec32bfb909f Merge: 0883ef88 abf26c12 Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Fri Jul 10 09:51:23 2020 +0100 Merge branch 'master' into neilalexander/yggdrasil commit 0883ef8870e340f2ae9a0c37ed939dc2ab9911f6 Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Fri Jul 10 09:51:06 2020 +0100 Adjust timeouts commit ba2d53199910f13b60cc892debe96a962e8c9acb Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Thu Jul 9 16:34:40 2020 +0100 Try to wake up from peers/sessions properly commit 73f42eb494741ba5b0e0cef43654708e3c8eb399 Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Thu Jul 9 15:43:38 2020 +0100 Use TransactionWriter to reduce database lock issues on SQLite commit 08bfe63241a18c58c539c91b9f52edccda63a611 Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Thu Jul 9 12:38:02 2020 +0100 Un-wedge federation Squashed commit of the following: commit aee933f8785e7a7998105f6090f514d18051a1bd Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Thu Jul 9 12:22:41 2020 +0100 Un-goroutine the goroutines commit 478374e5d18a3056cac6682ef9095d41352d1295 Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Thu Jul 9 12:09:31 2020 +0100 Reduce federation sender wedges commit 40cc62c54d9e3a863868214c48b7c18e522a4772 Author: Neil Alexander <neilalexander@users.noreply.github.com> Date: Thu Jul 9 10:02:52 2020 +0100 Handle switching in/out background more reliably
Diffstat (limited to 'build')
-rw-r--r--build/gobind/monolith.go80
1 files changed, 51 insertions, 29 deletions
diff --git a/build/gobind/monolith.go b/build/gobind/monolith.go
index d220fabc..bc638d00 100644
--- a/build/gobind/monolith.go
+++ b/build/gobind/monolith.go
@@ -3,6 +3,7 @@ package gobind
import (
"context"
"crypto/tls"
+ "encoding/hex"
"fmt"
"net"
"net/http"
@@ -25,12 +26,17 @@ import (
"github.com/matrix-org/gomatrixserverlib"
"github.com/sirupsen/logrus"
"github.com/yggdrasil-network/yggdrasil-go/src/crypto"
+ "go.uber.org/atomic"
)
type DendriteMonolith struct {
+ logger logrus.Logger
YggdrasilNode *yggconn.Node
StorageDirectory string
listener net.Listener
+ httpServer *http.Server
+ httpListening atomic.Bool
+ yggListening atomic.Bool
}
func (m *DendriteMonolith) BaseURL() string {
@@ -58,9 +64,10 @@ func (m *DendriteMonolith) DisconnectMulticastPeers() {
}
func (m *DendriteMonolith) Start() {
- logger := logrus.Logger{
+ m.logger = logrus.Logger{
Out: BindLogger{},
}
+ m.logger.SetOutput(BindLogger{})
logrus.SetOutput(BindLogger{})
var err error
@@ -162,38 +169,39 @@ func (m *DendriteMonolith) Start() {
base.UseHTTPAPIs,
)
- ygg.NotifySessionNew(func(boxPubKey crypto.BoxPubKey) {
- serv := gomatrixserverlib.ServerName(boxPubKey.String())
+ ygg.NewSession = func(serverName gomatrixserverlib.ServerName) {
+ logrus.Infof("Found new session %q", serverName)
+ time.Sleep(time.Second * 3)
req := &api.PerformServersAliveRequest{
- Servers: []gomatrixserverlib.ServerName{serv},
+ Servers: []gomatrixserverlib.ServerName{serverName},
}
res := &api.PerformServersAliveResponse{}
if err := fsAPI.PerformServersAlive(context.TODO(), req, res); err != nil {
- logrus.WithError(err).Warnf("Failed to notify server %q alive due to new session", serv)
- } else {
- logrus.Infof("Notified server %q alive due to new session", serv)
+ logrus.WithError(err).Warn("Failed to notify server alive due to new session")
}
- })
+ }
- ygg.NotifyLinkNew(func(boxPubKey crypto.BoxPubKey, linkType, remote string) {
- serv := gomatrixserverlib.ServerName(boxPubKey.String())
+ ygg.NotifyLinkNew(func(_ crypto.BoxPubKey, sigPubKey crypto.SigPubKey, linkType, remote string) {
+ serverName := hex.EncodeToString(sigPubKey[:])
+ logrus.Infof("Found new peer %q", serverName)
+ time.Sleep(time.Second * 3)
req := &api.PerformServersAliveRequest{
- Servers: []gomatrixserverlib.ServerName{serv},
+ Servers: []gomatrixserverlib.ServerName{
+ gomatrixserverlib.ServerName(serverName),
+ },
}
res := &api.PerformServersAliveResponse{}
if err := fsAPI.PerformServersAlive(context.TODO(), req, res); err != nil {
- logrus.WithError(err).Warnf("Failed to notify server %q alive due to new peer", serv)
- } else {
- logrus.Infof("Notified server %q alive due to new peer", serv)
+ logrus.WithError(err).Warn("Failed to notify server alive due to new session")
}
})
// Build both ends of a HTTP multiplex.
- httpServer := &http.Server{
+ m.httpServer = &http.Server{
Addr: ":0",
TLSNextProto: map[string]func(*http.Server, *tls.Conn, http.Handler){},
- ReadTimeout: 15 * time.Second,
- WriteTimeout: 45 * time.Second,
+ ReadTimeout: 30 * time.Second,
+ WriteTimeout: 30 * time.Second,
IdleTimeout: 60 * time.Second,
BaseContext: func(_ net.Listener) context.Context {
return context.Background()
@@ -201,19 +209,33 @@ func (m *DendriteMonolith) Start() {
Handler: base.BaseMux,
}
- go func() {
- logger.Info("Listening on ", ygg.DerivedServerName())
- logger.Fatal(httpServer.Serve(ygg))
- }()
- go func() {
- logger.Info("Listening on ", m.BaseURL())
- logger.Fatal(httpServer.Serve(m.listener))
- }()
+ m.Resume()
+}
+
+func (m *DendriteMonolith) Resume() {
+ logrus.Info("Resuming monolith")
+ if listener, err := net.Listen("tcp", "localhost:65432"); err == nil {
+ m.listener = listener
+ }
+ if m.yggListening.CAS(false, true) {
+ go func() {
+ m.logger.Info("Listening on ", m.YggdrasilNode.DerivedServerName())
+ m.logger.Fatal(m.httpServer.Serve(m.YggdrasilNode))
+ m.yggListening.Store(false)
+ }()
+ }
+ if m.httpListening.CAS(false, true) {
+ go func() {
+ m.logger.Info("Listening on ", m.BaseURL())
+ m.logger.Fatal(m.httpServer.Serve(m.listener))
+ m.httpListening.Store(false)
+ }()
+ }
}
-func (m *DendriteMonolith) Stop() {
- if err := m.listener.Close(); err != nil {
- logrus.Warn("Error stopping listener:", err)
+func (m *DendriteMonolith) Suspend() {
+ m.logger.Info("Suspending monolith")
+ if err := m.httpServer.Close(); err != nil {
+ m.logger.Warn("Error stopping HTTP server:", err)
}
- m.YggdrasilNode.Stop()
}