You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bh...@apache.org on 2016/12/05 09:46:46 UTC

[1/6] git commit: updated refs/heads/master to 45a746a

Repository: cloudstack
Updated Branches:
  refs/heads/master 46d11b371 -> 45a746ad2


CLOUDSTACK-9564: Fix memory leaks in VmwareContextPool

In a recent management server crash, it was found that the largest contributor
to memory leak was in VmwareContextPool where a registry is held (arraylist)
that grows indefinitely. The list itself is not used anywhere or consumed. There
exists a hashmap (pool) that returns a list of contexts for existing poolkey
(address/username) that is used instead.

This fixes the issue by removing the arraylist registry, and limiting the
length of the context list for a given poolkey.

Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/90a3d97c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/90a3d97c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/90a3d97c

Branch: refs/heads/master
Commit: 90a3d97c5e20b625b528c527a2f31474082214ef
Parents: 5d7288b
Author: Rohit Yadav <ro...@shapeblue.com>
Authored: Tue Oct 25 15:20:33 2016 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Thu Dec 1 15:27:29 2016 +0530

----------------------------------------------------------------------
 .../vmware/resource/VmwareContextFactory.java   |   1 -
 .../vmware/resource/VmwareResource.java         |   2 +-
 .../VmwareSecondaryStorageContextFactory.java   |   1 -
 .../VmwareSecondaryStorageResourceHandler.java  |   2 +-
 .../hypervisor/vmware/util/VmwareContext.java   |   2 +-
 .../vmware/util/VmwareContextPool.java          | 178 +++++++++----------
 .../vmware/util/VmwareContextPoolTest.java      | 120 +++++++++++++
 7 files changed, 210 insertions(+), 96 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90a3d97c/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareContextFactory.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareContextFactory.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareContextFactory.java
