Daniel Erez has uploaded a new change for review. Change subject: core: synchronize lun device size on refreshLunsInfo ......................................................................
core: synchronize lun device size on refreshLunsInfo SyncLunsInfoForIscsiStorageDomainCommand: When detecting a mismatch in LUN device size, store the updated size data in DB. * Added 'updateLUNsDeviceSize' method to LunDAO. * Updated storages_san_sp.sql accordingly. Note: the command is invoked when activating iSCSI SD. Change-Id: I618880c7b49c226e39f0a0830f1d4f9b71a5f304 Bug-Url: https://bugzilla.redhat.com/961532 Signed-off-by: Daniel Erez <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/SyncLunsInfoForIscsiStorageDomainCommand.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/SyncLunsInfoForIscsiStorageDomainCommandTest.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/LunDAO.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/LunDAODbFacadeImpl.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/LunDAOTest.java M packaging/dbscripts/storages_san_sp.sql 6 files changed, 68 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/87/22887/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/SyncLunsInfoForIscsiStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/SyncLunsInfoForIscsiStorageDomainCommand.java index 9670081..7dc3564 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/SyncLunsInfoForIscsiStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/SyncLunsInfoForIscsiStorageDomainCommand.java @@ -49,9 +49,14 @@ protected void refreshLunsInfo(List<LUNs> lunsFromVgInfo, List<LUNs> lunsFromDb) { for (LUNs lunFromVgInfo : lunsFromVgInfo) { // Update LUN - if (getLunDao().get(lunFromVgInfo.getLUN_id()) == null) { + LUNs lunFromDB = getLunDao().get(lunFromVgInfo.getLUN_id()); + if (lunFromDB == null) { getLunDao().save(lunFromVgInfo); log.infoFormat("New LUN discovered, ID: {0}", lunFromVgInfo.getLUN_id()); + } + else if (lunFromDB.getDeviceSize() != lunFromVgInfo.getDeviceSize()) { + getLunDao().updateLUNsDeviceSize(lunFromVgInfo.getLUN_id(), lunFromVgInfo.getDeviceSize()); + log.infoFormat("Updated LUN device size, ID: {0}", lunFromVgInfo.getLUN_id()); } // Update lun connections map @@ -95,6 +100,10 @@ if (!lunFromDb.getLUN_id().equals(lunFromVgInfo.getLUN_id())) { return true; } + else if (lunFromDb.getDeviceSize() != lunFromVgInfo.getDeviceSize()) { + // Size mismatch detected - refresh info is needed + return true; + } } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/SyncLunsInfoForIscsiStorageDomainCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/SyncLunsInfoForIscsiStorageDomainCommandTest.java index 8792753..9eb4f33 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/SyncLunsInfoForIscsiStorageDomainCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/SyncLunsInfoForIscsiStorageDomainCommandTest.java @@ -70,4 +70,26 @@ boolean isMismatch = command.isLunsInfoMismatch(lunsFromVgInfo, lunsFromDb); assertFalse(isMismatch); } + + @Test + public void lunsMismatchDeviceSize() { + Guid pvID = Guid.newGuid(); + Guid lunID = Guid.newGuid(); + + LUNs lunFromVG = new LUNs(); + lunFromVG.setLUN_id(lunID.toString()); + lunFromVG.setphysical_volume_id(pvID.toString()); + lunFromVG.setDeviceSize(20); + + LUNs lunFromDB = new LUNs(); + lunFromDB.setLUN_id(lunID.toString()); + lunFromDB.setphysical_volume_id(pvID.toString()); + lunFromDB.setDeviceSize(10); + + List<LUNs> lunsFromVgInfo = Collections.singletonList(lunFromVG); + List<LUNs> lunsFromDb = Collections.singletonList(lunFromDB); + + boolean isMismatch = command.isLunsInfoMismatch(lunsFromVgInfo, lunsFromDb); + assertTrue(isMismatch); + } } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/LunDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/LunDAO.java index 45b12ba..9d404ee 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/LunDAO.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/LunDAO.java @@ -50,6 +50,11 @@ void updateLUNsVolumeGroupId(String id, String volumeGroupId); /** + * Updates the lun device size + */ + void updateLUNsDeviceSize(String id, int deviceSize); + + /** * Saves the supplied LUN instance. * * @param lun diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/LunDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/LunDAODbFacadeImpl.java index 8246525..f291e75 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/LunDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/LunDAODbFacadeImpl.java @@ -80,6 +80,14 @@ } @Override + public void updateLUNsDeviceSize(String id, int deviceSize) { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource().addValue("LUN_id", id) + .addValue("device_size", deviceSize); + + getCallsHandler().executeModification("updateLUNsDeviceSize", parameterSource); + } + + @Override public void save(LUNs lun) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("LUN_id", lun.getLUN_id()) diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/LunDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/LunDAOTest.java index 9a9f71d..0c804af 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/LunDAOTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/LunDAOTest.java @@ -85,6 +85,17 @@ } /** + * Ensures that LUN's device size is updated correctly + */ + @Test + public void testUpdateLUNsDeviceSize() { + int testDeviceSize = 20; + dao.updateLUNsDeviceSize(existingLUN.getLUN_id(), testDeviceSize); + LUNs dbLun = dao.get(existingLUN.getLUN_id()); + assertEquals("LUNs volume group id wasn't updated", testDeviceSize, dbLun.getDeviceSize()); + } + + /** * Ensures that an empty collection is returned. */ @Test diff --git a/packaging/dbscripts/storages_san_sp.sql b/packaging/dbscripts/storages_san_sp.sql index c46dd14..5f07bc8 100644 --- a/packaging/dbscripts/storages_san_sp.sql +++ b/packaging/dbscripts/storages_san_sp.sql @@ -36,6 +36,18 @@ +Create or replace FUNCTION UpdateLUNsDeviceSize(v_LUN_id VARCHAR(50), + v_device_size INTEGER) +RETURNS VOID + AS $procedure$ +BEGIN +UPDATE LUNs set device_size = v_device_size where LUN_id = v_LUN_ID; +END; $procedure$ +LANGUAGE plpgsql; + + + + Create or replace FUNCTION DeleteLUN(v_LUN_id VARCHAR(50)) RETURNS VOID -- To view, visit http://gerrit.ovirt.org/22887 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I618880c7b49c226e39f0a0830f1d4f9b71a5f304 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Daniel Erez <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
