From ba32ac1a7c643644c0b238fee622c726a0e6df22 Mon Sep 17 00:00:00 2001 From: Abhinandan Prateek Date: Fri, 2 Dec 2016 13:37:47 +0530 Subject: [PATCH] Cloudstack 9586: When using local storage with Xenserver prepareTemplate does not work with multiple primary store The race condition will happen whenever there are multiple primary storages and the CS tries to mount the secondary store to xenserver host simultaneously. Due to synchronised block one mount will be successful and other thread will get the already mounted SR. Without the fix the two thread will try to mount it parallely and one will fail on Xenserver. --- .../Xenserver625StorageProcessor.java | 45 +++++++------------ 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java index e58bade2c4e..b07487ba541 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java @@ -101,35 +101,24 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { try { final String srname = hypervisorResource.getHost().getUuid() + path.trim(); - - final Set srs = SR.getByNameLabel(conn, srname); - - if (srs != null && !srs.isEmpty()) { - return srs.iterator().next(); + synchronized (srname.intern()) { + final Set srs = SR.getByNameLabel(conn, srname); + if (srs != null && !srs.isEmpty()) { + return srs.iterator().next(); + } + final Map smConfig = new HashMap(); + final Host host = Host.getByUuid(conn, hypervisorResource.getHost().getUuid()); + final String uuid = UUID.randomUUID().toString(); + sr = SR.introduce(conn, uuid, srname, srname, "file", "file", false, smConfig); + final PBD.Record record = new PBD.Record(); + record.host = host; + record.SR = sr; + smConfig.put("location", path); + record.deviceConfig = smConfig; + pbd = PBD.create(conn, record); + pbd.plug(conn); + sr.scan(conn); } - - final Map smConfig = new HashMap(); - - final Host host = Host.getByUuid(conn, hypervisorResource.getHost().getUuid()); - final String uuid = UUID.randomUUID().toString(); - - sr = SR.introduce(conn, uuid, srname, srname, "file", "file", false, smConfig); - - final PBD.Record record = new PBD.Record(); - - record.host = host; - record.SR = sr; - - smConfig.put("location", path); - - record.deviceConfig = smConfig; - - pbd = PBD.create(conn, record); - - pbd.plug(conn); - - sr.scan(conn); - return sr; } catch (final Exception ex) { try {