index 11163e9..3ed5939 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareContextFactory.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareContextFactory.java
@@ -77,7 +77,6 @@ public class VmwareContextFactory {
         context.registerStockObject("noderuninfo", String.format("%d-%d", s_clusterMgr.getManagementNodeId(), s_clusterMgr.getCurrentRunId()));
 
         context.setPoolInfo(s_pool, VmwareContextPool.composePoolKey(vCenterAddress, vCenterUserName));
-        s_pool.registerOutstandingContext(context);
 
         return context;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90a3d97c/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 1ec859b..e7155c1 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -5481,7 +5481,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
             if (s_logger.isTraceEnabled()) {
                 s_logger.trace("Recycling threadlocal context to pool");
             }
-            context.getPool().returnContext(context);
+            context.getPool().registerContext(context);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90a3d97c/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageContextFactory.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageContextFactory.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageContextFactory.java
index ee0273c..6e19ba6 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageContextFactory.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageContextFactory.java
@@ -49,7 +49,6 @@ public class VmwareSecondaryStorageContextFactory {
         assert (context != null);
 
         context.setPoolInfo(s_pool, VmwareContextPool.composePoolKey(vCenterAddress, vCenterUserName));
-        s_pool.registerOutstandingContext(context);
 
         return context;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90a3d97c/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java
index 9a8c37a..d0d5964 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java
@@ -236,7 +236,7 @@ public class VmwareSecondaryStorageResourceHandler implements SecondaryStorageRe
             VmwareContext context = currentContext.get();
             currentContext.set(null);
             assert (context.getPool() != null);
-            context.getPool().returnContext(context);
+            context.getPool().registerContext(context);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90a3d97c/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java
index daf29ea..9b477ae 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java
@@ -666,7 +666,7 @@ public class VmwareContext {
             s_logger.warn("Unexpected exception: ", e);
         } finally {
             if (_pool != null) {
-                _pool.unregisterOutstandingContext(this);
+                _pool.unregisterContext(this);
             }
             unregisterOutstandingContext();
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90a3d97c/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContextPool.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContextPool.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContextPool.java
index c97c01f..b2e7636 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContextPool.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContextPool.java
@@ -16,28 +16,30 @@
 // under the License.
 package com.cloud.hypervisor.vmware.util;
 
+import com.google.common.base.Strings;
+import org.apache.cloudstack.managed.context.ManagedContextTimerTask;
+import org.apache.log4j.Logger;
+import org.joda.time.Duration;
+
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
+import java.util.Queue;
 import java.util.Timer;
 import java.util.TimerTask;
-
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.managed.context.ManagedContextTimerTask;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ConcurrentMap;
 
 public class VmwareContextPool {
     private static final Logger s_logger = Logger.getLogger(VmwareContextPool.class);
 
-    private static final long DEFAULT_CHECK_INTERVAL = 10000;
+    private static final Duration DEFAULT_CHECK_INTERVAL = Duration.millis(10000L);
     private static final int DEFAULT_IDLE_QUEUE_LENGTH = 128;
 
-    private List<VmwareContext> _outstandingRegistry = new ArrayList<VmwareContext>();
-
-    private Map<String, List<VmwareContext>> _pool;
+    private final ConcurrentMap<String, Queue<VmwareContext>> _pool;
     private int _maxIdleQueueLength = DEFAULT_IDLE_QUEUE_LENGTH;
-    private long _idleCheckIntervalMs = DEFAULT_CHECK_INTERVAL;
+    private Duration _idleCheckInterval = DEFAULT_CHECK_INTERVAL;
 
     private Timer _timer = new Timer();
 
@@ -45,76 +47,77 @@ public class VmwareContextPool {
         this(DEFAULT_IDLE_QUEUE_LENGTH, DEFAULT_CHECK_INTERVAL);
     }
 
-    public VmwareContextPool(int maxIdleQueueLength) {
-        this(maxIdleQueueLength, DEFAULT_CHECK_INTERVAL);
-    }
-
-    public VmwareContextPool(int maxIdleQueueLength, long idleCheckIntervalMs) {
-        _pool = new HashMap<String, List<VmwareContext>>();
+    public VmwareContextPool(int maxIdleQueueLength, Duration idleCheckInterval) {
+        _pool = new ConcurrentHashMap<String, Queue<VmwareContext>>();
 
         _maxIdleQueueLength = maxIdleQueueLength;
-        _idleCheckIntervalMs = idleCheckIntervalMs;
-
-        _timer.scheduleAtFixedRate(getTimerTask(), _idleCheckIntervalMs, _idleCheckIntervalMs);
-    }
+        _idleCheckInterval = idleCheckInterval;
 
-    public void registerOutstandingContext(VmwareContext context) {
-        assert (context != null);
-        synchronized (this) {
-            _outstandingRegistry.add(context);
-        }
+        _timer.scheduleAtFixedRate(getTimerTask(), _idleCheckInterval.getMillis(), _idleCheckInterval.getMillis());
     }
 
-    public void unregisterOutstandingContext(VmwareContext context) {
-        assert (context != null);
-        synchronized (this) {
-            _outstandingRegistry.remove(context);
+    public VmwareContext getContext(final String vCenterAddress, final String vCenterUserName) {
+        final String poolKey = composePoolKey(vCenterAddress, vCenterUserName).intern();
+        if (Strings.isNullOrEmpty(poolKey)) {
+            return null;
         }
-    }
-
-    public VmwareContext getContext(String vCenterAddress, String vCenterUserName) {
-        String poolKey = composePoolKey(vCenterAddress, vCenterUserName);
-        synchronized (this) {
-            List<VmwareContext> l = _pool.get(poolKey);
-            if (l == null)
-                return null;
-
-            if (l.size() > 0) {
-                VmwareContext context = l.remove(0);
-                context.setPoolInfo(this, poolKey);
-
-                if (s_logger.isTraceEnabled())
-                    s_logger.trace("Return a VmwareContext from the idle pool: " + poolKey + ". current pool size: " + l.size() + ", outstanding count: " +
-                        VmwareContext.getOutstandingContextCount());
+        synchronized (poolKey) {
+            final Queue<VmwareContext> ctxList = _pool.get(poolKey);
+            if (ctxList != null && !ctxList.isEmpty()) {
+                final VmwareContext context = ctxList.remove();
+                if (context != null) {
+                    context.setPoolInfo(this, poolKey);
+                }
+                if (s_logger.isTraceEnabled()) {
+                    s_logger.trace("Return a VmwareContext from the idle pool: " + poolKey + ". current pool size: " + ctxList.size() + ", outstanding count: " +
+                            VmwareContext.getOutstandingContextCount());
+                }
                 return context;
             }
-
-            // TODO, we need to control the maximum number of outstanding VmwareContext object in the future
             return null;
         }
     }
 
-    public void returnContext(VmwareContext context) {
+    public void registerContext(final VmwareContext context) {
         assert (context.getPool() == this);
         assert (context.getPoolKey() != null);
-        synchronized (this) {
-            List<VmwareContext> l = _pool.get(context.getPoolKey());
-            if (l == null) {
-                l = new ArrayList<VmwareContext>();
-                _pool.put(context.getPoolKey(), l);
+
+        final String poolKey = context.getPoolKey().intern();
+        synchronized (poolKey) {
+            Queue<VmwareContext> ctxQueue = _pool.get(poolKey);
+
+            if (ctxQueue == null) {
+                ctxQueue = new ConcurrentLinkedQueue<>();
+                _pool.put(poolKey, ctxQueue);
+            }
+
+            if (ctxQueue.size() >= _maxIdleQueueLength) {
+                final VmwareContext oldestContext = ctxQueue.remove();
+                if (oldestContext != null) {
+                    try {
+                        oldestContext.close();
+                    } catch (Throwable t) {
+                        s_logger.error("Unexpected exception caught while trying to purge oldest VmwareContext", t);
+                    }
+                }
             }
+            context.clearStockObjects();
+            ctxQueue.add(context);
 
-            if (l.size() < _maxIdleQueueLength) {
-                context.clearStockObjects();
-                l.add(context);
-
-                if (s_logger.isTraceEnabled())
-                    s_logger.trace("Recycle VmwareContext into idle pool: " + context.getPoolKey() + ", current idle pool size: " + l.size() + ", outstanding count: " +
-                        VmwareContext.getOutstandingContextCount());
-            } else {
-                if (s_logger.isTraceEnabled())
-                    s_logger.trace("VmwareContextPool queue exceeds limits, queue size: " + l.size());
-                context.close();
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("Recycle VmwareContext into idle pool: " + context.getPoolKey() + ", current idle pool size: " + ctxQueue.size() + ", outstanding count: "
+                        + VmwareContext.getOutstandingContextCount());
+            }
+        }
+    }
+
+    public void unregisterContext(final VmwareContext context) {
+        assert (context != null);
+        final String poolKey = context.getPoolKey().intern();
+        final Queue<VmwareContext> ctxList = _pool.get(poolKey);
+        synchronized (poolKey) {
+            if (!Strings.isNullOrEmpty(poolKey) && ctxList != null && ctxList.contains(context)) {
+                ctxList.remove(context);
             }
         }
     }
@@ -124,8 +127,6 @@ public class VmwareContextPool {
             @Override
             protected void runInContext() {
                 try {
-                    // doIdleCheck();
-
                     doKeepAlive();
                 } catch (Throwable e) {
                     s_logger.error("Unexpected exception", e);
@@ -134,35 +135,30 @@ public class VmwareContextPool {
         };
     }
 
-    private void getKeepAliveCheckContexts(List<VmwareContext> l, int batchSize) {
-        synchronized (this) {
-            int size = Math.min(_outstandingRegistry.size(), batchSize);
-            while (size > 0) {
-                VmwareContext context = _outstandingRegistry.remove(0);
-                l.add(context);
-
-                _outstandingRegistry.add(context);
-                size--;
-            }
-        }
-    }
-
     private void doKeepAlive() {
-        List<VmwareContext> l = new ArrayList<VmwareContext>();
-        int batchSize = (int)(_idleCheckIntervalMs / 1000);    // calculate batch size at 1 request/sec rate
-        getKeepAliveCheckContexts(l, batchSize);
-
-        for (VmwareContext context : l) {
-            try {
-                context.idleCheck();
-            } catch (Throwable e) {
-                s_logger.warn("Exception caught during VmwareContext idle check, close and discard the context", e);
-                context.close();
+        final List<VmwareContext> closableCtxList = new ArrayList<>();
+        for (final Queue<VmwareContext> ctxQueue : _pool.values()) {
+            for (Iterator<VmwareContext> iterator = ctxQueue.iterator(); iterator.hasNext();) {
+                final VmwareContext context = iterator.next();
+                if (context == null) {
+                    iterator.remove();
+                    continue;
+                }
+                try {
+                    context.idleCheck();
+                } catch (Throwable e) {
+                    s_logger.warn("Exception caught during VmwareContext idle check, close and discard the context", e);
+                    closableCtxList.add(context);
+                    iterator.remove();
+                }
             }
         }
+        for (final VmwareContext context : closableCtxList) {
+            context.close();
+        }
     }
 
-    public static String composePoolKey(String vCenterAddress, String vCenterUserName) {
+    public static String composePoolKey(final String vCenterAddress, final String vCenterUserName) {
         assert (vCenterUserName != null);
         assert (vCenterAddress != null);
         return vCenterUserName + "@" + vCenterAddress;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90a3d97c/vmware-base/test/com/cloud/hypervisor/vmware/util/VmwareContextPoolTest.java
----------------------------------------------------------------------
diff --git a/vmware-base/test/com/cloud/hypervisor/vmware/util/VmwareContextPoolTest.java b/vmware-base/test/com/cloud/hypervisor/vmware/util/VmwareContextPoolTest.java
new file mode 100644
index 0000000..5b8d47d
--- /dev/null
+++ b/vmware-base/test/com/cloud/hypervisor/vmware/util/VmwareContextPoolTest.java
@@ -0,0 +1,120 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.hypervisor.vmware.util;
+
+import com.cloud.utils.concurrency.NamedThreadFactory;
+import org.joda.time.Duration;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class VmwareContextPoolTest {
+
+    private class PoolClient implements Runnable {
+        private final VmwareContextPool pool;
+        private volatile Boolean canRun = true;
+        private int counter = 0;
+
+        public PoolClient(final VmwareContextPool pool) {
+            this.pool = pool;
+        }
+
+        public int count() {
+            return counter;
+        }
+
+        public void stop() {
+            canRun = false;
+        }
+
+        @Override
+        public void run() {
+            final String poolKey = pool.composePoolKey(vmwareAddress, vmwareUsername);
+            while (canRun) {
+                pool.registerContext(createDummyContext(pool, poolKey));
+                counter++;
+            }
+        }
+    }
+
+    private VmwareContextPool vmwareContextPool;
+    private VmwareContext vmwareContext;
+    private String vmwareAddress = "address";
+    private String vmwareUsername = "username";
+
+    private int contextLength = 10;
+    private Duration idleCheckInterval = Duration.millis(1000L);
+
+    public VmwareContext createDummyContext(final VmwareContextPool pool, final String poolKey) {
+        VmwareClient vimClient = new VmwareClient("someAddress");
+        VmwareContext context = new VmwareContext(vimClient, "someAddress");
+        context.setPoolInfo(pool, poolKey);
+        return context;
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        final String poolKey = vmwareContextPool.composePoolKey(vmwareAddress, vmwareUsername);
+        vmwareContextPool = new VmwareContextPool(contextLength, idleCheckInterval);
+        vmwareContext = createDummyContext(vmwareContextPool, poolKey);
+    }
+
+    @Test
+    public void testRegisterContext() throws Exception {
+        vmwareContextPool.registerContext(vmwareContext);
+        Assert.assertEquals(vmwareContextPool.getContext(vmwareAddress, vmwareUsername), vmwareContext);
+    }
+
+    @Test
+    public void testUnregisterContext() throws Exception {
+        vmwareContextPool.unregisterContext(vmwareContext);
+        Assert.assertNull(vmwareContextPool.getContext(vmwareAddress, vmwareUsername));
+    }
+
+    @Test
+    public void testComposePoolKey() throws Exception {
+        Assert.assertEquals(vmwareContextPool.composePoolKey(vmwareAddress, vmwareUsername), vmwareUsername + "@" + vmwareAddress);
+    }
+
+    @Test
+    public void testMultithreadedPoolClients() throws Exception {
+        vmwareContextPool = Mockito.spy(vmwareContextPool);
+        final ExecutorService executor = Executors.newFixedThreadPool(10, new NamedThreadFactory("VmwareContextPoolClients"));
+        final List<PoolClient> clients = new ArrayList<>();
+        for (int i = 0; i < 50; i++) {
+            final PoolClient client = new PoolClient(vmwareContextPool);
+            clients.add(client);
+            executor.submit(client);
+        }
+        Thread.sleep(1000);
+        executor.shutdown();
+        int totalRegistrations = 0;
+        for (final PoolClient client : clients) {
+            client.stop();
+            totalRegistrations += client.count();
+        }
+        Mockito.verify(vmwareContextPool, Mockito.atLeast(totalRegistrations)).registerContext(Mockito.any(VmwareContext.class));
+        Assert.assertEquals(vmwareContextPool.composePoolKey(vmwareAddress, vmwareUsername),
+                vmwareContextPool.getContext(vmwareAddress, vmwareUsername).getPoolKey());
+    }
+}
\ No newline at end of file


[5/6] git commit: updated refs/heads/master to 45a746a

Posted by bh...@apache.org.
Merge pull request #1729 from shapeblue/vmware-memleak-fix

CLOUDSTACK-9564: Fix memory leaks in VmwareContextPoolIn a recent management server crash, it was found that the largest contributor
to memory leak was in VmwareContextPool where a registry is held (arraylist)
that grows indefinitely. The list itself is not used anywhere or consumed. There
exists a hashmap (pool) that returns a list of contexts for existing poolkey
(address/username) that is used instead.

This fixes the issue by removing the arraylist registry, and limiting the
length of the context list for a given poolkey.

@blueorangutan package

* pr/1729:
  CLOUDSTACK-9564: Fix memory leaks in VmwareContextPool

Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/8d14e8e8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/8d14e8e8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/8d14e8e8

Branch: refs/heads/master
Commit: 8d14e8e8b5909d4bfe0b505880eb92194e0b08a4
Parents: 3a03a01 90a3d97
Author: Rohit Yadav <ro...@shapeblue.com>
Authored: Mon Dec 5 15:15:58 2016 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Mon Dec 5 15:15:58 2016 +0530

----------------------------------------------------------------------
 .../vmware/resource/VmwareContextFactory.java   |   1 -
 .../vmware/resource/VmwareResource.java         |   2 +-
 .../VmwareSecondaryStorageContextFactory.java   |   1 -
 .../VmwareSecondaryStorageResourceHandler.java  |   2 +-
 .../hypervisor/vmware/util/VmwareContext.java   |   2 +-
 .../vmware/util/VmwareContextPool.java          | 178 +++++++++----------
 .../vmware/util/VmwareContextPoolTest.java      | 120 +++++++++++++
 7 files changed, 210 insertions(+), 96 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8d14e8e8/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------


[6/6] git commit: updated refs/heads/master to 45a746a

Posted by bh...@apache.org.
Merge branch '4.9'


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/45a746ad
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/45a746ad
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/45a746ad

Branch: refs/heads/master
Commit: 45a746ad2ecf4634cab232152876a6fe290b750c
Parents: 46d11b3 8d14e8e
Author: Rohit Yadav <ro...@shapeblue.com>
Authored: Mon Dec 5 15:16:22 2016 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Mon Dec 5 15:16:22 2016 +0530

----------------------------------------------------------------------
 .../vmware/resource/VmwareContextFactory.java   |   1 -
 .../vmware/resource/VmwareResource.java         |   2 +-
 .../VmwareSecondaryStorageContextFactory.java   |   1 -
 .../VmwareSecondaryStorageResourceHandler.java  |   2 +-
 tools/build/build_asf.sh                        |   5 +-
 .../hypervisor/vmware/util/VmwareContext.java   |   2 +-
 .../vmware/util/VmwareContextPool.java          | 178 +++++++++----------
 .../vmware/util/VmwareContextPoolTest.java      | 120 +++++++++++++
 8 files changed, 213 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/45a746ad/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------


[3/6] git commit: updated refs/heads/master to 45a746a

Posted by bh...@apache.org.
Merge pull request #1808 from shapeblue/fix-release-script-checkstyle

CLOUDSTACK-9648: Fix release script to update checkstyle pomThis fixes build_asf.sh release script to update checkstyle pom.xml with the
provided new version.

* pr/1808:
  CLOUDSTACK-9648: Fix release script to update checkstyle pom

Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9e4246a2
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9e4246a2
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9e4246a2

Branch: refs/heads/master
Commit: 9e4246a26d1d9813646cc754346c62d6c176c422
Parents: d540015 77d2984
Author: Rohit Yadav <ro...@shapeblue.com>
Authored: Mon Dec 5 15:08:03 2016 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Mon Dec 5 15:08:04 2016 +0530

----------------------------------------------------------------------
 tools/build/build_asf.sh | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------



[4/6] git commit: updated refs/heads/master to 45a746a

Posted by bh...@apache.org.
Merge branch '4.8' into 4.9

Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3a03a010
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3a03a010
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3a03a010

Branch: refs/heads/master
Commit: 3a03a01093b3ac53299e55f4dbcd03bd4f299384
Parents: 61644f9 9e4246a
Author: Rohit Yadav <ro...@shapeblue.com>
Authored: Mon Dec 5 15:14:53 2016 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Mon Dec 5 15:15:00 2016 +0530

----------------------------------------------------------------------
 tools/build/build_asf.sh | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------



[2/6] git commit: updated refs/heads/master to 45a746a

Posted by bh...@apache.org.
CLOUDSTACK-9648: Fix release script to update checkstyle pom

This fixes build_asf.sh release script to update checkstyle pom.xml with the
provided new version.

Signed-off-by: Rohit Yadav <ro...@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/77d29844
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/77d29844
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/77d29844

Branch: refs/heads/master
Commit: 77d2984494aa5fb32662c990503ae4f251fc4c6f
Parents: b57d0ae
Author: Rohit Yadav <ro...@shapeblue.com>
Authored: Fri Dec 2 13:23:41 2016 +0530
Committer: Rohit Yadav <ro...@shapeblue.com>
Committed: Fri Dec 2 13:23:41 2016 +0530

----------------------------------------------------------------------
 tools/build/build_asf.sh | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/77d29844/tools/build/build_asf.sh
----------------------------------------------------------------------
diff --git a/tools/build/build_asf.sh b/tools/build/build_asf.sh
index 7c8ab71..75eac69 100755
--- a/tools/build/build_asf.sh
+++ b/tools/build/build_asf.sh
@@ -90,10 +90,11 @@ export currentversion=`mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:eval
 echo "found $currentversion"
 
 echo 'setting version numbers'
-mvn versions:set -DnewVersion=$version -P vmware -P developer -P systemvm -P simulator -P baremetal -P ucs -Dnoredist
+
+mvn versions:set -DnewVersion=$version -P developer,systemvm -Dnoredist -Dsimulator
+mvn versions:set -DnewVersion=$version -pl tools/checkstyle
 mv deps/XenServerJava/pom.xml.versionsBackup deps/XenServerJava/pom.xml
 perl -pi -e "s/<cs.xapi.version>6.2.0-1-SNAPSHOT<\/cs.xapi.version>/<cs.xapi.version>6.2.0-1<\/cs.xapi.version>/" pom.xml
-perl -pi -e "s/-SNAPSHOT//" tools/checkstyle/pom.xml
 perl -pi -e "s/-SNAPSHOT//" deps/XenServerJava/pom.xml
 perl -pi -e "s/-SNAPSHOT//" tools/apidoc/pom.xml
 perl -pi -e "s/-SNAPSHOT//" Dockerfile