package org.ovirt.engine.core.vdsbroker.monitoring; import static java.util.stream.Collectors.toList; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; import org.ovirt.engine.core.common.businessentities.storage.LUNs; import org.ovirt.engine.core.common.businessentities.storage.LunDisk; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.DiskDao; import org.ovirt.engine.core.dao.LunDao; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton public class LunDisksMonitoring { @Inject private DiskDao diskDao; @Inject private LunDao lunDao; private static final Logger log = LoggerFactory.getLogger(LunDisksMonitoring.class); void process(Map<Guid, Map<String, LUNs>> vmIdToLunsMap) { if (vmIdToLunsMap.isEmpty()) { return; } List<LUNs> lunsToSave = vmIdToLunsMap.entrySet().stream() .map(entry -> getVmLunDisksToSave(entry.getKey(), entry.getValue())) .flatMap(List::stream) .collect(toList()); saveVmLunDisks(lunsToSave); } List<LUNs> getVmLunDisksToSave(Guid vmId, Map<String, LUNs> lunsMap) { if (lunsMap.isEmpty()) { // LUNs list from getVmStats hasn't been updated yet or VDSM doesn't support LUNs list retrieval. return Collections.emptyList(); } List<LUNs> vmLunDisksToSave = new ArrayList<>(); getVmPluggedLunsFromDb(vmId).forEach(lunFromDB -> { LUNs lunFromMap = lunsMap.get(lunFromDB.getId()); // LUN's device size might be returned as zero in case of an error in VDSM; // Hence, verify before updating. if (lunFromMap.getDeviceSize() != 0 && lunFromMap.getDeviceSize() != lunFromDB.getDeviceSize()) { // Found a mismatch - set LUN for update log.info("Updated LUN device size - ID: '{}', previous size: '{}', new size: '{}'.", lunFromDB.getLUNId(), lunFromDB.getDeviceSize(), lunFromMap.getDeviceSize()); lunFromDB.setDeviceSize(lunFromMap.getDeviceSize()); vmLunDisksToSave.add(lunFromDB); } }); return vmLunDisksToSave; } List<LUNs> getVmPluggedLunsFromDb(Guid vmId) { return diskDao.getAllForVm(vmId, true).stream() .filter(disk -> disk.getDiskStorageType() == DiskStorageType.LUN) .map(disk -> ((LunDisk) disk).getLun()) .collect(Collectors.toList()); } void saveVmLunDisks(List<LUNs> luns) { lunDao.updateAllInBatch(luns); } }