diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-12-09 12:01:51 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-12-09 12:01:51 +0100 |
commit | 6a2fbd1434138094474a9f8901dc7f351bc4388c (patch) | |
tree | 40bbf57166b6c4573edec57688c7b8170016f561 /content.go | |
parent | 48df17e2d3eb125217ba51bab3dae00bd07ad225 (diff) |
fix clients being able to connect to media pools that were down on join
This commit fixes #141.
Diffstat (limited to 'content.go')
-rw-r--r-- | content.go | 31 |
1 files changed, 26 insertions, 5 deletions
@@ -32,6 +32,7 @@ type mediaFile struct { type contentConn struct { mt.Peer + denied bool logger *log.Logger @@ -228,6 +229,7 @@ func handleContent(cc *contentConn) { M: M, }) case *mt.ToCltKick: + cc.denied = true cc.log("<-", "deny access", cmd) case *mt.ToCltAcceptAuth: cc.auth.method = 0 @@ -348,6 +350,20 @@ type param0SrvMap map[mt.Content]struct { param0 mt.Content } +func muxErrors(conns []*contentConn) map[string]struct{} { + denyPools := make(map[string]struct{}) + + for _, cc := range conns { + <-cc.done() + + if cc.denied { + denyPools[cc.mediaPool] = struct{}{} + } + } + + return denyPools +} + func muxItemDefs(conns []*contentConn) ([]mt.ItemDef, []struct{ Alias, Orig string }) { var itemDefs []mt.ItemDef var aliases []struct{ Alias, Orig string } @@ -507,11 +523,12 @@ func muxRemotes(conns []*contentConn) []string { return urls } -func muxContent(userName string) (itemDefs []mt.ItemDef, aliases []struct{ Alias, Orig string }, nodeDefs []mt.NodeDef, p0Map param0Map, p0SrvMap param0SrvMap, media []mediaFile, remotes []string, err error) { +func muxContent(userName string) (denyPools map[string]struct{}, itemDefs []mt.ItemDef, aliases []struct{ Alias, Orig string }, nodeDefs []mt.NodeDef, p0Map param0Map, p0SrvMap param0SrvMap, media []mediaFile, remotes []string, err error) { var conns []*contentConn + denyPools = make(map[string]struct{}) PoolLoop: - for _, pool := range Conf().Pools() { + for poolName, pool := range Conf().Pools() { var addr *net.UDPAddr for name, srv := range pool { @@ -537,15 +554,19 @@ PoolLoop: continue PoolLoop } - // There's a pool with no reachable servers. - // We can't safely let clients join. - return + denyPools[poolName] = struct{}{} } + failedPools := muxErrors(conns) itemDefs, aliases = muxItemDefs(conns) nodeDefs, p0Map, p0SrvMap = muxNodeDefs(conns) media = muxMedia(conns) remotes = muxRemotes(conns) + + for pool := range failedPools { + denyPools[pool] = struct{}{} + } + return } |