Alexander Wels has uploaded a new change for review. Change subject: webadmin: optimize system tree queries. ......................................................................
webadmin: optimize system tree queries. - Previously the system tree would sequencially call methods to retrieve the data once the previous call was finished. This causes at least 7 distinct queries one after another. This patch optimizes the queries to 3 distinct queries and some in parallel. Change-Id: I304585d93de970030095919614ec13b2f46fc0ef Signed-off-by: Alexander Wels <aw...@redhat.com> --- M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java 1 file changed, 181 insertions(+), 167 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/63/25763/1 diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java index df4a370..60b6463 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java @@ -103,14 +103,14 @@ } } - private ArrayList<StoragePool> privateDataCenters; + private List<StoragePool> privateDataCenters; - public ArrayList<StoragePool> getDataCenters() + public List<StoragePool> getDataCenters() { return privateDataCenters; } - public void setDataCenters(ArrayList<StoragePool> value) + public void setDataCenters(List<StoragePool> value) { privateDataCenters = value; } @@ -196,156 +196,183 @@ } @Override - protected void syncSearch() - { + protected void syncSearch() { super.syncSearch(); + doDataCenterSearch(); + doClusterSearch(); + doHostSearch(); + doVolumeSearch(); + doProviderSearch(); + } + /** + * Create and run the query for all data centers. + */ + private void doDataCenterSearch() { final AsyncQuery dcQuery = new AsyncQuery(); dcQuery.setModel(this); dcQuery.asyncCallback = new INewAsyncCallback() { + @SuppressWarnings("unchecked") + @Override + public void onSuccess(Object model, Object result) { + final SystemTreeModel systemTreeModel = (SystemTreeModel) model; + systemTreeModel.setDataCenters((List<StoragePool>) result); + //These need to be here so we can get data center ids for use in the queries. + doNetworksSearch(); + } + }; + AsyncDataProvider.getDataCenterList(dcQuery); + } + + /** + * Create and run the query for all clusters. + */ + private void doClusterSearch() { + AsyncQuery clusterQuery = new AsyncQuery(); + clusterQuery.setModel(this); + clusterQuery.asyncCallback = new INewAsyncCallback() { + @SuppressWarnings("unchecked") @Override public void onSuccess(Object model, Object result) { - final SystemTreeModel systemTreeModel = (SystemTreeModel) model; - systemTreeModel.setDataCenters((ArrayList<StoragePool>) result); + SystemTreeModel systemTreeModel = (SystemTreeModel) model; + List<VDSGroup> clusters = (List<VDSGroup>) result; - AsyncQuery clusterQuery = new AsyncQuery(); - clusterQuery.setModel(systemTreeModel); - clusterQuery.asyncCallback = new INewAsyncCallback() { - @Override - public void onSuccess(Object model1, Object result1) - { - SystemTreeModel systemTreeModel1 = (SystemTreeModel) model1; - ArrayList<VDSGroup> clusters = (ArrayList<VDSGroup>) result1; - - systemTreeModel1.setClusterMap(new HashMap<Guid, ArrayList<VDSGroup>>()); - for (VDSGroup cluster : clusters) - { - if (cluster.getStoragePoolId() != null) - { - Guid key = cluster.getStoragePoolId(); - if (!systemTreeModel1.getClusterMap().containsKey(key)) - { - systemTreeModel1.getClusterMap().put(key, new ArrayList<VDSGroup>()); - } - ArrayList<VDSGroup> list1 = systemTreeModel1.getClusterMap().get(key); - list1.add(cluster); - } + systemTreeModel.setClusterMap(new HashMap<Guid, ArrayList<VDSGroup>>()); + for (VDSGroup cluster : clusters) { + if (cluster.getStoragePoolId() != null) { + Guid key = cluster.getStoragePoolId(); + if (!systemTreeModel.getClusterMap().containsKey(key)) { + systemTreeModel.getClusterMap().put(key, new ArrayList<VDSGroup>()); } - AsyncQuery hostQuery = new AsyncQuery(); - hostQuery.setModel(systemTreeModel1); - hostQuery.asyncCallback = new INewAsyncCallback() { - @Override - public void onSuccess(Object model2, Object result2) - { - SystemTreeModel systemTreeModel2 = (SystemTreeModel) model2; - ArrayList<VDS> hosts = (ArrayList<VDS>) result2; - systemTreeModel2.setHostMap(new HashMap<Guid, ArrayList<VDS>>()); - for (VDS host : hosts) - { - Guid key = host.getVdsGroupId(); - if (!systemTreeModel2.getHostMap().containsKey(key)) - { - systemTreeModel2.getHostMap().put(key, new ArrayList<VDS>()); - } - ArrayList<VDS> list = systemTreeModel2.getHostMap().get(key); - list.add(host); - } - - AsyncQuery volumeQuery = new AsyncQuery(); - volumeQuery.setModel(systemTreeModel2); - volumeQuery.asyncCallback = new INewAsyncCallback() { - @Override - public void onSuccess(Object model3, Object result3) - { - SystemTreeModel systemTreeModel3 = (SystemTreeModel) model3; - ArrayList<GlusterVolumeEntity> volumes = - (ArrayList<GlusterVolumeEntity>) result3; - systemTreeModel3.setVolumeMap(new HashMap<Guid, ArrayList<GlusterVolumeEntity>>()); - - for (GlusterVolumeEntity volume : volumes) - { - Guid key = volume.getClusterId(); - if (!systemTreeModel3.getVolumeMap().containsKey(key)) - { - systemTreeModel3.getVolumeMap().put(key, - new ArrayList<GlusterVolumeEntity>()); - } - ArrayList<GlusterVolumeEntity> list = - systemTreeModel3.getVolumeMap().get(key); - list.add(volume); - } - - - // Networks - ArrayList<VdcQueryType> queryTypeList = - new ArrayList<VdcQueryType>(); - ArrayList<VdcQueryParametersBase> queryParamList = - new ArrayList<VdcQueryParametersBase>(); - - for (StoragePool dataCenter : systemTreeModel.getDataCenters()) - { - queryTypeList.add(VdcQueryType.GetAllNetworks); - queryParamList.add(new IdQueryParameters(dataCenter.getId())); - } - - Frontend.getInstance().runMultipleQueries(queryTypeList, queryParamList, new IFrontendMultipleQueryAsyncCallback() { - - @Override - public void executed(FrontendMultipleQueryAsyncResult result) { - - systemTreeModel.setNetworkMap(new HashMap<Guid, List<Network>>()); - - List<VdcQueryReturnValue> returnValueList = result.getReturnValues(); - List<Network> dcNetworkList; - Guid dcId; - - for (int i = 0; i < returnValueList.size(); i++) - { - VdcQueryReturnValue returnValue = returnValueList.get(i); - if (returnValue.getSucceeded() && returnValue.getReturnValue() != null) - { - dcNetworkList = (List<Network>) returnValue.getReturnValue(); - dcId = systemTreeModel.getDataCenters().get(i).getId(); - systemTreeModel.getNetworkMap().put(dcId, dcNetworkList); - } - } - - // Storages - ArrayList<VdcQueryType> queryTypeList = - new ArrayList<VdcQueryType>(); - ArrayList<VdcQueryParametersBase> queryParamList = - new ArrayList<VdcQueryParametersBase>(); - - for (StoragePool dataCenter : systemTreeModel.getDataCenters()) - { - queryTypeList.add(VdcQueryType.GetStorageDomainsByStoragePoolId); - queryParamList.add(new IdQueryParameters(dataCenter.getId())); - } - if ((ApplicationModeHelper.getUiMode().getValue() & ApplicationMode.VirtOnly.getValue()) == 0) { - FrontendMultipleQueryAsyncResult dummyResult = - new FrontendMultipleQueryAsyncResult(); - VdcQueryReturnValue value = new VdcQueryReturnValue(); - value.setSucceeded(true); - dummyResult.getReturnValues().add(value); - SystemTreeModel.this.executed(dummyResult); - } else { - Frontend.getInstance().runMultipleQueries(queryTypeList, queryParamList, systemTreeModel); - } - } - }); - } - }; - AsyncDataProvider.getVolumeList(volumeQuery, null); - } - }; - AsyncDataProvider.getHostList(hostQuery); + List<VDSGroup> list = systemTreeModel.getClusterMap().get(key); + list.add(cluster); } - }; - AsyncDataProvider.getClusterList(clusterQuery); + } } }; + AsyncDataProvider.getClusterList(clusterQuery); + } + /** + * Create and run the query for all hosts. + */ + private void doHostSearch() { + AsyncQuery hostQuery = new AsyncQuery(); + hostQuery.setModel(this); + hostQuery.asyncCallback = new INewAsyncCallback() { + @SuppressWarnings("unchecked") + @Override + public void onSuccess(Object model, Object result) { + SystemTreeModel systemTreeModel = (SystemTreeModel) model; + List<VDS> hosts = (List<VDS>) result; + systemTreeModel.setHostMap(new HashMap<Guid, ArrayList<VDS>>()); + for (VDS host : hosts) { + Guid key = host.getVdsGroupId(); + if (!systemTreeModel.getHostMap().containsKey(key)) { + systemTreeModel.getHostMap().put(key, new ArrayList<VDS>()); + } + List<VDS> list = systemTreeModel.getHostMap().get(key); + list.add(host); + } + } + }; + AsyncDataProvider.getHostList(hostQuery); + } + + /** + * Create and run the query for all volumes. + */ + private void doVolumeSearch() { + AsyncQuery volumeQuery = new AsyncQuery(); + volumeQuery.setModel(this); + volumeQuery.asyncCallback = new INewAsyncCallback() { + @SuppressWarnings("unchecked") + @Override + public void onSuccess(Object model, Object result) { + final SystemTreeModel systemTreeModel = (SystemTreeModel) model; + List<GlusterVolumeEntity> volumes = (List<GlusterVolumeEntity>) result; + systemTreeModel.setVolumeMap(new HashMap<Guid, ArrayList<GlusterVolumeEntity>>()); + + for (GlusterVolumeEntity volume : volumes) { + Guid key = volume.getClusterId(); + if (!systemTreeModel.getVolumeMap().containsKey(key)) { + systemTreeModel.getVolumeMap().put(key, new ArrayList<GlusterVolumeEntity>()); + } + List<GlusterVolumeEntity> list = systemTreeModel.getVolumeMap().get(key); + list.add(volume); + } + } + }; + AsyncDataProvider.getVolumeList(volumeQuery, null); + } + + /** + * Create and run the query for all networks. + */ + private void doNetworksSearch() { + // Networks + ArrayList<VdcQueryType> queryTypeList = new ArrayList<VdcQueryType>(); + ArrayList<VdcQueryParametersBase> queryParamList = new ArrayList<VdcQueryParametersBase>(); + + for (StoragePool dataCenter : getDataCenters()) { + queryTypeList.add(VdcQueryType.GetAllNetworks); + queryParamList.add(new IdQueryParameters(dataCenter.getId())); + } + + Frontend.getInstance().runMultipleQueries(queryTypeList, queryParamList, + new IFrontendMultipleQueryAsyncCallback() { + + @SuppressWarnings("unchecked") + @Override + public void executed(FrontendMultipleQueryAsyncResult result) { + + setNetworkMap(new HashMap<Guid, List<Network>>()); + + List<VdcQueryReturnValue> returnValueList = result.getReturnValues(); + List<Network> dcNetworkList; + Guid dcId; + + for (int i = 0; i < returnValueList.size(); i++) { + VdcQueryReturnValue returnValue = returnValueList.get(i); + if (returnValue.getSucceeded() && returnValue.getReturnValue() != null) { + dcNetworkList = (List<Network>) returnValue.getReturnValue(); + dcId = getDataCenters().get(i).getId(); + getNetworkMap().put(dcId, dcNetworkList); + } + } + doStorageSearch(); + } + }); + } + + /** + * Create and run the query for all storage domains. + */ + private void doStorageSearch() { + // Storages + ArrayList<VdcQueryType> queryTypeList = new ArrayList<VdcQueryType>(); + ArrayList<VdcQueryParametersBase> queryParamList = new ArrayList<VdcQueryParametersBase>(); + + for (StoragePool dataCenter : getDataCenters()) { + queryTypeList.add(VdcQueryType.GetStorageDomainsByStoragePoolId); + queryParamList.add(new IdQueryParameters(dataCenter.getId())); + } + if ((ApplicationModeHelper.getUiMode().getValue() & ApplicationMode.VirtOnly.getValue()) == 0) { + FrontendMultipleQueryAsyncResult dummyResult = new FrontendMultipleQueryAsyncResult(); + VdcQueryReturnValue value = new VdcQueryReturnValue(); + value.setSucceeded(true); + dummyResult.getReturnValues().add(value); + SystemTreeModel.this.executed(dummyResult); + } else { + Frontend.getInstance().runMultipleQueries(queryTypeList, queryParamList, this); + } + } + + /** + * Create and run the query for all providers. + */ + private void doProviderSearch() { AsyncQuery providersQuery = new AsyncQuery(); providersQuery.setModel(this); providersQuery.asyncCallback = new INewAsyncCallback() { @@ -354,7 +381,6 @@ @Override public void onSuccess(Object model, Object returnValue) { setProviders((List<Provider>) returnValue); - AsyncDataProvider.getDataCenterList(dcQuery); } }; AsyncDataProvider.getAllProviders(providersQuery); @@ -407,7 +433,7 @@ @Override public void executed(FrontendMultipleQueryAsyncResult result) { - ArrayList<StorageDomain> storages = null; + List<StorageDomain> storageDomains = null; int count = -1; treeItemById = new HashMap<Guid, SystemTreeItemModel>(); @@ -425,14 +451,12 @@ systemItem.addChild(dataCentersItem); // Populate everything under Data Centers - for (VdcQueryReturnValue returnValue : result.getReturnValues()) - { + for (VdcQueryReturnValue returnValue : result.getReturnValues()) { ++count; - if (!returnValue.getSucceeded()) - { + if (!returnValue.getSucceeded()) { continue; } - storages = (ArrayList<StorageDomain>) returnValue.getReturnValue(); + storageDomains = (List<StorageDomain>) returnValue.getReturnValue(); SystemTreeItemModel dataCenterItem = new SystemTreeItemModel(); dataCenterItem.setType(SystemTreeItemType.DataCenter); @@ -448,12 +472,10 @@ storagesItem.setEntity(getDataCenters().get(count)); dataCenterItem.addChild(storagesItem); - if (storages != null && storages.size() > 0) - { + if (storageDomains != null && storageDomains.size() > 0) { // sort by name first - Collections.sort(storages, new Linq.StorageDomainComparator()); - for (StorageDomain storage : storages) - { + Collections.sort(storageDomains, new Linq.StorageDomainComparator()); + for (StorageDomain storage : storageDomains) { SystemTreeItemModel storageItem = new SystemTreeItemModel(); storageItem.setType(SystemTreeItemType.Storage); storageItem.setApplicationMode(ApplicationMode.VirtOnly); @@ -471,12 +493,10 @@ dataCenterItem.addChild(networksItem); List<Network> dcNetworks = getNetworkMap().get(getDataCenters().get(count).getId()); - if (dcNetworks != null) - { + if (dcNetworks != null) { // sort by name first Collections.sort(dcNetworks, new Linq.NetworkComparator()); - for (Network network : dcNetworks) - { + for (Network network : dcNetworks) { SystemTreeItemModel networkItem = new SystemTreeItemModel(); networkItem.setType(SystemTreeItemType.Network); networkItem.setApplicationMode(ApplicationMode.VirtOnly); @@ -500,12 +520,10 @@ clustersItem.setEntity(getDataCenters().get(count)); dataCenterItem.addChild(clustersItem); - if (getClusterMap().containsKey(getDataCenters().get(count).getId())) - { + if (getClusterMap().containsKey(getDataCenters().get(count).getId())) { List<VDSGroup> clusters = getClusterMap().get(getDataCenters().get(count).getId()); Collections.sort(clusters, new Linq.VDSGroupComparator()); - for (VDSGroup cluster : clusters) - { + for (VDSGroup cluster : clusters) { SystemTreeItemModel clusterItem = new SystemTreeItemModel(); clusterItem.setType(cluster.supportsGlusterService() ? SystemTreeItemType.Cluster_Gluster : SystemTreeItemType.Cluster); @@ -519,10 +537,8 @@ hostsItem.setEntity(cluster); clusterItem.addChild(hostsItem); - if (getHostMap().containsKey(cluster.getId())) - { - for (VDS host : getHostMap().get(cluster.getId())) - { + if (getHostMap().containsKey(cluster.getId())) { + for (VDS host : getHostMap().get(cluster.getId())) { SystemTreeItemModel hostItem = new SystemTreeItemModel(); hostItem.setType(SystemTreeItemType.Host); hostItem.setTitle(host.getName()); @@ -530,8 +546,7 @@ hostsItem.addChild(hostItem); } } - if (cluster.supportsGlusterService()) - { + if (cluster.supportsGlusterService()) { SystemTreeItemModel volumesItem = new SystemTreeItemModel(); volumesItem.setType(SystemTreeItemType.Volumes); volumesItem.setApplicationMode(ApplicationMode.GlusterOnly); @@ -551,8 +566,7 @@ } } - if (cluster.supportsVirtService()) - { + if (cluster.supportsVirtService()) { SystemTreeItemModel vmsItem = new SystemTreeItemModel(); vmsItem.setType(SystemTreeItemType.VMs); vmsItem.setApplicationMode(ApplicationMode.VirtOnly); -- To view, visit http://gerrit.ovirt.org/25763 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I304585d93de970030095919614ec13b2f46fc0ef Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Alexander Wels <aw...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches