From 659503a24bfc151d57e1279c7500fadd50ee3c18 Mon Sep 17 00:00:00 2001 From: Peter Brant Date: Tue, 16 Sep 2014 18:26:23 -0500 Subject: [PATCH] Fix sequence/timestamp issues for real this time --- .../scala/net/liftweb/http/CometActor.scala | 20 ++++++++++++------- .../scala/net/liftweb/http/LiftSession.scala | 2 +- .../src/main/scala/net/liftweb/http/S.scala | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/web/webkit/src/main/scala/net/liftweb/http/CometActor.scala b/web/webkit/src/main/scala/net/liftweb/http/CometActor.scala index 899250bc53..4431c88044 100644 --- a/web/webkit/src/main/scala/net/liftweb/http/CometActor.scala +++ b/web/webkit/src/main/scala/net/liftweb/http/CometActor.scala @@ -325,6 +325,7 @@ trait LiftCometActor extends TypedActor[Any, Any] with ForwardableActor[Any, Any * @return the last when sent from the listener */ def lastListenerTime: Long + def lastRenderTime: Long private[http] def callInitCometActor(creationInfo: CometCreationInfo) { initCometActor(creationInfo) @@ -451,7 +452,7 @@ trait CometActor extends LiftActor with LiftCometActor with CssBindImplicits { private val logger = Logger(classOf[CometActor]) val uniqueId = Helpers.nextFuncName private var spanId = uniqueId - @volatile private var lastRenderTime = millis + @volatile private var _lastRenderTime = Helpers.nextNum /** * If we're going to cache the last rendering, here's the @@ -466,7 +467,7 @@ trait CometActor extends LiftActor with LiftCometActor with CssBindImplicits { def renderClock: Long = lastRenderTime @volatile - private var _lastListenerTime: Long = lastRenderTime + private var _lastListenerTime: Long = millis /** * The last "when" sent from the listener @@ -474,6 +475,8 @@ trait CometActor extends LiftActor with LiftCometActor with CssBindImplicits { */ def lastListenerTime: Long = _lastListenerTime + def lastRenderTime: Long = _lastRenderTime + /** * The last rendering (cached or not) */ @@ -509,7 +512,7 @@ trait CometActor extends LiftActor with LiftCometActor with CssBindImplicits { private var _deltaPruner: (CometActor, List[Delta]) => List[Delta] = (actor, d) => { val m = Helpers.millis - d.filter(d => (m - d.when) < 120000L) + d.filter(d => (m - d.timestamp) < 120000L) } private var _theSession: LiftSession = _ @@ -807,16 +810,17 @@ trait CometActor extends LiftActor with LiftCometActor with CssBindImplicits { whosAsking openOr this, lastRenderTime, wasLastFullRender)) clearNotices } else { - lastRenderTime = when + _lastRenderTime = when deltas.filter(_.when > when) match { case Nil => listeners = (seqId, toDo) :: listeners - case all@(hd :: xs) => + case all@(hd :: xs) => { toDo(AnswerRender(new XmlOrJsCmd(spanId, Empty, Empty, Full(all.reverse.foldLeft(Noop)(_ & _.js)), Empty, buildSpan, false, notices.toList), whosAsking openOr this, hd.when, false)) clearNotices deltas = _deltaPruner(this, deltas) + } } } } @@ -947,7 +951,7 @@ trait CometActor extends LiftActor with LiftCometActor with CssBindImplicits { case PartialUpdateMsg(cmdF) => { val cmd: JsCmd = cmdF.apply - val time = millis + val time = Helpers.nextNum val delta = JsDelta(time, cmd) receivedDelta = true theSession.updateFunctionMap(S.functionMap, uniqueId, time) @@ -1050,7 +1054,7 @@ trait CometActor extends LiftActor with LiftCometActor with CssBindImplicits { protected def manualWiringDependencyManagement = false private def performReRender(sendAll: Boolean): RenderOut = { - lastRenderTime = millis + _lastRenderTime = Helpers.nextNum if (sendAll) { cachedFixedRender.reset @@ -1325,6 +1329,8 @@ trait CometActor extends LiftActor with LiftCometActor with CssBindImplicits { abstract class Delta(val when: Long) { def js: JsCmd + + val timestamp = millis } case class JsDelta(override val when: Long, js: JsCmd) extends Delta(when) diff --git a/web/webkit/src/main/scala/net/liftweb/http/LiftSession.scala b/web/webkit/src/main/scala/net/liftweb/http/LiftSession.scala index 06ef367a9b..4ac2b595ea 100644 --- a/web/webkit/src/main/scala/net/liftweb/http/LiftSession.scala +++ b/web/webkit/src/main/scala/net/liftweb/http/LiftSession.scala @@ -2382,7 +2382,7 @@ class LiftSession(private[http] val _contextPath: String, val uniqueId: String, private def lastWhenDeltaPruner: (LiftCometActor, List[Delta]) => List[Delta] = (ca, dl) => { val when = ca.lastListenerTime - dl.filter(d => when <= d.when) + dl.filter(d => when <= d.timestamp) } diff --git a/web/webkit/src/main/scala/net/liftweb/http/S.scala b/web/webkit/src/main/scala/net/liftweb/http/S.scala index 41225a3918..e9fa2df101 100644 --- a/web/webkit/src/main/scala/net/liftweb/http/S.scala +++ b/web/webkit/src/main/scala/net/liftweb/http/S.scala @@ -808,7 +808,7 @@ trait S extends HasParams with Loggable with UserAgentCalculator { */ def addComet(cometActor: LiftCometActor): Unit = { requestCometVersions.set( - requestCometVersions.is + CVP(cometActor.uniqueId, cometActor.lastListenerTime) + requestCometVersions.is + CVP(cometActor.uniqueId, cometActor.lastRenderTime) ) }