15
15
*/
16
16
package com .comcast .xfinity .sirius .api .impl .state
17
17
18
- import akka .actor .{Props , Actor , ActorRef }
18
+ import akka .actor .{Actor , ActorRef , Props }
19
19
import com .comcast .xfinity .sirius .writeaheadlog .SiriusLog
20
20
import com .comcast .xfinity .sirius .api .{SiriusConfiguration , SiriusResult }
21
21
import com .comcast .xfinity .sirius .api .impl ._
22
22
import com .comcast .xfinity .sirius .admin .MonitoringHooks
23
23
24
+ import scala .collection .mutable .ListBuffer
25
+
24
26
object SiriusPersistenceActor {
25
27
26
28
/**
@@ -41,6 +43,7 @@ object SiriusPersistenceActor {
41
43
* @param end last sequence number of the range, inclusive
42
44
*/
43
45
case class GetLogSubrange (begin : Long , end : Long ) extends LogQuery
46
+ case class GetLogRangeLimit (begin : Long , events : Long ) extends LogQuery
44
47
45
48
trait LogSubrange
46
49
trait PopulatedSubrange extends LogSubrange {
@@ -129,21 +132,34 @@ class SiriusPersistenceActor(stateActor: ActorRef,
129
132
130
133
lastWriteTime = thisWriteTime
131
134
135
+ case GetLogRangeLimit (start, limit) =>
136
+ val buffer = siriusLog.foldLeftWhile(start)(ListBuffer .empty[OrderedEvent ])(buffer => buffer.length < limit)(
137
+ (acc, event) => acc += event
138
+ )
139
+ if (buffer.isEmpty) {
140
+ sender ! EmptySubrange
141
+ }
142
+ if (buffer.length < limit) {
143
+ sender ! PartialSubrange (buffer.head.sequence, buffer.last.sequence, buffer.toList)
144
+ } else {
145
+ sender ! CompleteSubrange (buffer.head.sequence, buffer.last.sequence, buffer.toList)
146
+ }
147
+
132
148
case GetLogSubrange (rangeStart, rangeEnd) if rangeEnd < siriusLog.getNextSeq => // we can answer fully
133
- val events = siriusLog.foldLeftRange(rangeStart, rangeEnd)(List [OrderedEvent ]() )(
134
- (acc, event) => event :: acc
135
- ).reverse
136
- sender ! CompleteSubrange (rangeStart, rangeEnd, events)
149
+ val events = siriusLog.foldLeftRange(rangeStart, rangeEnd)(ListBuffer .empty [OrderedEvent ])(
150
+ (acc, event) => acc += event
151
+ )
152
+ sender ! CompleteSubrange (rangeStart, rangeEnd, events.toList )
137
153
138
- case GetLogSubrange (rangeStart, rangeEnd ) if siriusLog.getNextSeq <= rangeStart => // we can't send anything useful back
154
+ case GetLogSubrange (rangeStart, _ ) if siriusLog.getNextSeq <= rangeStart => // we can't send anything useful back
139
155
sender ! EmptySubrange
140
156
141
- case GetLogSubrange (rangeStart, rangeEnd ) => // we can respond partially
157
+ case GetLogSubrange (rangeStart, _ ) => // we can respond partially
142
158
val lastSeq = siriusLog.getNextSeq - 1
143
- val events = siriusLog.foldLeftRange(rangeStart, lastSeq)(List [OrderedEvent ]() )(
144
- (acc, event) => event :: acc
145
- ).reverse
146
- sender ! PartialSubrange (rangeStart, lastSeq, events)
159
+ val events = siriusLog.foldLeftRange(rangeStart, lastSeq)(ListBuffer .empty [OrderedEvent ])(
160
+ (acc, event) => acc += event
161
+ )
162
+ sender ! PartialSubrange (rangeStart, lastSeq, events.toList )
147
163
148
164
case GetNextLogSeq =>
149
165
sender ! siriusLog.getNextSeq
0 commit comments