Juan Hernandez has uploaded a new change for review. Change subject: [WIP] Move logic out of stored procedures ......................................................................
[WIP] Move logic out of stored procedures If one day we want to be able to use a database other than PostgreSQL we need to move SQL code out of the stored procedures. This patch is an example of moving the SQL code related to the Data Center entity to the corresponding DAO. Change-Id: I8b030d3a2ee645a58245231b2c03e6abb3927f0c Signed-off-by: Juan Hernandez <juan.hernan...@redhat.com> --- M backend/manager/dbscripts/storages_sp.sql M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/BaseDAODbFacade.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StoragePoolDAODbFacadeImpl.java M backend/manager/modules/dal/src/main/modules/org/ovirt/engine/core/dal/main/module.xml 4 files changed, 386 insertions(+), 330 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/47/13347/1 diff --git a/backend/manager/dbscripts/storages_sp.sql b/backend/manager/dbscripts/storages_sp.sql index 3952922..680b6e2 100644 --- a/backend/manager/dbscripts/storages_sp.sql +++ b/backend/manager/dbscripts/storages_sp.sql @@ -3,86 +3,6 @@ -- -Create or replace FUNCTION Insertstorage_pool(v_description VARCHAR(4000), - v_id UUID, - v_name VARCHAR(40), - v_storage_pool_type INTEGER, - v_status INTEGER, - v_master_domain_version INTEGER, - v_spm_vds_id UUID , - v_compatibility_version VARCHAR(40), - v_quota_enforcement_type INTEGER) -RETURNS VOID - AS $procedure$ -BEGIN -INSERT INTO storage_pool(description, id, name, storage_pool_type,status,master_domain_version,spm_vds_id,compatibility_version,quota_enforcement_type) - VALUES(v_description, v_id, v_name, v_storage_pool_type,v_status,v_master_domain_version,v_spm_vds_id,v_compatibility_version,v_quota_enforcement_type); -END; $procedure$ -LANGUAGE plpgsql; - - - - - -Create or replace FUNCTION Updatestorage_pool(v_description VARCHAR(4000), - v_id UUID, - v_name VARCHAR(40), - v_storage_pool_type INTEGER, - v_status INTEGER, - v_storage_pool_format_type VARCHAR(50), - v_master_domain_version INTEGER, - v_spm_vds_id UUID , - v_compatibility_version VARCHAR(40), - v_quota_enforcement_type INTEGER) -RETURNS VOID - - --The [storage_pool] table doesn't have a timestamp column. Optimistic concurrency logic cannot be generated - AS $procedure$ -BEGIN - UPDATE storage_pool - SET description = v_description,name = v_name,storage_pool_type = v_storage_pool_type, - status = v_status,storage_pool_format_type = v_storage_pool_format_type,master_domain_version = v_master_domain_version, - spm_vds_id = v_spm_vds_id,compatibility_version = v_compatibility_version, - _update_date = LOCALTIMESTAMP,quota_enforcement_type=v_quota_enforcement_type - WHERE id = v_id; -END; $procedure$ -LANGUAGE plpgsql; - -Create or replace FUNCTION Updatestorage_pool_partial(v_description VARCHAR(4000), - v_id UUID, - v_name VARCHAR(40), - v_storage_pool_type INTEGER, - v_storage_pool_format_type VARCHAR(50), - v_compatibility_version VARCHAR(40), - v_quota_enforcement_type INTEGER) -RETURNS VOID - - --The [storage_pool] table doesn't have a timestamp column. Optimistic concurrency logic cannot be generated - AS $procedure$ -BEGIN - UPDATE storage_pool - SET description = v_description,name = v_name,storage_pool_type = v_storage_pool_type, - storage_pool_format_type = v_storage_pool_format_type,compatibility_version = v_compatibility_version, - _update_date = LOCALTIMESTAMP,quota_enforcement_type = v_quota_enforcement_type - WHERE id = v_id; -END; $procedure$ -LANGUAGE plpgsql; - -Create or replace FUNCTION Updatestorage_pool_status( - v_id UUID, - v_status INTEGER) -RETURNS VOID - - AS $procedure$ -BEGIN - UPDATE storage_pool - SET - status = v_status, - _update_date = LOCALTIMESTAMP - WHERE id = v_id; -END; $procedure$ -LANGUAGE plpgsql; - Create or replace FUNCTION IncreaseStoragePoolMasterVersion( v_id UUID) RETURNS INTEGER @@ -99,162 +19,7 @@ END; $procedure$ LANGUAGE plpgsql; -Create or replace FUNCTION Deletestorage_pool(v_id UUID) -RETURNS VOID - AS $procedure$ - DECLARE - v_val UUID; -BEGIN - -- Get (and keep) a shared lock with "right to upgrade to exclusive" - select vm_guid INTO v_val FROM vm_static where vm_guid in (select vm_guid from vms where storage_pool_id = v_id) FOR UPDATE; - DELETE - FROM snapshots - WHERE vm_id IN ( - SELECT vm_guid - FROM vms - WHERE storage_pool_id = v_id); - delete FROM vm_static where vm_guid in (select vm_guid from vms where storage_pool_id = v_id); - - -- Get (and keep) a shared lock with "right to upgrade to exclusive" - -- in order to force locking parent before children - select id INTO v_val FROM storage_pool WHERE id = v_id FOR UPDATE; - - DELETE FROM storage_pool - WHERE id = v_id; - - -- delete StoragePool permissions -- - DELETE FROM permissions where object_id = v_id; - -END; $procedure$ -LANGUAGE plpgsql; - - - - - -Create or replace FUNCTION GetAllFromstorage_pool(v_user_id UUID, v_is_filtered BOOLEAN) RETURNS SETOF storage_pool - AS $procedure$ -BEGIN - RETURN QUERY SELECT * - FROM storage_pool - WHERE (NOT v_is_filtered OR EXISTS (SELECT 1 - FROM user_storage_pool_permissions_view - WHERE user_id = v_user_id AND entity_id = id)); -END; $procedure$ -LANGUAGE plpgsql; - - - - - -Create or replace FUNCTION GetAllByStatus(v_status INTEGER) RETURNS SETOF storage_pool - AS $procedure$ -BEGIN - RETURN QUERY SELECT * - FROM storage_pool - WHERE status = v_status; -END; $procedure$ -LANGUAGE plpgsql; - - - - -Create or replace FUNCTION Getstorage_poolByid(v_id UUID, v_user_id UUID, v_is_filtered BOOLEAN) RETURNS SETOF storage_pool - AS $procedure$ -BEGIN - RETURN QUERY SELECT * - FROM storage_pool - WHERE id = v_id - AND (NOT v_is_filtered OR EXISTS (SELECT 1 - FROM user_storage_pool_permissions_view - WHERE user_id = v_user_id AND entity_id = v_id)); - - - -END; $procedure$ -LANGUAGE plpgsql; - - - - - -Create or replace FUNCTION Getstorage_poolByName(v_name VARCHAR(40)) -RETURNS SETOF storage_pool - AS $procedure$ -BEGIN - RETURN QUERY SELECT * - FROM storage_pool - WHERE name = v_name; -END; $procedure$ -LANGUAGE plpgsql; - - - - - -Create or replace FUNCTION Getstorage_poolsByType(v_storage_pool_type INTEGER) -RETURNS SETOF storage_pool - AS $procedure$ -BEGIN - RETURN QUERY SELECT * - FROM storage_pool - WHERE storage_pool_type = v_storage_pool_type; -END; $procedure$ -LANGUAGE plpgsql; - - - - - -Create or replace FUNCTION Getstorage_poolsByStorageDomainId(v_storage_domain_id UUID) -RETURNS SETOF storage_pool - AS $procedure$ -BEGIN - RETURN QUERY SELECT storage_pool.* - FROM storage_pool - inner join storage_pool_iso_map on storage_pool.id = storage_pool_iso_map.storage_pool_id - WHERE storage_pool_iso_map.storage_id = v_storage_domain_id; - -END; $procedure$ -LANGUAGE plpgsql; - - - - - -Create or replace FUNCTION Getstorage_poolsByVdsId(v_vdsId UUID) -RETURNS SETOF storage_pool - AS $procedure$ - DECLARE - v_clusterId UUID; -BEGIN -select vds_group_id INTO v_clusterId FROM Vds_static WHERE vds_id = v_vdsId; - RETURN QUERY SELECT * - FROM storage_pool - WHERE storage_pool.id in(select storage_pool_id - FROM vds_groups - WHERE vds_group_id = v_clusterId); - -END; $procedure$ -LANGUAGE plpgsql; - - - - - -Create or replace FUNCTION Getstorage_poolsByVdsGroupId(v_clusterId UUID) -RETURNS SETOF storage_pool - AS $procedure$ -BEGIN - RETURN QUERY SELECT * - FROM storage_pool - WHERE storage_pool.id in(select storage_pool_id - FROM vds_groups - WHERE vds_group_id = v_clusterId); - -END; $procedure$ -LANGUAGE plpgsql; diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/BaseDAODbFacade.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/BaseDAODbFacade.java index 79c7769..fbaaf68 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/BaseDAODbFacade.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/BaseDAODbFacade.java @@ -2,16 +2,25 @@ import java.sql.ResultSet; import java.sql.SQLException; +import java.util.List; +import org.apache.log4j.Logger; +import org.ovirt.engine.core.common.businessentities.Identifiable; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.NGuid; +import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.dbbroker.CustomMapSqlParameterSource; import org.ovirt.engine.core.dal.dbbroker.DbEngineDialect; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.SimpleJdbcCallsHandler; +import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.simple.ParameterizedRowMapper; public abstract class BaseDAODbFacade { + // The log: + private static final Logger log = Logger.getLogger(BaseDAODbFacade.class); protected JdbcTemplate jdbcTemplate; protected DbEngineDialect dialect; @@ -91,4 +100,70 @@ public void setDbFacade(DbFacade dbFacade) { this.dbFacade = dbFacade; } + + /** + * Replace the arguments with values acceptable for the JDBC driver. For + * example, enumerated values are replaced with their numeric value, + * versions are replaced with the corresponding string, etc. + */ + private void fixArgs(Object[] args) { + for (int i = 0; i < args.length; i++) { + if (args[i] instanceof NGuid) { + args[i] = ((NGuid) args[i]).getUuid(); + } + else if (args[i] instanceof Identifiable) { + args[i] = ((Identifiable) args[i]).getValue(); + } + else if (args[i] instanceof Version) { + args[i] = args[i].toString(); + } + } + } + + /** + * Sends the SQL statement and the values of the arguments to the log. + */ + private void logSql(String sql, Object... args) { + // This should be changed to DEBUG once we are confident that plain + // JDBC works correctly: + if (log.isInfoEnabled()) { + log.info("Running SQL statement \"" + sql + "\"."); + for (int i = 0; i < args.length; i++) { + Object arg = args[i]; + if (arg != null) { + log.info("Parameter " + i + " is \"" + args[i] + "\"."); + } + else { + log.info("Parameter " + i + " is null."); + } + } + } + } + + public <T> List<T> retrieveList(String sql, RowMapper<T> mapper, Object... args) throws DataAccessException { + logSql(sql, args); + fixArgs(args); + return jdbcTemplate.query(sql, mapper, args); + } + + public <T> T retrieveOne(String sql, RowMapper<T> mapper, Object... args) throws DataAccessException { + List<T> list = retrieveList(sql, mapper, args); + if (list.isEmpty()) { + return null; + } + if (list.size() > 1) { + log.warn("Expected 1 result, but SQL statement returned \"" + list.size() + "\"."); + } + return list.get(0); + } + + public Guid retrieveGuid(String sql, Object... args) throws DataAccessException { + return retrieveOne(sql, createGuidMapper(), args); + } + + public int update(String sql, Object... args) throws DataAccessException { + logSql(sql, args); + fixArgs(args); + return jdbcTemplate.update(sql, args); + } } 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 f8b7d0a..3014a67 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 @@ -2,6 +2,7 @@ import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Date; import java.util.List; import org.ovirt.engine.core.common.businessentities.ActionGroup; @@ -15,7 +16,6 @@ import org.ovirt.engine.core.compat.Version; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.simple.ParameterizedRowMapper; -import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; /** * <code>StoragePoolDAODbFacadeImpl</code> provides a concrete implementation of {@link StoragePoolDAO} based on code @@ -23,7 +23,6 @@ */ @SuppressWarnings("synthetic-access") public class StoragePoolDAODbFacadeImpl extends BaseDAODbFacade implements StoragePoolDAO { - private static final class StoragePoolRawMapper implements ParameterizedRowMapper<storage_pool> { @Override public storage_pool mapRow(ResultSet rs, int rowNum) @@ -48,155 +47,363 @@ } private static final ParameterizedRowMapper<storage_pool> mapper = new StoragePoolRawMapper(); - private static StorageFormatType getStorageFormatTypeForPool(ResultSet rs) throws SQLException { return StorageFormatType.forValue(rs.getString("storage_pool_format_type")); } @Override public storage_pool get(Guid id) { - return get(id, null, false); + String sql = + "select " + + "storage_pool.* " + + "from " + + "storage_pool " + + "where " + + "storage_pool.id = ?" + ; + return retrieveOne(sql, mapper, id); } @Override - public storage_pool get(Guid id, Guid userID, boolean isFiltered) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("id", id).addValue("user_id", userID).addValue("is_filtered", isFiltered); - return getCallsHandler().executeRead("Getstorage_poolByid", mapper, parameterSource); + public storage_pool get(Guid dataCenterId, Guid userId, boolean isFiltered) { + if (isFiltered) { + String sql = + "select " + + "storage_pool.* " + + "from " + + "storage_pool " + + "join " + + "user_storage_pool_permissions_view " + + "on " + + "storage_pool.id = user_storage_pool_permissions_view.entity_id " + + "where " + + "storage_pool.id = ? and " + + "user_storage_pool_permissions_view.user_id = ?" + ; + return retrieveOne(sql, mapper, dataCenterId, userId); + } + else { + return get(dataCenterId); + } } @Override public storage_pool getByName(String name) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("name", name); - return getCallsHandler().executeRead("Getstorage_poolByName", mapper, parameterSource); + String sql = + "select " + + "storage_pool.* " + + "from " + + "storage_pool " + + "where " + + "storage_pool.name = ?" + ; + return retrieveOne(sql, mapper, name); } @Override - public storage_pool getForVds(Guid vds) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("vdsId", vds); - return getCallsHandler().executeRead("Getstorage_poolsByVdsId", mapper, parameterSource); + public storage_pool getForVds(Guid hostId) { + // First retrieve the id of the cluster: + String sql = + "select " + + "vds_static.vds_group_id " + + "from " + + "vds_static " + + "where " + + "vds_static.vds_id = ?" + ; + Guid clusterId = retrieveOne(sql, createGuidMapper(), hostId); + + // Now retrieve the data center: + return getForVdsGroup(clusterId); } @Override - public storage_pool getForVdsGroup(Guid id) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("clusterId", id); - return getCallsHandler().executeRead("Getstorage_poolsByVdsGroupId", mapper, - parameterSource); + public storage_pool getForVdsGroup(Guid clusterId) { + String sql = + "select " + + "storage_pool.* " + + "from " + + "storage_pool " + + "where " + + "storage_pool.id in (" + + "select " + + "vds_groups.storage_pool_id " + + "from " + + "vds_groups " + + "where " + + "vds_groups.vds_group_id = ?" + + ")" + ; + return retrieveOne(sql, mapper, clusterId); } @Override public List<storage_pool> getAll() { - return getAll(null, false); + String sql = + "select " + + "storage_pool.* " + + "from " + + "storage_pool" + ; + return retrieveList(sql, mapper); } @Override public List<storage_pool> getAllByStatus(StoragePoolStatus status) { - MapSqlParameterSource parameterSource = - getCustomMapSqlParameterSource().addValue("status", status.getValue()); - - return getCallsHandler().executeReadList("GetAllByStatus", mapper, parameterSource); + String sql = + "select " + + "storage_pool.* " + + "from " + + "storage_pool " + + "where " + + "storage_pool.status = ?" + ; + return retrieveList(sql, mapper, status); } @Override - public List<storage_pool> getAll(Guid userID, boolean isFiltered) { - MapSqlParameterSource parameterSource = - getCustomMapSqlParameterSource().addValue("user_id", userID).addValue("is_filtered", isFiltered); - return getCallsHandler().executeReadList("GetAllFromstorage_pool", mapper, parameterSource); + public List<storage_pool> getAll(Guid userId, boolean isFiltered) { + if (isFiltered) { + String sql = + "select " + + "storage_pool.* " + + "from " + + "storage_pool " + + "join " + + "user_storage_pool_permissions_view " + + "on " + + "storage_pool.id = user_storage_pool_permissions_view.entity_id" + + "where " + + "user_storage_pool_permissions_view.user_id = ?" + ; + return retrieveList(sql, mapper, userId); + } + else { + return getAll(); + } } @Override public List<storage_pool> getAllOfType(StorageType type) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("storage_pool_type", type); - return getCallsHandler().executeReadList("Getstorage_poolsByType", mapper, parameterSource); + String sql = + "select " + + "storage_pool.* " + + "from " + + "storage_pool " + + "where " + + "storage_pool.storage_pool_type = ?" + ; + return retrieveList(sql, mapper, type); } @Override - public List<storage_pool> getAllForStorageDomain(Guid id) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("storage_domain_id", id); - return getCallsHandler().executeReadList("Getstorage_poolsByStorageDomainId", mapper, - parameterSource); + public List<storage_pool> getAllForStorageDomain(Guid storageDomainId) { + String sql = + "select " + + "storage_pool.* " + + "from " + + "storage_pool " + + "inner join " + + "storage_pool_iso_map " + + "on " + + "storage_pool.id = storage_pool_iso_map.storage_pool_id " + + "where " + + "storage_pool_iso_map.storage_id = ?" + ; + return retrieveList(sql, mapper, storageDomainId); } @Override public List<storage_pool> getAllWithQuery(String query) { - return new SimpleJdbcTemplate(jdbcTemplate).query(query, mapper); + return retrieveList(query, mapper); } @Override public void save(storage_pool pool) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("description", pool.getdescription()) - .addValue("id", pool.getId()) - .addValue("name", pool.getname()) - .addValue("storage_pool_type", pool.getstorage_pool_type()) - .addValue("status", pool.getstatus()) - .addValue("master_domain_version", - pool.getmaster_domain_version()) - .addValue("spm_vds_id", pool.getspm_vds_id()) - .addValue("quota_enforcement_type", pool.getQuotaEnforcementType()) - .addValue("compatibility_version", - pool.getcompatibility_version()); - - getCallsHandler().executeModification("Insertstorage_pool", - parameterSource); + String sql = + "insert into storage_pool(" + + "description, " + + "id, " + + "name, " + + "storage_pool_type, " + + "status, " + + "master_domain_version, " + + "spm_vds_id, " + + "compatibility_version, " + + "quota_enforcement_type" + + ") " + + "values (" + + "?, ?, ?, ?, ?, ?, ?, ?, ?" + + ")" + ; + update( + sql, + pool.getdescription(), + pool.getId(), + pool.getname(), + pool.getstorage_pool_type(), + pool.getstatus(), + pool.getmaster_domain_version(), + pool.getspm_vds_id(), + pool.getcompatibility_version(), + pool.getQuotaEnforcementType() + ); } @Override public void update(storage_pool pool) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("description", pool.getdescription()) - .addValue("id", pool.getId()) - .addValue("name", pool.getname()) - .addValue("storage_pool_type", pool.getstorage_pool_type()) - .addValue("status", pool.getstatus()) - .addValue("storage_pool_format_type", pool.getStoragePoolFormatType()) - .addValue("master_domain_version", - pool.getmaster_domain_version()) - .addValue("spm_vds_id", pool.getspm_vds_id()) - .addValue("compatibility_version", - pool.getcompatibility_version()) - .addValue("quota_enforcement_type", - pool.getQuotaEnforcementType().getValue()); - - getCallsHandler().executeModification("Updatestorage_pool", parameterSource); + String sql = + "update storage_pool set " + + "description = ?, " + + "name = ?, " + + "storage_pool_type = ?, " + + "status = ?, " + + "storage_pool_format_type = ?, " + + "master_domain_version = ?, " + + "spm_vds_id = ?, " + + "compatibility_version = ?, " + + "_update_date = ?, " + + "quota_enforcement_type = ? " + + "where " + + "id = ?" + ; + update( + sql, + pool.getdescription(), + pool.getname(), + pool.getstorage_pool_type(), + pool.getstatus(), + pool.getStoragePoolFormatType(), + pool.getmaster_domain_version(), + pool.getspm_vds_id(), + pool.getcompatibility_version(), + new Date(), + pool.getQuotaEnforcementType(), + pool.getId() + ); } @Override public void updatePartial(storage_pool pool) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("description", pool.getdescription()) - .addValue("id", pool.getId()) - .addValue("name", pool.getname()) - .addValue("storage_pool_type", pool.getstorage_pool_type()) - .addValue("storage_pool_format_type", pool.getStoragePoolFormatType()) - .addValue("compatibility_version", - pool.getcompatibility_version()) - .addValue("quota_enforcement_type", - pool.getQuotaEnforcementType().getValue()); - - getCallsHandler().executeModification("Updatestorage_pool_partial", parameterSource); + String sql = + "update storage_pool set " + + "description = ?, " + + "name = ?, " + + "storage_pool_type = ?, " + + "storage_pool_format_type = ?, " + + "compatibility_version = ?, " + + "_update_date = ?, " + + "quota_enforcement_type = ? " + + "where " + + "id = ? " + ; + update( + sql, + pool.getdescription(), + pool.getname(), + pool.getstorage_pool_type(), + pool.getStoragePoolFormatType(), + pool.getcompatibility_version(), + new Date(), + pool.getQuotaEnforcementType(), + pool.getId() + ); } @Override public void updateStatus(Guid id, StoragePoolStatus status) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("id", id) - .addValue("status", status); - getCallsHandler().executeModification("Updatestorage_pool_status", parameterSource); - + String sql = + "update storage_pool set " + + "status = ?, " + + "_update_date = ? " + + "where " + + "id = ?" + ; + update( + sql, + status, + new Date(), + id + ); } @Override public void remove(Guid id) { - MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() - .addValue("id", id); + // We will need this: + String sql = null; - getCallsHandler().executeModification("Deletestorage_pool", parameterSource); + // Get (and keep) a shared lock with "right to upgrade to exclusive": + sql = + "select " + + "vm_guid " + + "from " + + "vm_static " + + "where " + + "vm_guid in (" + + "select " + + "vm_guid " + + "from " + + "vms " + + "where " + + "storage_pool_id = ?" + + ")" + + "for update" + ; + retrieveGuid(sql, id); + sql = + "delete from snapshots "+ + "where " + + "vm_id in (" + + "select " + + "vm_guid " + + "from " + + "vms " + + "where " + + "storage_pool_id = ?" + + ")" + ; + update(sql, id); + sql = + "delete from vm_static " + + "where " + + "vm_guid in (" + + "select " + + "vm_guid " + + "from " + + "vms " + + "where " + + "storage_pool_id = ?" + + ")" + ; + update(sql, id); + + // Get (and keep) a shared lock with "right to upgrade to exclusive" + // in order to force locking parent before children: + sql = + "select " + + "id " + + "from " + + "storage_pool " + + "where " + + "id = ? " + + "for update" + ; + retrieveGuid(sql, id); + + sql = + "delete from storage_pool " + + "where " + + "id = ?" + ; + update(sql, id); + + // Delete StoragePool permissions: + sql = + "delete from permissions " + + "where " + + "object_id = ?" + ; + update(sql, id); } @Override @@ -222,11 +429,19 @@ @Override public List<storage_pool> getDataCentersByClusterService(boolean supportsVirtService, boolean supportsGlusterService) { - final MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource(); - parameterSource - .addValue("supports_virt_service", supportsVirtService) - .addValue("supports_gluster_service", supportsGlusterService); - return getCallsHandler().executeReadList("GetStoragePoolsByClusterService", mapper, parameterSource); + String sql = + "select " + + "storage_pool.* " + + "from " + + "storage_pool " + + "join " + + "vds_groups " + + "on " + + "storage_pool.id = vds_groups.id " + + "where " + + "(? and vds_groups.virt_service) or " + + "(? and vds_groups.gluster_service)" + ; + return retrieveList(sql, mapper, supportsVirtService, supportsGlusterService); } - } diff --git a/backend/manager/modules/dal/src/main/modules/org/ovirt/engine/core/dal/main/module.xml b/backend/manager/modules/dal/src/main/modules/org/ovirt/engine/core/dal/main/module.xml index 3ebd787..b79204d 100644 --- a/backend/manager/modules/dal/src/main/modules/org/ovirt/engine/core/dal/main/module.xml +++ b/backend/manager/modules/dal/src/main/modules/org/ovirt/engine/core/dal/main/module.xml @@ -10,6 +10,7 @@ <module name="javax.api"/> <module name="org.apache.commons.collections"/> <module name="org.apache.commons.lang"/> + <module name="org.apache.log4j"/> <module name="org.ovirt.engine.core.common"/> <module name="org.ovirt.engine.core.compat"/> <module name="org.ovirt.engine.core.dependencies"/> -- To view, visit http://gerrit.ovirt.org/13347 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8b030d3a2ee645a58245231b2c03e6abb3927f0c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Juan Hernandez <juan.hernan...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches