ssvm: wrong SSVM behavior causes redownloading for all the templates (#3844)

As per discussion at #3838 and proposal by @weizhouapache this PR implements the fix.

Fixes #3838
This commit is contained in:
Bitworks LLC 2020-02-07 12:39:47 +07:00 committed by GitHub
parent a746b29a83
commit f78cbf4efc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 36 deletions

View File

@ -163,16 +163,16 @@ public class NfsMountManagerImpl implements NfsMountManager {
private boolean mountExists(String localRootPath) {
Script script = new Script(true, "mount", timeout, s_logger);
ZfsPathParser parser = new ZfsPathParser(localRootPath);
PathParser parser = new PathParser(localRootPath);
script.execute(parser);
return parser.getPaths().stream().filter(s -> s.contains(localRootPath)).findAny().map(s -> true).orElse(false);
}
public static class ZfsPathParser extends OutputInterpreter {
public static class PathParser extends OutputInterpreter {
String _parent;
List<String> paths = new ArrayList<>();
public ZfsPathParser(String parent) {
public PathParser(String parent) {
_parent = parent;
}

View File

@ -67,7 +67,7 @@ import org.apache.cloudstack.storage.configdrive.ConfigDrive;
import org.apache.cloudstack.storage.configdrive.ConfigDriveBuilder;
import org.apache.cloudstack.storage.template.DownloadManager;
import org.apache.cloudstack.storage.template.DownloadManagerImpl;
import org.apache.cloudstack.storage.template.DownloadManagerImpl.ZfsPathParser;
import org.apache.cloudstack.storage.NfsMountManagerImpl.PathParser;
import org.apache.cloudstack.storage.template.UploadEntity;
import org.apache.cloudstack.storage.template.UploadManager;
import org.apache.cloudstack.storage.template.UploadManagerImpl;
@ -2905,7 +2905,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
script = new Script(!_inSystemVM, "mount", _timeout, s_logger);
List<String> res = new ArrayList<String>();
ZfsPathParser parser = new ZfsPathParser(localRootPath);
PathParser parser = new PathParser(localRootPath);
script.execute(parser);
res.addAll(parser.getPaths());
for (String s : res) {

View File

@ -16,7 +16,6 @@
// under the License.
package org.apache.cloudstack.storage.template;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@ -60,6 +59,7 @@ import org.apache.cloudstack.storage.command.DownloadCommand;
import org.apache.cloudstack.storage.command.DownloadCommand.ResourceType;
import org.apache.cloudstack.storage.command.DownloadProgressCommand;
import org.apache.cloudstack.storage.command.DownloadProgressCommand.RequestType;
import org.apache.cloudstack.storage.NfsMountManagerImpl.PathParser;
import org.apache.cloudstack.storage.resource.NfsSecondaryStorageResource;
import org.apache.cloudstack.storage.resource.SecondaryStorageResource;
import org.apache.commons.collections.CollectionUtils;
@ -82,7 +82,6 @@ import com.cloud.utils.NumbersUtil;
import com.cloud.utils.StringUtils;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.OutputInterpreter;
import com.cloud.utils.script.Script;
import com.cloud.utils.storage.QCOW2Utils;
import org.apache.cloudstack.utils.security.ChecksumValue;
@ -850,8 +849,12 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
Script script = new Script(listVolScr, LOGGER);
script.add("-r", rootdir);
ZfsPathParser zpp = new ZfsPathParser(rootdir);
PathParser zpp = new PathParser(rootdir);
script.execute(zpp);
if (script.getExitValue() != 0) {
LOGGER.error("Error while executing script " + script.toString());
throw new CloudRuntimeException("Error while executing script " + script.toString());
}
result.addAll(zpp.getPaths());
LOGGER.info("found " + zpp.getPaths().size() + " volumes" + zpp.getPaths());
return result;
@ -862,8 +865,12 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
Script script = new Script(listTmpltScr, LOGGER);
script.add("-r", rootdir);
ZfsPathParser zpp = new ZfsPathParser(rootdir);
PathParser zpp = new PathParser(rootdir);
script.execute(zpp);
if (script.getExitValue() != 0) {
LOGGER.error("Error while executing script " + script.toString());
throw new CloudRuntimeException("Error while executing script " + script.toString());
}
result.addAll(zpp.getPaths());
LOGGER.info("found " + zpp.getPaths().size() + " templates" + zpp.getPaths());
return result;
@ -961,33 +968,6 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
return result;
}
public static class ZfsPathParser extends OutputInterpreter {
String _parent;
List<String> paths = new ArrayList<String>();
public ZfsPathParser(String parent) {
_parent = parent;
}
@Override
public String interpret(BufferedReader reader) throws IOException {
String line = null;
while ((line = reader.readLine()) != null) {
paths.add(line);
}
return null;
}
public List<String> getPaths() {
return paths;
}
@Override
public boolean drain() {
return true;
}
}
public DownloadManagerImpl() {
}