Liron Aravot has uploaded a new change for review. Change subject: core: WIP: NPEs and wrong persisted information when reusing LUNs ......................................................................
core: WIP: NPEs and wrong persisted information when reusing LUNs Generally, the following issues caused that a created lun based storage domain existed on vdsm side while not having it's correct data in the DB which led to an NPE and wrong data shown to the user during execution of GetLunsByVgIdQuery. This patch fixes the following issues: 1. When removing a domain that used lun storage and there's a disk used by that lun - LUNs volume_group_id still contains the removed domain id which doesn't exist anymore. 2. When extending a domain to use an existing lun, the domain id isn't set to that lun which causes to NPE in GetLunsByVgIdQuery or wrong data provided to the user. 3. When creating a domain from an existing lun, the domain id isn't set to this lun which might causes to NPE in GetLunsByVgIdQuery or wrong data provided to the user. 4. When removing lun disk which isn't used as storage domain (and therefore - not used anymore), the lun remained in the DB. Change-Id: I38a0e3c68cb8bd80c2f78ee5aacfccc8c987a79e Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=875909 Signed-off-by: Liron Aravot <lara...@redhat.com> --- M backend/manager/dbscripts/storages_san_sp.sql M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddSANStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ExtendSANStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.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 8 files changed, 48 insertions(+), 3 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/29/9229/1 diff --git a/backend/manager/dbscripts/storages_san_sp.sql b/backend/manager/dbscripts/storages_san_sp.sql index dad6c9a..aeea92a 100644 --- a/backend/manager/dbscripts/storages_san_sp.sql +++ b/backend/manager/dbscripts/storages_san_sp.sql @@ -23,6 +23,19 @@ +Create or replace FUNCTION UpdateLUNsVolumeGroupId(v_LUN_id VARCHAR(50), +v_volume_group_id VARCHAR(50)) +RETURNS VOID + AS $procedure$ +BEGIN +UPDATE LUNs set volume_group_id = v_volume_group_id where LUN_id = v_LUN_ID; +END; $procedure$ +LANGUAGE plpgsql; + + + + + Create or replace FUNCTION DeleteLUN(v_LUN_id VARCHAR(50)) RETURNS VOID diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddSANStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddSANStorageDomainCommand.java index 59ed51e..41245b4 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddSANStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddSANStorageDomainCommand.java @@ -65,7 +65,7 @@ @Override public Void runInTransaction() { for (LUNs lun : luns) { - proceedLUNInDb(lun, getStorageDomain().getstorage_type()); + proceedLUNInDb(lun, getStorageDomain().getstorage_type(), getStorageDomain().getstorage()); } return null; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ExtendSANStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ExtendSANStorageDomainCommand.java index cd36ee8..4bf6b1e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ExtendSANStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ExtendSANStorageDomainCommand.java @@ -25,7 +25,7 @@ protected void executeCommand() { setStorageDomainStatus(StorageDomainStatus.Locked, null); for (LUNs lun : getParameters().getLunsList()) { - proceedLUNInDb(lun, getStorageDomain().getstorage_type()); + proceedLUNInDb(lun, getStorageDomain().getstorage_type(), getStorageDomain().getstorage()); } if (Backend .getInstance() diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java index 59057d1..17815f7 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ISCSIStorageHelper.java @@ -196,6 +196,8 @@ if (DbFacade.getInstance().getDiskLunMapDao().getDiskIdByLunId(lun.getLUN_id()) == null) { DbFacade.getInstance().getLunDao().remove(lun.getLUN_id()); numOfRemovedLuns++; + } else { + DbFacade.getInstance().getLunDao().updateLUNsVolumeGroupId(lun.getLUN_id(), ""); } } if (numOfRemovedLuns > 0) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java index b03719b..d984468 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java @@ -227,9 +227,16 @@ } public static void proceedLUNInDb(final LUNs lun, StorageType storageType) { + proceedLUNInDb(lun,storageType,""); + } + + public static void proceedLUNInDb(final LUNs lun, StorageType storageType, String volumeGroupId) { if (DbFacade.getInstance().getLunDao().get(lun.getLUN_id()) == null) { DbFacade.getInstance().getLunDao().save(lun); + } else if (!volumeGroupId.isEmpty()){ + DbFacade.getInstance().getLunDao().updateLUNsVolumeGroupId(lun.getLUN_id(), volumeGroupId); } + for (storage_server_connections connection : lun.getLunConnections()) { List<storage_server_connections> connections = DbFacade.getInstance() .getStorageServerConnectionDao().getAllForConnection(connection); 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 938b680..45b12ba 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 @@ -45,6 +45,11 @@ List<LUNs> getAll(); /** + * Updates the lun volume group id + */ + void updateLUNsVolumeGroupId(String id, String volumeGroupId); + + /** * 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 ebab1c1..daa6820 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 @@ -46,6 +46,14 @@ return getCallsHandler().executeRead("GetLUNByLUNId", MAPPER, parameterSource); } + @Override + public void updateLUNsVolumeGroupId(String id, String volumeGroupId) { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource().addValue("LUN_id", id) + .addValue("volume_group_id", volumeGroupId); + + getCallsHandler().executeModification("UpdateLUNsVolumeGroupId", parameterSource); + } + @SuppressWarnings("unchecked") @Override public List<LUNs> getAllForStorageServerConnection(String id) { @@ -55,7 +63,6 @@ return getCallsHandler().executeReadList("GetLUNsBystorage_server_connection", MAPPER, parameterSource); } - @SuppressWarnings("unchecked") @Override public List<LUNs> getAllForVolumeGroup(String id) { MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() 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 2c4436d..71c4c69 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 @@ -70,6 +70,17 @@ } /** + * Ensures that LUNs are returned for the connection. + */ + @Test + public void testUpdateLUNsVolumeGroupId() { + String testGroupId = "testvolgroupId"; + dao.updateLUNsVolumeGroupId(existingLUN.getLUN_id(), testGroupId); + LUNs dbLun = dao.get(existingLUN.getLUN_id()); + assertEquals("LUNs volume group id wasn't updated", testGroupId, dbLun.getvolume_group_id()); + } + + /** * Ensures that an empty collection is returned. */ @Test -- To view, visit http://gerrit.ovirt.org/9229 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I38a0e3c68cb8bd80c2f78ee5aacfccc8c987a79e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liron Aravot <lara...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches