@@ -19,18 +19,14 @@ package org.apache.openwhisk.core.service
19
19
20
20
import akka .actor .{Actor , ActorRef , ActorRefFactory , ActorSystem , Props }
21
21
import akka .util .Timeout
22
- import io .grpc .StatusRuntimeException
23
22
import org .apache .openwhisk .common .Logging
24
23
import org .apache .openwhisk .core .ConfigKeys
25
- import org .apache .openwhisk .core .etcd .{EtcdClient , EtcdFollower , EtcdLeader }
26
- import org .apache .openwhisk .core .service .DataManagementService .retryInterval
24
+ import org .apache .openwhisk .core .etcd .{EtcdFollower , EtcdLeader }
27
25
import pureconfig .loadConfigOrThrow
28
26
29
27
import scala .collection .concurrent .TrieMap
30
28
import scala .collection .mutable .{Map , Queue }
31
- import scala .concurrent .ExecutionContext
32
29
import scala .concurrent .duration ._
33
- import scala .util .Success
34
30
35
31
// messages received by the actor
36
32
// it is required to specify a recipient directly for the retryable message processing
@@ -181,148 +177,3 @@ object DataManagementService {
181
177
Props (new DataManagementService (watcherService, workerFactory))
182
178
}
183
179
}
184
-
185
- private [service] class EtcdWorker (etcdClient : EtcdClient , leaseService : ActorRef )(implicit val ec : ExecutionContext ,
186
- actorSystem : ActorSystem ,
187
- logging : Logging )
188
- extends Actor {
189
-
190
- private val dataManagementService = context.parent
191
- private var lease : Option [Lease ] = None
192
- leaseService ! GetLease
193
-
194
- override def receive : Receive = {
195
- case msg : Lease =>
196
- lease = Some (msg)
197
-
198
- // leader election + endpoint management
199
- case request : ElectLeader =>
200
- lease match {
201
- case Some (l) =>
202
- etcdClient
203
- .electLeader(request.key, request.value, l)
204
- .andThen {
205
- case Success (msg) =>
206
- request.recipient ! ElectionResult (msg)
207
- dataManagementService ! FinishWork (request.key)
208
- }
209
- .recover {
210
- // if there is no lease, reissue it and retry immediately
211
- case t : StatusRuntimeException =>
212
- logging.warn(this , s " a lease is expired while leader election, reissue it: $t" )
213
- lease = None
214
- leaseService ! GetLease
215
- sendMessageToSelfAfter(request, retryInterval)
216
-
217
- // it should retry forever until the data is stored
218
- case t : Throwable =>
219
- logging.warn(this , s " unexpected error happened: $t, retry storing data " )
220
- sendMessageToSelfAfter(request, retryInterval)
221
- }
222
- case None =>
223
- logging.warn(this , s " lease not found, retry storing data " )
224
- leaseService ! GetLease
225
- sendMessageToSelfAfter(request, retryInterval)
226
- }
227
-
228
- // only endpoint management
229
- case request : RegisterData =>
230
- lease match {
231
- case Some (l) =>
232
- etcdClient
233
- .put(request.key, request.value, l.id)
234
- .andThen {
235
- case Success (_) =>
236
- dataManagementService ! FinishWork (request.key)
237
- }
238
- .recover {
239
- // if there is no lease, reissue it and retry immediately
240
- case t : StatusRuntimeException =>
241
- logging.warn(this , s " a lease is expired while registering data ${request.key}, reissue it: $t" )
242
- lease = None
243
- leaseService ! GetLease
244
- sendMessageToSelfAfter(request, retryInterval)
245
-
246
- // it should retry forever until the data is stored
247
- case t : Throwable =>
248
- logging.warn(this , s " unexpected error happened: $t, retry storing data ${request.key}" )
249
- sendMessageToSelfAfter(request, retryInterval)
250
- }
251
- case None =>
252
- logging.warn(this , s " lease not found, retry storing data ${request.key}" )
253
- leaseService ! GetLease
254
- sendMessageToSelfAfter(request, retryInterval)
255
- }
256
-
257
- // it stores the data iif there is no such one
258
- case request : RegisterInitialData =>
259
- lease match {
260
- case Some (l) =>
261
- etcdClient
262
- .putTxn(request.key, request.value, 0 , l.id)
263
- .map { res =>
264
- dataManagementService ! FinishWork (request.key)
265
- if (res.getSucceeded) {
266
- logging.info(this , s " initial data storing succeeds for ${request.key}" )
267
- request.recipient.map(_ ! InitialDataStorageResults (request.key, Right (Done ())))
268
- } else {
269
- logging.info(this , s " data is already stored for: $request, cancel the initial data storing " )
270
- request.recipient.map(_ ! InitialDataStorageResults (request.key, Left (AlreadyExist ())))
271
- }
272
- }
273
- .recover {
274
- // if there is no lease, reissue it and retry immediately
275
- case t : StatusRuntimeException =>
276
- logging.warn(
277
- this ,
278
- s " a lease is expired while registering an initial data ${request.key}, reissue it: $t" )
279
- lease = None
280
- leaseService ! GetLease
281
- sendMessageToSelfAfter(request, retryInterval)
282
-
283
- // it should retry forever until the data is stored
284
- case t : Throwable =>
285
- logging.warn(this , s " unexpected error happened: $t, retry storing data for ${request.key}" )
286
- sendMessageToSelfAfter(request, retryInterval)
287
- }
288
- case None =>
289
- logging.warn(this , s " lease not found, retry storing data for ${request.key}" )
290
- leaseService ! GetLease
291
- sendMessageToSelfAfter(request, retryInterval)
292
- }
293
-
294
- case msg : WatcherClosed =>
295
- etcdClient
296
- .del(msg.key)
297
- .andThen {
298
- case Success (_) =>
299
- dataManagementService ! FinishWork (msg.key)
300
- }
301
- .recover {
302
- // if there is no lease, reissue it and retry immediately
303
- case t : StatusRuntimeException =>
304
- logging.warn(this , s " a lease is expired while deleting data ${msg.key}, reissue it: $t" )
305
- lease = None
306
- leaseService ! GetLease
307
- sendMessageToSelfAfter(msg, retryInterval)
308
-
309
- // it should retry forever until the data is stored
310
- case t : Throwable =>
311
- logging.warn(this , s " unexpected error happened: $t, retry storing data for ${msg.key}" )
312
- sendMessageToSelfAfter(msg, retryInterval)
313
- }
314
-
315
- }
316
-
317
- private def sendMessageToSelfAfter (msg : Any , retryInterval : FiniteDuration ) = {
318
- actorSystem.scheduler.scheduleOnce(retryInterval, self, msg)
319
- }
320
- }
321
-
322
- object EtcdWorker {
323
- def props (etcdClient : EtcdClient , leaseService : ActorRef )(implicit ec : ExecutionContext ,
324
- actorSystem : ActorSystem ,
325
- logging : Logging ): Props = {
326
- Props (new EtcdWorker (etcdClient, leaseService))
327
- }
328
- }
0 commit comments