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