@@ -54,9 +54,6 @@ case class UpdateMemoryQueue(oldAction: DocInfo,
54
54
case class CreateNewQueue (activationMessage : ActivationMessage ,
55
55
action : FullyQualifiedEntityName ,
56
56
actionMetadata : WhiskActionMetaData )
57
- case class RecoverQueue (activationMessage : ActivationMessage ,
58
- action : FullyQualifiedEntityName ,
59
- actionMetadata : WhiskActionMetaData )
60
57
61
58
case class QueueManagerConfig (maxRetriesToGetQueue : Int , maxSchedulingTime : FiniteDuration )
62
59
@@ -83,7 +80,7 @@ class QueueManager(
83
80
84
81
private val actorSelectionMap = TrieMap [String , ActorSelection ]()
85
82
86
- private val leaderElectionCallbacks = TrieMap [String , ( Either [EtcdFollower , EtcdLeader ], Boolean ) => Unit ]()
83
+ private val leaderElectionCallbacks = TrieMap [String , Either [EtcdFollower , EtcdLeader ] => Unit ]()
87
84
88
85
private implicit val askTimeout = Timeout (5 .seconds)
89
86
private implicit val ec = context.dispatcher
@@ -93,8 +90,6 @@ class QueueManager(
93
90
// watch leaders and register them into actorSelectionMap
94
91
watcherService ! WatchEndpoint (QueueKeys .queuePrefix, " " , isPrefix = true , watcherName, Set (PutEvent , DeleteEvent ))
95
92
96
- private var isShuttingDown = false
97
-
98
93
override def receive : Receive = {
99
94
case request : CreateQueue if isWarmUpAction(request.fqn) =>
100
95
logging.info(
@@ -119,12 +114,12 @@ class QueueManager(
119
114
msg.leadership match {
120
115
case Right (EtcdLeader (key, value, lease)) =>
121
116
leaderElectionCallbacks.remove(key).foreach { callback =>
122
- callback(Right (EtcdLeader (key, value, lease)), isShuttingDown )
117
+ callback(Right (EtcdLeader (key, value, lease)))
123
118
}
124
119
125
120
case Left (EtcdFollower (key, value)) =>
126
121
leaderElectionCallbacks.remove(key).foreach { callback =>
127
- callback(Left (EtcdFollower (key, value)), isShuttingDown )
122
+ callback(Left (EtcdFollower (key, value)))
128
123
}
129
124
}
130
125
@@ -134,11 +129,7 @@ class QueueManager(
134
129
s " Got activation message ${msg.activationId} for ${msg.user.namespace}/ ${msg.action} from remote queue manager. " )(
135
130
msg.transid)
136
131
137
- if (sender() == self) {
138
- handleCycle(msg)(msg.transid)
139
- } else {
140
- handleActivationMessage(msg)
141
- }
132
+ handleActivationMessage(msg)
142
133
143
134
case UpdateMemoryQueue (oldAction, newAction, msg) =>
144
135
logging.info(
@@ -173,25 +164,6 @@ class QueueManager(
173
164
updateInitRevisionMap(getLeaderKey(msg.user.namespace.name.asString, msg.action), msg.revision)
174
165
queue ! msg
175
166
msg.transid.mark(this , LoggingMarkers .SCHEDULER_QUEUE_CREATE )
176
- if (isShuttingDown) {
177
- queue ! GracefulShutdown
178
- }
179
- }
180
-
181
- case RecoverQueue (msg, action, actionMetaData) =>
182
- QueuePool .keys.find(k =>
183
- k.invocationNamespace == msg.user.namespace.name.asString && k.docInfo.id == action.toDocId) match {
184
- // queue is already recovered or a newer queue is created, send msg to new queue
185
- case Some (key) if key.docInfo.rev >= msg.revision =>
186
- QueuePool .get(key) match {
187
- case Some (queue) if queue.isLeader =>
188
- queue.queue ! msg.copy(revision = key.docInfo.rev)
189
- logging.info(this , s " Queue for action $action is already recovered, skip " )(msg.transid)
190
- case _ =>
191
- recreateQueue(action, msg, actionMetaData)
192
- }
193
- case _ =>
194
- recreateQueue(action, msg, actionMetaData)
195
167
}
196
168
197
169
// leaderKey is now optional, it becomes None when the stale queue is removed
@@ -236,7 +208,6 @@ class QueueManager(
236
208
}
237
209
238
210
case GracefulShutdown =>
239
- isShuttingDown = true
240
211
logging.info(this , s " Gracefully shutdown the queue manager " )
241
212
242
213
watcherService ! UnwatchEndpoint (QueueKeys .queuePrefix, isPrefix = true , watcherName)
@@ -346,49 +317,6 @@ class QueueManager(
346
317
}
347
318
}
348
319
349
- private def recreateQueue (action : FullyQualifiedEntityName ,
350
- msg : ActivationMessage ,
351
- actionMetaData : WhiskActionMetaData ): Unit = {
352
- logging.warn(this , s " recreate queue for ${msg.action}" )(msg.transid)
353
- val queue = createAndStartQueue(msg.user.namespace.name.asString, action, msg.revision, actionMetaData)
354
- queue ! msg
355
- msg.transid.mark(this , LoggingMarkers .SCHEDULER_QUEUE_RECOVER )
356
- if (isShuttingDown) {
357
- queue ! GracefulShutdown
358
- }
359
- }
360
-
361
- private def handleCycle (msg : ActivationMessage )(implicit transid : TransactionId ): Future [Any ] = {
362
- logging.warn(
363
- this ,
364
- s " queue for ${msg.user.namespace.name.asString}/ ${msg.action} doesn't exist in memory but exist in etcd, recovering... " )
365
- val start = transid.started(this , LoggingMarkers .SCHEDULER_QUEUE_RECOVER )
366
-
367
- logging.info(this , s " Recover a queue for ${msg.user.namespace.name.asString}/ ${msg.action}, " )
368
- getWhiskActionMetaData(entityStore, msg.action.toDocId, msg.revision, false )
369
- .map { actionMetaData : WhiskActionMetaData =>
370
- actionMetaData.toExecutableWhiskAction match {
371
- case Some (_) =>
372
- self ! RecoverQueue (msg, msg.action.copy(version = Some (actionMetaData.version)), actionMetaData)
373
- transid.finished(this , start, s " recovering queue for ${msg.action.toDocId.asDocInfo(actionMetaData.rev)}" )
374
-
375
- case None =>
376
- val message =
377
- s " non-executable action: ${msg.action} with rev: ${msg.revision} reached queueManager "
378
- completeErrorActivation(msg, message)
379
- transid.failed(this , start, message)
380
- }
381
- }
382
- .recover {
383
- case t =>
384
- transid.failed(
385
- this ,
386
- start,
387
- s " failed to fetch action ${msg.action} with rev: ${msg.revision}, error ${t.getMessage}" )
388
- completeErrorActivation(msg, t.getMessage)
389
- }
390
- }
391
-
392
320
private def handleActivationMessage (msg : ActivationMessage ): Any = {
393
321
implicit val transid = msg.transid
394
322
@@ -525,24 +453,24 @@ class QueueManager(
525
453
case None =>
526
454
dataManagementService ! ElectLeader (leaderKey, schedulerEndpoints.serialize, self)
527
455
leaderElectionCallbacks.put(
528
- leaderKey,
529
- (electResult, isShuttingDown) => {
530
- electResult match {
531
- case Right ( EtcdLeader (_, _, _)) =>
532
- val queue = createAndStartQueue(
533
- request.invocationNamespace ,
534
- request.fqn ,
535
- request.revision,
536
- request.whiskActionMetaData)
537
- receiver.foreach(_ ! CreateQueueResponse (request.invocationNamespace, request.fqn, success = true ))
538
- if (isShuttingDown) {
539
- queue ! GracefulShutdown
540
- }
541
-
542
- // in case of follower, do nothing
543
- case Left ( EtcdFollower (_, _)) =>
544
- receiver.foreach(_ ! CreateQueueResponse (request.invocationNamespace, request.fqn, success = true ))
545
- }
456
+ leaderKey, {
457
+ case Right ( EtcdLeader (_, _, _)) =>
458
+ val queue = childFactory(
459
+ context,
460
+ request.invocationNamespace,
461
+ request.fqn ,
462
+ request.revision ,
463
+ request.whiskActionMetaData)
464
+ queue ! Start
465
+ QueuePool .put(
466
+ MemoryQueueKey (request.invocationNamespace, request.fqn.toDocId.asDocInfo(request.revision)),
467
+ MemoryQueueValue ( queue, true ))
468
+ updateInitRevisionMap(leaderKey, request.revision)
469
+ receiver.foreach(_ ! CreateQueueResponse (request.invocationNamespace, request.fqn, success = true ))
470
+
471
+ // in case of follower, do nothing
472
+ case Left ( EtcdFollower (_, _)) =>
473
+ receiver.foreach(_ ! CreateQueueResponse (request.invocationNamespace, request.fqn, success = true ))
546
474
})
547
475
548
476
// there is already a leader election for leaderKey, so skip it
@@ -562,20 +490,6 @@ class QueueManager(
562
490
}
563
491
}
564
492
565
- private def createAndStartQueue (invocationNamespace : String ,
566
- action : FullyQualifiedEntityName ,
567
- revision : DocRevision ,
568
- actionMetaData : WhiskActionMetaData ): ActorRef = {
569
- val queue =
570
- childFactory(context, invocationNamespace, action, revision, actionMetaData)
571
- queue ! Start
572
- QueuePool .put(
573
- MemoryQueueKey (invocationNamespace, action.toDocId.asDocInfo(revision)),
574
- MemoryQueueValue (queue, true ))
575
- updateInitRevisionMap(getLeaderKey(invocationNamespace, action), revision)
576
- queue
577
- }
578
-
579
493
private val logScheduler = context.system.scheduler.scheduleAtFixedRate(0 .seconds, 1 .seconds)(() => {
580
494
MetricEmitter .emitHistogramMetric(LoggingMarkers .SCHEDULER_QUEUE , QueuePool .countLeader())
581
495
})
0 commit comments