Michael Kublin has uploaded a new change for review. Change subject: engine: Making increase of storage pool master domain version atomic operation ......................................................................
engine: Making increase of storage pool master domain version atomic operation The following patch should make an increase of master storage domain version atomic operation. These is done in order to prevent races and need for cache reload and also to make code simple Change-Id: Iaa2657ddfdbf2400f24341b07ab60743d6430481 Signed-off-by: Michael Kublin <mkub...@redhat.com> --- M backend/manager/dbscripts/storages_sp.sql M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStoragePoolWithStoragesCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHandlingCommandBase.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/SimpleJdbcCallsHandler.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAO.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java D backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAOHibernateImpl.java D backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOHibernateImplTest.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOTest.java 11 files changed, 48 insertions(+), 134 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/00/11500/1 diff --git a/backend/manager/dbscripts/storages_sp.sql b/backend/manager/dbscripts/storages_sp.sql index 1fe56ee..a2f1cb1 100644 --- a/backend/manager/dbscripts/storages_sp.sql +++ b/backend/manager/dbscripts/storages_sp.sql @@ -83,6 +83,22 @@ END; $procedure$ LANGUAGE plpgsql; +Create or replace FUNCTION Increase_storage_pool_master_version( + v_id UUID) +RETURNS INTEGER + AS $procedure$ +DECLARE v_master_domain_version INTEGER; +BEGIN + UPDATE storage_pool + SET + master_domain_version = master_domain_version + 1 + WHERE id = v_id + RETURNING master_domain_version into v_master_domain_version; + + RETURN v_master_domain_version; +END; $procedure$ +LANGUAGE plpgsql; + Create or replace FUNCTION Deletestorage_pool(v_id UUID) RETURNS VOID AS $procedure$ diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStoragePoolWithStoragesCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStoragePoolWithStoragesCommand.java index ef6d013..438fcaf 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStoragePoolWithStoragesCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStoragePoolWithStoragesCommand.java @@ -169,15 +169,12 @@ if (!staticDomainChanged) { getCompensationContext().snapshotEntity(staticDomain); } - // increase master domain version - no need to snapshot, as we would like - // the master domain version to grow monotonously even if the wrapping transaction fails - getStoragePool().setmaster_domain_version(getStoragePool().getmaster_domain_version() + 1); storageDomain.setstorage_domain_type(StorageDomainType.Master); staticDomainChanged = true; masterStorageDomain = storageDomain; // The update of storage pool should be without compensation, // this is why we run it in a different SUPRESS transaction. - updateStoragePoolInDiffTransaction(); + updateStoragePoolMasterDomainVersionInDiffTransaction(); } if (staticDomainChanged) { getStorageDomainStaticDAO().update(staticDomain); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java index 83d0967..136cca7 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java @@ -266,8 +266,6 @@ @Override public Object runInTransaction() { StoragePoolIsoMap newMasterMap = newMaster.getStoragePoolIsoMapData(); - // We do not need to compensate storage pool, it will be committed if run during reconstruct - getStoragePool().setmaster_domain_version(getStoragePool().getmaster_domain_version() + 1); newMaster.getStorageStaticData().setLastTimeUsedAsMaster(System.currentTimeMillis()); getCompensationContext().snapshotEntity(newMaster.getStorageStaticData()); newMaster.setstorage_domain_type(StorageDomainType.Master); @@ -292,7 +290,7 @@ } else { _isLastMaster = true; } - updateStoragePoolInDiffTransaction(); + updateStoragePoolMasterDomainVersionInDiffTransaction(); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHandlingCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHandlingCommandBase.java index 9153355..033f138 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHandlingCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageHandlingCommandBase.java @@ -65,11 +65,12 @@ return getVdsDAO().getAllForStoragePoolAndStatus(getStoragePool().getId(), VDSStatus.Up); } - protected void updateStoragePoolInDiffTransaction() { - executeInScope(TransactionScopeOption.Suppress, new TransactionMethod<Object>() { + protected void updateStoragePoolMasterDomainVersionInDiffTransaction() { + executeInScope(TransactionScopeOption.Suppress, new TransactionMethod<Void>() { @Override - public Object runInTransaction() { - getStoragePoolDAO().update(getStoragePool()); + public Void runInTransaction() { + int master_domain_version = getStoragePoolDAO().increaseStoragePoolMasterVersion(getStoragePool().getId()); + getStoragePool().setmaster_domain_version(master_domain_version); return null; } }); diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/SimpleJdbcCallsHandler.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/SimpleJdbcCallsHandler.java index 0021328..e9540fc 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/SimpleJdbcCallsHandler.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/SimpleJdbcCallsHandler.java @@ -37,19 +37,19 @@ return executeImpl(procedureName, paramSource, createCallForModification(procedureName)); } - public int executeModificationRowsAffected(final String procedureName, final MapSqlParameterSource paramSource) { - Integer numOfRows = null; + public int executeModificationReturnResult(final String procedureName, final MapSqlParameterSource paramSource) { + Integer procedureResult = null; Map<String, Object> result = executeImpl(procedureName, paramSource, createCallForModification(procedureName)); if (!result.isEmpty()) { List<?> resultArray = (List<?>) result.values().iterator().next(); if (resultArray != null && !resultArray.isEmpty()) { Map<?, ?> resultMap = (Map<?, ?>) resultArray.get(0); if (!resultMap.isEmpty()) { - numOfRows = (Integer) resultMap.values().iterator().next(); + procedureResult = (Integer) resultMap.values().iterator().next(); } } } - return (numOfRows != null) ? numOfRows : 0; + return (procedureResult != null) ? procedureResult : 0; } public <T> T executeRead(final String procedureName, diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java index ae4c88e..d21158c 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/AsyncTaskDAODbFacadeImpl.java @@ -175,7 +175,7 @@ MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() .addValue("task_id", id); - return getCallsHandler().executeModificationRowsAffected("Deleteasync_tasks", parameterSource); + return getCallsHandler().executeModificationReturnResult("Deleteasync_tasks", parameterSource); } @Override diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAO.java index c04d0ef..b0df866 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAO.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAO.java @@ -16,6 +16,13 @@ public interface StoragePoolDAO extends GenericDao<storage_pool, Guid>, StatusAwareDao<Guid, StoragePoolStatus>, SearchDAO<storage_pool> { /** + * Increase master_domain_version of storage pool in DB and return a new value + * @param id + * @return + */ + int increaseStoragePoolMasterVersion(Guid id); + + /** * Retrieves the storage pool with the given ID, with optional filtering * @param ID * The ID of the storage pool diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java index cd5ee77..6f4aa17 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java @@ -3,7 +3,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; - import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum; import org.ovirt.engine.core.common.businessentities.StorageFormatType; @@ -381,4 +380,11 @@ mapper, parameterSource); } + @Override + public int increaseStoragePoolMasterVersion(Guid id) { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() + .addValue("id", id); + return getCallsHandler().executeModificationReturnResult("Increase_storage_pool_master_version", parameterSource); + } + } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAOHibernateImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAOHibernateImpl.java deleted file mode 100644 index 5a5cb11..0000000 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAOHibernateImpl.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.ovirt.engine.core.dao; - -import java.util.List; - -import org.hibernate.Query; -import org.hibernate.Session; -import org.hibernate.criterion.Restrictions; -import org.ovirt.engine.core.common.businessentities.ActionGroup; -import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; -import org.ovirt.engine.core.common.businessentities.StorageType; -import org.ovirt.engine.core.common.businessentities.storage_pool; -import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.compat.NotImplementedException; - -public class StoragePoolDAOHibernateImpl extends BaseDAOHibernateImpl<storage_pool, Guid> implements StoragePoolDAO { - public StoragePoolDAOHibernateImpl() { - super(storage_pool.class); - } - - @Override - public storage_pool get(Guid ID, Guid userID, boolean isFiltered) { - throw new NotImplementedException(); - } - - @Override - public storage_pool getForVds(final Guid vds) { - Session session = getSession(); - Query query = session.getNamedQuery("all_storage_pools_for_vds"); - query.setParameter("vds_id", vds); - return (storage_pool) query.uniqueResult(); - } - - @Override - public storage_pool getForVdsGroup(final Guid vdsGroup) { - Session session = getSession(); - Query query = session.getNamedQuery("all_storage_pools_for_vds_group"); - - query.setParameter("vds_group_id", vdsGroup); - - return (storage_pool) query.uniqueResult(); - } - - @Override - public List<storage_pool> getAll(Guid userID, boolean isFiltered) { - throw new NotImplementedException(); - } - - @Override - public List<storage_pool> getAllOfType(final StorageType type) { - return findByCriteria(Restrictions.eq("storagePoolType", type.getValue())); - } - - @SuppressWarnings("unchecked") - @Override - public List<storage_pool> getAllForStorageDomain(final Guid storageDomain) { - Session session = getSession(); - Query query = session.getNamedQuery("all_storage_pools_for_storage_domain"); - - query.setParameter("storage_domain_id", storageDomain); - - return query.list(); - } - - @SuppressWarnings("unchecked") - @Override - public List<storage_pool> getAllWithQuery(final String queryString) { - Session session = getSession(); - Query query = session.createQuery(queryString); - - return query.list(); - } - - @Override - public void updateStatus(Guid id, StoragePoolStatus status) { - // TODO Auto-generated method stub - - } - - @Override - public void updatePartial(storage_pool pool) { - // TODO Auto-generated method stub - - } - - @SuppressWarnings("unchecked") - @Override - public List<storage_pool> getDataCentersWithPermittedActionOnClusters(Guid userId, ActionGroup actionGroup) { - Query query = getSession().getNamedQuery("fn_perms_get_storage_pools_with_permitted_action_on_vds_groups"); - - query.setParameter("v_user_id", userId).setParameter("v_action_group_id", actionGroup.getId()); - - return (List<storage_pool>) query.uniqueResult(); - } - - @Override - public List<storage_pool> getAllByStatus(StoragePoolStatus status) { - // TODO Auto-generated method stub - return null; - } -} diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOHibernateImplTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOHibernateImplTest.java deleted file mode 100644 index 93d23be..0000000 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOHibernateImplTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.ovirt.engine.core.dao; - -import org.junit.Test; -import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.compat.NotImplementedException; - -/** - * A sparse test case for {@link StoragePoolHibernateImpl} - * intended to fail once we start implementing actual methods - */ -public class StoragePoolDAOHibernateImplTest { - - @Test(expected = NotImplementedException.class) - public void testUnimplementedMethod() { - new StoragePoolDAOHibernateImpl().get(new Guid(), new Guid(), true); - } -} diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOTest.java index f1ba402..1ac53c8 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/StoragePoolDAOTest.java @@ -279,6 +279,12 @@ assertGetResult(result); } + @Test + public void testIncreaseStoragePoolMasterVersion() { + int result = dao.increaseStoragePoolMasterVersion(existingPool.getId()); + assertEquals(result, existingPool.getmaster_domain_version() + 1); + } + /** * Ensures that removing a storage pool works as expected. */ -- To view, visit http://gerrit.ovirt.org/11500 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iaa2657ddfdbf2400f24341b07ab60743d6430481 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Michael Kublin <mkub...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches