Author: titmuss
Date: Tue Jun 17 08:53:33 2008
New Revision: 2576

URL: http://svn.slimdevices.com?rev=2576&root=Jive&view=rev
Log:
Bug: 6683
Description:
Handle SC changing IP address correctly, before Jive would get confused. This 
uses a 
single Comet instance per SC (handling subscription state), but allows the 
endpoint 
of the Comet instance to be changed.

Modified Comet:_setState, to make sure that the state is stored before any 
notifications. Any re-entrant calls could get the Comet class confused and 
prevented 
the connection from working. This may be a cause of bug 8252.


Modified:
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/net/Comet.lua
    
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua?rev=2576&root=Jive&r1=2575&r2=2576&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/applets/SqueezeDiscovery/SqueezeDiscoveryApplet.lua
 Tue Jun 17 08:53:33 2008
@@ -57,6 +57,7 @@
 local PORT    = 3483             -- port used to discover SqueezeCenters
 local DISCOVERY_TIMEOUT = 120000 -- timeout (in milliseconds) before removing 
SqueezeCenters and Players
 local DISCOVERY_PERIOD = 60000   -- discovery period
+local SEARCHING_PERIOD = 10000   -- searching period
 
 
 
@@ -158,11 +159,11 @@
 local function _squeezeCenterCleanup(self)
        local now = Framework:getTicks()
 
-       local activeServer = self.currentPlayer and 
self.currentPlayer:getSlimServer()
+       local currentServer = self.currentPlayer and 
self.currentPlayer:getSlimServer()
 
        for i, server in SlimServer.iterate() do
                if not server:isConnected() and
-                       activeServer ~= server and
+                       currentServer ~= server and
                        now - server:getLastSeen() > DISCOVERY_TIMEOUT then
                
                        log:info("Removing server ", server)
@@ -283,7 +284,11 @@
                self:_debug()
        end
 
-       self.timer:restart(DISCOVERY_PERIOD)
+       if self.state == 'connected' then
+               self.timer:restart(DISCOVERY_PERIOD)
+       else
+               self.timer:restart(SEARCHING_PERIOD)
+       end
 end
 
 
@@ -332,11 +337,11 @@
        log:info("State: ", self.state)
        log:info("CurrentPlayer: ", self.currentPlayer)
        if self.currentPlayer then
-               log:info("ActiveServer: ", self.currentPlayer:getSlimServer())
+               log:info("CurrentServer: ", self.currentPlayer:getSlimServer())
        end
        log:info("Servers:")
        for i, server in SlimServer.iterate() do
-               log:info("\t", server:getName(), " connected=", 
server:isConnected(), " timeout=", DISCOVERY_TIMEOUT - (now - 
server:getLastSeen()))
+               log:info("\t", server:getName(), " [", server:getIpPort(), "] 
connected=", server:isConnected(), " timeout=", DISCOVERY_TIMEOUT - (now - 
server:getLastSeen()))
        end
        log:info("Players:")
        for i, player in Player.iterate() do
@@ -364,10 +369,10 @@
 
 -- disconnect from idle servers
 function _idleDisconnect(self)
-       local activeServer = self.currentPlayer and 
self.currentPlayer:getSlimServer()
+       local currentServer = self.currentPlayer and 
self.currentPlayer:getSlimServer()
 
        for i, server in SlimServer:iterate() do
-               if server ~= activeServer then
+               if server ~= currentServer then
                        server:disconnect()
                else
                        server:connect()

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/net/Comet.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/net/Comet.lua?rev=2576&root=Jive&r1=2575&r2=2576&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/net/Comet.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/net/Comet.lua
 Tue Jun 17 08:53:33 2008
@@ -110,9 +110,7 @@
 
 Creates A Comet socket named I<name> to interface with the given I<jnt> 
 (a L<jive.net.NetworkThread> instance). I<name> is used for debugging and
-defaults to "". I<ip> and I<port> are the IP address and port of the HTTP 
server.
-I<path> is the absolute path to the servers cometd handler and defaults to
-'/cometd'.
+defaults to "".
 
 Notifications:
 
@@ -121,20 +119,15 @@
 
 =cut
 --]]
-function __init(self, jnt, ip, port, path, name)
-       log:debug("Comet: __init(", name, ", ", ip, ", ", port, ", ", path, ")")
+function __init(self, jnt, name)
+       log:debug("Comet: __init(", name, ")")
 
        -- init superclass
        local obj = oo.rawnew( self, {} )
        
-       obj.uri = 'http://' .. ip .. ':' .. port .. path
-       
-       -- Comet uses 2 pools, 1 for chunked responses and 1 for requests
-       obj.chttp          = SocketHttp(jnt, ip, port, name .. "_Chunked")
-       obj.rhttp          = SocketHttp(jnt, ip, port, name .. "_Request")
-
-       obj.chttp:setPriority(Task.PRIORITY_HIGH)
-       obj.rhttp:setPriority(Task.PRIORITY_HIGH)
+       obj.uri            = false
+       obj.chttp          = false
+       obj.rhttp          = false
        
        obj.jnt            = jnt
        obj.name           = name
@@ -171,8 +164,38 @@
 end
 
 
+-- setEndpoint:
+-- I<ip> and I<port> are the IP address and port of the HTTP server.
+-- I<path> is the absolute path to the servers cometd handler and defaults to
+-- '/cometd'.
+function setEndpoint(self, ip, port, path)
+       log:error(self, ": ***************** setEndpoint state=", self.state, 
", ", ip, ", ", port, ", ", path)
+
+       local oldState = self.state
+
+       -- Force disconnection
+       _state(self, UNCONNECTED)
+       
+       self.uri = 'http://' .. ip .. ':' .. port .. path
+       
+       -- Comet uses 2 pools, 1 for chunked responses and 1 for requests
+       self.chttp = SocketHttp(self.jnt, ip, port, self.name .. "_Chunked")
+       self.rhttp = SocketHttp(self.jnt, ip, port, self.name .. "_Request")
+
+       self.chttp:setPriority(Task.PRIORITY_HIGH)
+       self.rhttp:setPriority(Task.PRIORITY_HIGH)
+
+       if oldState == CONNECTING or self.state == CONNECTED then
+               -- Reconnect
+               _handshake(self)
+       end
+end
+
+
 function connect(self)
        log:debug(self, ": connect state=", self.state)
+
+       assert(self.uri)
 
        self.isactive = true
 
@@ -510,6 +533,11 @@
        -- Stop reconnect timer
        self.reconnect_timer:stop()
 
+       -- Set the state before the notifications, so any re-rentrant calls
+       -- work correctly
+       self.state = state
+       log:debug(self, ": state is ", state)
+
        if state == CONNECTED then
                -- Reset error count
                self.failures = 0
@@ -523,9 +551,6 @@
 
                self.jnt:notify('cometDisconnected', self, #self.pending_reqs + 
#self.sent_reqs)
        end
-
-       log:debug(self, ": state is ", state)
-       self.state = state
 end
 
 

Modified: 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua
URL: 
http://svn.slimdevices.com/7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua?rev=2576&root=Jive&r1=2575&r2=2576&view=diff
==============================================================================
--- 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua
 (original)
+++ 
7.1/branches/discovery-refactor/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua
 Tue Jun 17 08:53:33 2008
@@ -256,7 +256,7 @@
                players = {},
 
                -- our comet connection, initially not connected
-               comet = false,
+               comet = Comet(jnt, name),
 
                -- are we connected to the server?
                -- 'disconnected' = not connected
@@ -282,6 +282,15 @@
                -- loaded images
                imageCache = {},
        })
+
+       -- subscribe to server status, max 50 players every 60 seconds.
+       -- FIXME: what if the server has more than 50 players?
+       obj.comet:aggressiveReconnect(true)
+       obj.comet:subscribe('/slim/serverstatus',
+               _getSink(obj, '_serverstatusSink'),
+               nil,
+               { 'serverstatus', 0, 50, 'subscribe:60' }
+       )
 
        setmetatable(obj.imageCache, { __mode = "kv" })
 
@@ -336,16 +345,7 @@
                self.artworkPool = HttpPool(self.jnt, self.name, ip, port, 2, 
1, Task.PRIORITY_LOW)
 
                -- commet
-               self.comet = Comet(self.jnt, ip, port, '/cometd', self.name)
-
-               -- subscribe to server status, max 50 players every 60 seconds.
-               -- FIXME: what if the server has more than 50 players?
-               self.comet:aggressiveReconnect(true)
-               self.comet:subscribe('/slim/serverstatus',
-                                    _getSink(self, '_serverstatusSink'),
-                                    nil,
-                                    { 'serverstatus', 0, 50, 'subscribe:60' }
-                            )
+               self.comet:setEndpoint(ip, port, '/cometd')
 
                -- reconnect, if we were already connected
                if oldstate ~= 'disconnected' then
@@ -399,7 +399,7 @@
 
 -- connect to SqueezeCenter
 function connect(self)
-       if self.netstate == 'connected' then
+       if self.netstate == 'connected' or self.netstate == 'connecting' then
                return
        end
 

_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins

Reply via email to