Skip to content

Commit dbf3eea

Browse files
committed
handle segment granularity changes
1 parent 2ae0c26 commit dbf3eea

File tree

14 files changed

+295
-89
lines changed

14 files changed

+295
-89
lines changed

core/src/main/scala/com/metamx/tranquility/beam/Beam.scala

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717
package com.metamx.tranquility.beam
1818

1919
import com.twitter.util.Future
20+
import org.joda.time.Interval
2021

2122
/**
2223
* Beams can accept events and forward them along. The propagate method may throw a DefunctBeamException, which means
2324
* the beam should be discarded (after calling close()).
2425
*/
25-
trait Beam[A]
26+
trait Beam[A] extends DiscoverableInterval
2627
{
2728
/**
2829
* Request propagation of events. The operation may fail in various ways, which tend to be specific to
@@ -40,3 +41,11 @@ class DefunctBeamException(s: String, t: Throwable) extends Exception(s, t)
4041
{
4142
def this(s: String) = this(s, null)
4243
}
44+
45+
trait DiscoverableInterval
46+
{
47+
/**
48+
* Returns the interval handled by the Beam, can return None if there is no associated interval
49+
* */
50+
def getInterval(): Option[Interval]
51+
}

core/src/main/scala/com/metamx/tranquility/beam/ClusteredBeam.scala

Lines changed: 150 additions & 65 deletions
Large diffs are not rendered by default.

core/src/main/scala/com/metamx/tranquility/beam/HttpBeam.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class HttpBeam[A: Timestamper](
5858
emitter: ServiceEmitter
5959
) extends Beam[A] with Logging
6060
{
61+
62+
def getInterval() = None
63+
6164
private[this] implicit val timer: Timer = DefaultTimer.twitter
6265

6366
private[this] val port = if (uri.port > 0) {

core/src/main/scala/com/metamx/tranquility/beam/MemoryBeam.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class MemoryBeam[A](
2828
jsonWriter: JsonWriter[A]
2929
) extends Beam[A]
3030
{
31+
def getInterval() = None
32+
3133
def propagate(events: Seq[A]) = {
3234
events.map(event => Jackson.parse[Dict](jsonWriter.asBytes(event))) foreach {
3335
d =>

core/src/main/scala/com/metamx/tranquility/beam/MergingPartitioningBeam.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,12 @@ class MergingPartitioningBeam[A](
4444
Future.collect(beams map (_.close())) map (_ => ())
4545
}
4646

47+
def getInterval() = {
48+
beams.headOption match {
49+
case Some(x) => x.getInterval()
50+
case None => None
51+
}
52+
}
53+
4754
override def toString = s"MergingPartitioningBeam(${beams.mkString(", ")})"
4855
}

core/src/main/scala/com/metamx/tranquility/beam/NoopBeam.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package com.metamx.tranquility.beam
1818

1919
import com.twitter.util.Future
20+
import org.joda.time.Interval
21+
import org.joda.time.chrono.ISOChronology
2022

2123
class NoopBeam[A] extends Beam[A]
2224
{
@@ -25,4 +27,6 @@ class NoopBeam[A] extends Beam[A]
2527
def close() = Future.Done
2628

2729
override def toString = "NoopBeam()"
30+
31+
def getInterval() = Some(new Interval(0, 0, ISOChronology.getInstanceUTC))
2832
}

core/src/main/scala/com/metamx/tranquility/beam/RoundRobinBeam.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,11 @@ class RoundRobinBeam[A](
3838
}
3939

4040
override def toString = "RoundRobinBeam(%s)" format beams.mkString(", ")
41+
42+
def getInterval() = {
43+
beams.headOption match {
44+
case Some(x) => x.getInterval()
45+
case None => None
46+
}
47+
}
4148
}

core/src/main/scala/com/metamx/tranquility/druid/DruidBeam.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ package com.metamx.tranquility.druid
1919
import com.metamx.common.scala.Logging
2020
import com.metamx.common.scala.Predef._
2121
import com.metamx.emitter.service.ServiceEmitter
22-
import com.metamx.tranquility.beam.Beam
23-
import com.metamx.tranquility.beam.DefunctBeamException
22+
import com.metamx.tranquility.beam.{Beam, DefunctBeamException}
2423
import com.metamx.tranquility.finagle._
2524
import com.metamx.tranquility.typeclass.ObjectWriter
2625
import com.twitter.util.Closable
@@ -44,6 +43,9 @@ class DruidBeam[A](
4443
objectWriter: ObjectWriter[A]
4544
) extends Beam[A] with Logging with Closable
4645
{
46+
47+
def getInterval() = Some(interval)
48+
4749
private[this] val clients = Map(
4850
tasks map {
4951
task =>

core/src/main/scala/com/metamx/tranquility/druid/DruidBeamMaker.scala

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,6 @@ class DruidBeamMaker[A: Timestamper](
138138
}
139139

140140
override def newBeam(interval: Interval, partition: Int) = {
141-
require(
142-
beamTuning.segmentGranularity.widen(interval) == interval,
143-
"Interval does not match segmentGranularity[%s]: %s" format(beamTuning.segmentGranularity, interval)
144-
)
145141
val availabilityGroup = DruidBeamMaker.generateBaseFirehoseId(
146142
location.dataSource,
147143
beamTuning.segmentGranularity,
@@ -190,10 +186,7 @@ class DruidBeamMaker[A: Timestamper](
190186
// Backwards compatibility (see toDict).
191187
beamTuning.segmentBucket(new DateTime(d("timestamp"), ISOChronology.getInstanceUTC))
192188
}
193-
require(
194-
beamTuning.segmentGranularity.widen(interval) == interval,
195-
"Interval does not match segmentGranularity[%s]: %s" format(beamTuning.segmentGranularity, interval)
196-
)
189+
197190
val partition = int(d("partition"))
198191
val tasks = if (d contains "tasks") {
199192
list(d("tasks")).map(dict(_)).map(d => TaskPointer(str(d("id")), str(d("firehoseId"))))

core/src/main/scala/com/metamx/tranquility/druid/DruidBeams.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ object DruidBeams
221221
def close() = clusteredBeam.close() map (_ => lifecycle.stop())
222222

223223
override def toString = clusteredBeam.toString
224+
225+
def getInterval() = clusteredBeam.getInterval()
226+
224227
}
225228
}
226229

0 commit comments

Comments
 (0)