/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.gc; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.common.VdcUtil; import com.emc.storageos.db.client.GlobalLockItf; import com.emc.storageos.db.client.impl.DbClientImpl; import com.emc.storageos.db.client.impl.GlobalLockImpl; import com.emc.storageos.db.client.model.GlobalLock; import com.emc.storageos.db.client.model.DataObject; import com.emc.storageos.db.client.util.KeyspaceUtil; /** * Class schedules and runs GC job on geodb */ class GlobalGCExecutorLoop extends GarbageCollectionExecutorLoop { private static final String GEO_DB_GC_LOCK = "GEO_DB_GC_Lock"; private static final Logger log = LoggerFactory.getLogger(GlobalGCExecutorLoop.class); private static final String GeoLockName = "GeoGCLock"; private GlobalLockItf glock = null; private boolean locked = false; public GlobalGCExecutorLoop() { } @Override protected boolean preGC() { log.info("PrepareGC for geo DB"); dbClient.start(); VdcUtil.setDbClient(dbClient); locked = false; try { String myVdcId = VdcUtil.getLocalShortVdcId(); glock = new GlobalLockImpl((DbClientImpl) dbClient, GeoLockName, GlobalLock.GL_Mode.GL_VdcShared_MODE, 0, myVdcId); log.info("Set global VdcShared lock owner to {} vdcId={}", dbServiceId, myVdcId); glock.acquire(dbServiceId); locked = true; } catch (Exception e) { log.error("Failed to generate the global Geo GC lock e=", e); } log.info("Get global lock for Geo GC {}", locked); return locked; // get the lock } /** * * @param clazz the GC will run on * @param <T> * @return true if we can run GC on this class * **/ @Override protected <T extends DataObject> boolean canRunGCOnClass(Class<T> clazz) { return KeyspaceUtil.isGlobal(clazz); } /** * Generate the task to run GC on a class * * @param clazz the GC will run on * @return a GC task **/ @Override protected <T extends DataObject> GarbageCollectionRunnable genGCTask(Class<T> clazz) { return new GlobalGCRunnable(dbClient, clazz, dependencyTracker, gcDelayMins, coordinator); } @Override protected void postGC() { if (locked) { try { glock.release(dbServiceId); log.info("Release global lock for Geo GC"); locked = false; } catch (Exception e) { log.error("Failed to release the global Geo lock"); } } } @Override protected String getGCZKLockName() { return GEO_DB_GC_LOCK; } }