All Downloads are FREE. Search and download functionalities are using the official Maven repository.

orbit.server.service.AddressableManagementService.kt Maven / Gradle / Ivy

/*
 Copyright (C) 2015 - 2019 Electronic Arts Inc.  All rights reserved.
 This file is part of the Orbit Project .
 See license in LICENSE.
 */

package orbit.server.service

import io.micrometer.core.instrument.Metrics
import orbit.server.concurrent.RuntimeScopes
import orbit.server.mesh.AddressableManager
import orbit.server.service.ServerAuthInterceptor.Keys.NODE_ID
import orbit.shared.proto.AddressableManagementImplBase
import orbit.shared.proto.AddressableManagementOuterClass
import orbit.shared.proto.toAddressableLeaseResponseProto
import orbit.shared.proto.toAddressableReference
import orbit.util.instrumentation.recordSuspended

class AddressableManagementService(
    private val addressableManager: AddressableManager,
    runtimeScopes: RuntimeScopes
) : AddressableManagementImplBase(runtimeScopes.ioScope.coroutineContext) {
    private val addressableLeaseRenewalTimer = Metrics.timer(Meters.Names.AddressableLeaseRenewalTimer)
    private val addressableLeaseAbandonTimer = Metrics.timer(Meters.Names.AddressableLeaseAbandonTimer)

    override suspend fun renewLease(request: AddressableManagementOuterClass.RenewAddressableLeaseRequestProto)
            : AddressableManagementOuterClass.RenewAddressableLeaseResponseProto =
        addressableLeaseRenewalTimer.recordSuspended {
            try {
                addressableManager.renewLease(
                    request.reference.toAddressableReference(),
                    NODE_ID.get()
                ).toAddressableLeaseResponseProto()
            } catch (t: Throwable) {
                t.toAddressableLeaseResponseProto()
            }
        }

    override suspend fun abandonLease(request: AddressableManagementOuterClass.AbandonAddressableLeaseRequestProto)
            : AddressableManagementOuterClass.AbandonAddressableLeaseResponseProto =
        addressableLeaseAbandonTimer.recordSuspended {
            val nodeId = NODE_ID.get()
            val reference = request.reference.toAddressableReference()
            val result = try {
                addressableManager.abandonLease(reference, nodeId)
            } catch (t: Throwable) {
                false
            }

            AddressableManagementOuterClass.AbandonAddressableLeaseResponseProto.newBuilder()
                .setAbandoned(result)
                .build()
        }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy