Skip to content

Commit db853ca

Browse files
committed
add tests, fix segment empty range issue
1 parent 121166e commit db853ca

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

src/main/scala/com/comcast/xfinity/sirius/uberstore/segmented/Segment.scala

+9-6
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,15 @@ class Segment private[uberstore](val location: File,
172172
)
173173
}
174174

175-
def foldLeftWhile[T](startSeq: Long)(acc0: T)(pred: T => Boolean)(foldFun: (T, OrderedEvent) => T): T = {
176-
val (startOffset, _) = index.getOffsetRange(startSeq, Long.MaxValue)
177-
dataFile.foldLeftWhile(startOffset)(acc0)(pred)(
178-
(acc, evt) => foldFun(acc, evt)
179-
)
180-
}
175+
def foldLeftWhile[T](startSeq: Long)(acc0: T)(pred: T => Boolean)(foldFun: (T, OrderedEvent) => T): T =
176+
index.getOffsetRange(startSeq, Long.MaxValue) match {
177+
case (_, endOffset) if endOffset == -1 => // indicates an empty range
178+
acc0
179+
case (startOffset, _) =>
180+
dataFile.foldLeftWhile(startOffset)(acc0)(pred)(
181+
(acc, evt) => foldFun(acc, evt)
182+
)
183+
}
181184

182185
/**
183186
* Close underlying file handles or connections. This Segment should not be used after

src/test/scala/com/comcast/xfinity/sirius/uberstore/segmented/SegmentedUberStoreTest.scala

+33-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ class SegmentedUberStoreTest extends NiceTest {
182182
}
183183

184184
describe("foldLeftRange") {
185-
it("should reflect livedir's nextSeq") {
185+
it("should include livedir's events") {
186186
createSegment(dir, "1")
187187
createSegment(dir, "5")
188188
createSegment(dir, "10")
@@ -197,6 +197,38 @@ class SegmentedUberStoreTest extends NiceTest {
197197
}
198198
}
199199

200+
describe("foldLeftWhile") {
201+
it("should limit events based on predicate on accumulator") {
202+
createPopulatedSegment(dir, "1", Range.inclusive(1, 3).toList)
203+
createPopulatedSegment(dir, "5", Range.inclusive(4, 6).toList)
204+
createPopulatedSegment(dir, "10", Range.inclusive(7, 9).toList)
205+
uberstore = SegmentedUberStore(dir.getAbsolutePath, new SiriusConfiguration)
206+
uberstore.writeEntry(OrderedEvent(10L, 1L, Delete("10")))
207+
uberstore.writeEntry(OrderedEvent(11L, 1L, Delete("11")))
208+
209+
val result = uberstore.foldLeftWhile(startSeq = 1)(List[SiriusRequest]())(list => list.size < 5)(
210+
(acc, event) => event.request +: acc
211+
).reverse
212+
213+
assert(result === List(Delete("1"), Delete("2"), Delete("3"), Delete("4"), Delete("5")))
214+
}
215+
216+
it("should include livedir's events") {
217+
createPopulatedSegment(dir, "1", Range.inclusive(1, 3).toList)
218+
createPopulatedSegment(dir, "5", Range.inclusive(4, 6).toList)
219+
createPopulatedSegment(dir, "10", Range.inclusive(7, 9).toList)
220+
uberstore = SegmentedUberStore(dir.getAbsolutePath, new SiriusConfiguration)
221+
uberstore.writeEntry(OrderedEvent(10L, 1L, Delete("10")))
222+
uberstore.writeEntry(OrderedEvent(11L, 1L, Delete("11")))
223+
224+
val result = uberstore.foldLeftWhile(startSeq = 9)(List[SiriusRequest]())(list => list.size < 2)(
225+
(acc, event) => event.request +: acc
226+
).reverse
227+
228+
assert(result === List(Delete("9"), Delete("10")))
229+
}
230+
}
231+
200232
describe("parallelForeach") {
201233
it("should bootstrap the uberstore in parallel") {
202234
createPopulatedSegment(dir, "1", Range.inclusive(1, 3).toList, isApplied = true)

0 commit comments

Comments
 (0)