From 2413eae6a5ab15c54c48817493d3064079621bcd Mon Sep 17 00:00:00 2001 From: anthony Date: Tue, 13 Dec 2011 16:47:52 -0800 Subject: [PATCH] SWIFT: fixed error handling --- .../resource/NfsSecondaryStorageResource.java | 28 ++++++++-- .../storage/download/DownloadMonitorImpl.java | 51 ++++--------------- .../com/cloud/storage/swift/SwiftManager.java | 2 + .../cloud/storage/swift/SwiftManagerImpl.java | 12 +++++ 4 files changed, 49 insertions(+), 44 deletions(-) diff --git a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java index 6af758805d6..9b4415daaf5 100755 --- a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java +++ b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java @@ -235,12 +235,23 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S command.add("cd " + lDir + ";/usr/bin/python /usr/local/cloud/systemvm/scripts/storage/secondary/swift -A " + swift.getUrl() + " -U " + swift.getAccount() + ":" + swift.getUserName() + " -K " + swift.getKey() + " upload " + container + " " + lFilename); - String result = command.execute(); + OutputInterpreter.AllLinesParser parser = new OutputInterpreter.AllLinesParser(); + String result = command.execute(parser); if (result != null) { String errMsg = "swiftUpload failed , err=" + result; s_logger.warn(errMsg); return errMsg; } + if (parser.getLines() != null) { + String[] lines = parser.getLines().split("\\n"); + for (String line : lines) { + if (line.contains("Errno")) { + String errMsg = "swiftUpload failed , err=" + lines.toString(); + s_logger.warn(errMsg); + return errMsg; + } + } + } return null; } @@ -259,7 +270,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S String errMsg = "swiftList failed , err=" + result; s_logger.warn(errMsg); } else { - String errMsg = "swiftList, no lines returns"; + String errMsg = "swiftList failed, no lines returns"; s_logger.warn(errMsg); } } @@ -272,12 +283,23 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S command.add("/usr/bin/python /usr/local/cloud/systemvm/scripts/storage/secondary/swift -A " + swift.getUrl() + " -U " + swift.getAccount() + ":" + swift.getUserName() + " -K " + swift.getKey() + " delete " + container + " " + rFilename); - String result = command.execute(); + OutputInterpreter.AllLinesParser parser = new OutputInterpreter.AllLinesParser(); + String result = command.execute(parser); if (result != null) { String errMsg = "swiftDelete failed , err=" + result; s_logger.warn(errMsg); return errMsg; } + if (parser.getLines() != null) { + String[] lines = parser.getLines().split("\\n"); + for (String line : lines) { + if (line.contains("Errno")) { + String errMsg = "swiftDelete failed , err=" + lines.toString(); + s_logger.warn(errMsg); + return errMsg; + } + } + } return null; } diff --git a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java index 6c9d185c43e..ac9c92d67e0 100755 --- a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java +++ b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java @@ -62,7 +62,6 @@ import com.cloud.storage.SwiftVO; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; -import com.cloud.storage.VMTemplateSwiftVO; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.dao.StoragePoolHostDao; @@ -141,6 +140,7 @@ public class DownloadMonitorImpl implements DownloadMonitor { private HostDao _hostDao; @Inject private ResourceManager _resourceMgr; + @Inject private SwiftDao _swiftDao; private String _name; @@ -501,18 +501,12 @@ public class DownloadMonitorImpl implements DownloadMonitor { @Override public void handleTemplateSync(Long dcId) { - if ( dcId != null ) { - List ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId); - for ( HostVO ssHost : ssHosts ) { + if (dcId != null) { + List ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId); + for (HostVO ssHost : ssHosts) { handleTemplateSync(ssHost); } } - if (_swiftMgr.isSwiftEnabled()) { - List swifts = _swiftDao.listAll(); - for (SwiftVO swift : swifts) { - handleTemplateSync(swift); - } - } } private Map listTemplate(HostVO ssHost) { @@ -547,37 +541,6 @@ public class DownloadMonitorImpl implements DownloadMonitor { return null; } - public void handleTemplateSync(SwiftVO swift) { - if (swift == null) { - s_logger.warn("Huh? swift is null"); - return; - } - Map templateInfos = listTemplate(swift); - if (templateInfos == null) { - return; - } - List allTemplates = _templateDao.listAll(); - for (VMTemplateVO tmplt : allTemplates) { - String uniqueName = tmplt.getUniqueName(); - VMTemplateSwiftVO tmpltSwift = _vmTemplateSwiftlDao.findBySwiftTemplate(swift.getId(), tmplt.getId()); - if (templateInfos.containsKey(uniqueName)) { - TemplateInfo tmpltInfo = templateInfos.remove(uniqueName); - if (tmpltSwift != null) { - s_logger.info("Template Sync found " + uniqueName + " already in the template swift table"); - continue; - } else { - tmpltSwift = new VMTemplateSwiftVO(swift.getId(), tmplt.getId(), new Date(), tmpltInfo.getSize(), tmpltInfo.getPhysicalSize()); - _vmTemplateSwiftlDao.persist(tmpltSwift); - s_logger.info("Template Sync added " + uniqueName + " to the template swift table"); - } - } - } - - for (TemplateInfo tmpltInfo : templateInfos.values()) { - s_logger.warn("Template Sync found template " + tmpltInfo.getInstallPath() + " in Swift description, but not in template table, please"); - } - } - @Override public void handleTemplateSync(HostVO ssHost) { if (ssHost == null) { @@ -590,6 +553,7 @@ public class DownloadMonitorImpl implements DownloadMonitor { s_logger.warn("Huh? Agent id " + sserverId + " is not secondary storage host"); return; } + Map templateInfos = listTemplate(ssHost); if (templateInfos == null) { return; @@ -715,6 +679,11 @@ public class DownloadMonitorImpl implements DownloadMonitor { } } if (availHypers.contains(tmplt.getHypervisorType())) { + if (_swiftMgr.isSwiftEnabled()) { + if (_swiftMgr.isTemplateInstalled(tmplt.getId())) { + continue; + } + } s_logger.debug("Template " + tmplt.getName() + " needs to be downloaded to " + ssHost.getName()); downloadTemplateToStorage(tmplt, ssHost); } diff --git a/server/src/com/cloud/storage/swift/SwiftManager.java b/server/src/com/cloud/storage/swift/SwiftManager.java index 2f67cf1fa41..1d37da424b6 100644 --- a/server/src/com/cloud/storage/swift/SwiftManager.java +++ b/server/src/com/cloud/storage/swift/SwiftManager.java @@ -40,4 +40,6 @@ public interface SwiftManager extends Manager { List addSwift(AddSwiftCmd cmd) throws DiscoveryException; boolean isSwiftEnabled(); + + public boolean isTemplateInstalled(Long templateId); } \ No newline at end of file diff --git a/server/src/com/cloud/storage/swift/SwiftManagerImpl.java b/server/src/com/cloud/storage/swift/SwiftManagerImpl.java index dbc47ca760e..777433d71a7 100644 --- a/server/src/com/cloud/storage/swift/SwiftManagerImpl.java +++ b/server/src/com/cloud/storage/swift/SwiftManagerImpl.java @@ -40,9 +40,13 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.exception.DiscoveryException; import com.cloud.storage.Swift; import com.cloud.storage.SwiftVO; +import com.cloud.storage.VMTemplateSwiftVO; import com.cloud.storage.dao.SwiftDao; import com.cloud.storage.dao.VMTemplateSwiftDao; import com.cloud.utils.component.Inject; +import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.utils.db.SearchCriteria2; +import com.cloud.utils.db.SearchCriteriaService; @@ -79,6 +83,14 @@ public class SwiftManagerImpl implements SwiftManager { return false; } + @Override + public boolean isTemplateInstalled(Long templateId) { + + SearchCriteriaService sc = SearchCriteria2.create(VMTemplateSwiftVO.class); + sc.addAnd(sc.getEntity().getTemplateId(), Op.EQ, templateId); + return !sc.list().isEmpty(); + } + @Override public List addSwift(AddSwiftCmd cmd) throws DiscoveryException { if (!isSwiftEnabled()) {