package org.zstack.storage.fusionstor; import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.transaction.annotation.Transactional; import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.GLock; import javax.persistence.LockModeType; /** * Created by frank on 7/28/2015. */ @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE) public class FusionstorCapacityUpdater { @Autowired private DatabaseFacade dbf; @Autowired private PluginRegistry pluginRgty; public void update(String fsid, long total, long avail) { update(fsid, total, avail, true); } @Transactional public void update(String fsid, long total, long avail, boolean updatedAnyway) { FusionstorCapacityVO vo = dbf.getEntityManager().find(FusionstorCapacityVO.class, fsid, LockModeType.PESSIMISTIC_WRITE); boolean updated = false; if (vo == null) { GLock lock = new GLock(String.format("fusionstor-%s", fsid), 120); lock.lock(); try { vo = dbf.getEntityManager().find(FusionstorCapacityVO.class, fsid, LockModeType.PESSIMISTIC_WRITE); if (vo == null) { vo = new FusionstorCapacityVO(); vo.setFsid(fsid); vo.setTotalCapacity(total); vo.setAvailableCapacity(avail); dbf.getEntityManager().persist(vo); updated = true; } else { if (vo.getAvailableCapacity() != avail || vo.getTotalCapacity() != total) { vo.setTotalCapacity(total); vo.setAvailableCapacity(avail); dbf.getEntityManager().merge(vo); updated = true; } } } finally { lock.unlock(); } } else { if (vo.getAvailableCapacity() != avail || vo.getTotalCapacity() != total) { vo.setTotalCapacity(total); vo.setAvailableCapacity(avail); dbf.getEntityManager().merge(vo); updated = true; } } if (updatedAnyway || updated) { for (FusionstorCapacityUpdateExtensionPoint ext : pluginRgty.getExtensionList(FusionstorCapacityUpdateExtensionPoint.class)) { ext.update(fsid, total, avail); } } } }