You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ra...@apache.org on 2014/10/07 15:56:18 UTC

[1/2] git commit: adding member lists to kubernetes cluster context

Repository: stratos
Updated Branches:
  refs/heads/container-autoscaling fb68de94a -> 7162325f3


adding member lists to kubernetes cluster context


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

Branch: refs/heads/container-autoscaling
Commit: d4c315280d3cf6fb917597a11c311d186774cd47
Parents: fb68de9
Author: R-Rajkumar <rr...@gmail.com>
Authored: Tue Oct 7 10:51:56 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Tue Oct 7 10:51:56 2014 +0530

----------------------------------------------------------------------
 .../autoscaler/KubernetesClusterContext.java    | 137 ++++++++++++++++++-
 1 file changed, 136 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/d4c31528/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
index c8b6e39..5704b18 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -38,7 +39,7 @@ import org.apache.stratos.autoscaler.util.ConfUtil;
 import org.apache.stratos.cloud.controller.stub.pojo.MemberContext;
 
 /*
- * It holds the runtime data of a kubernetes cluster
+ * It holds the runtime data of a kubernetes service cluster
  */
 public class KubernetesClusterContext implements Serializable {
 
@@ -62,6 +63,15 @@ public class KubernetesClusterContext implements Serializable {
 
     // active members
     private List<MemberContext> activeMembers;
+    
+    // 1 day as default
+    private long obsoltedMemberExpiryTime = 1*24*60*60*1000;
+
+    // members to be terminated
+    private Map<String, MemberContext> obsoletedMembers;
+    
+    // termination pending members, member is added to this when Autoscaler send grace fully shut down event
+    private List<MemberContext> terminationPendingMembers;
 
     //Keep statistics come from CEP
     private Map<String, MemberStatsContext> memberStatsContexts;
@@ -89,6 +99,8 @@ public class KubernetesClusterContext implements Serializable {
         this.clusterId = clusterId;
         this.pendingMembers = new ArrayList<MemberContext>();
         this.activeMembers = new ArrayList<MemberContext>();
+        this.terminationPendingMembers = new ArrayList<MemberContext>();
+        this.obsoletedMembers = new ConcurrentHashMap<String, MemberContext>();
         this.memberStatsContexts = new ConcurrentHashMap<String, MemberStatsContext>();
         this.requestsInFlight = new RequestsInFlight();
         this.loadAverage = new LoadAverage();
@@ -103,6 +115,8 @@ public class KubernetesClusterContext implements Serializable {
 
         Thread th = new Thread(new PendingMemberWatcher(this));
         th.start();
+        Thread th2 = new Thread(new ObsoletedMemberWatcher(this));
+        th2.start();
     }
 
     public String getKubernetesClusterID() {
@@ -328,6 +342,41 @@ public class KubernetesClusterContext implements Serializable {
         }
 
     }
+    
+    private class ObsoletedMemberWatcher implements Runnable {
+        private KubernetesClusterContext ctxt;
+
+        public ObsoletedMemberWatcher(KubernetesClusterContext ctxt) {
+            this.ctxt = ctxt;
+        }
+
+        @Override
+        public void run() {
+            while (true) {
+
+                long obsoltedMemberExpiryTime = ctxt.getObsoltedMemberExpiryTime();
+                Map<String, MemberContext> obsoletedMembers = ctxt.getObsoletedMembers();
+                Iterator<Entry<String, MemberContext>> iterator = obsoletedMembers.entrySet().iterator();
+
+                while (iterator.hasNext()) {
+                    Map.Entry<String, MemberContext> pairs = iterator.next();
+                    MemberContext obsoleteMember = (MemberContext) pairs.getValue();
+                    if (obsoleteMember == null) {
+                        continue;
+                    }
+                    long obsoleteTime = System.currentTimeMillis() - obsoleteMember.getInitTime();
+                    if (obsoleteTime >= obsoltedMemberExpiryTime) {
+                        iterator.remove();
+                    }
+                }
+                try {
+                    // TODO find a constant
+                    Thread.sleep(15000);
+                } catch (InterruptedException ignore) {
+                }
+            }
+        }
+    }
 
     public float getAverageRequestsInFlight() {
         return requestsInFlight.getAverage();
@@ -511,4 +560,90 @@ public class KubernetesClusterContext implements Serializable {
         this.gradientLoadAverageReset = loadAverageReset;
         this.secondDerivativeLoadAverageRest = loadAverageReset;
     }
+    
+    public void moveActiveMemberToTerminationPendingMembers(String memberId) {
+        if (memberId == null) {
+            return;
+        }
+        Iterator<MemberContext> iterator = activeMembers.listIterator();
+        while ( iterator.hasNext()) {
+            MemberContext activeMember = iterator.next();
+            if(activeMember == null) {
+                iterator.remove();
+                continue;
+            }
+            if(memberId.equals(activeMember.getMemberId())){
+                // member is activated
+                // remove from pending list
+                iterator.remove();
+                // add to the activated list
+                this.terminationPendingMembers.add(activeMember);
+                if (log.isDebugEnabled()) {
+                    log.debug(String.format("Active member is removed and added to the " +
+                            "termination pending member list. [Member Id] %s", memberId));
+                }
+                break;
+            }
+        }
+    }
+    
+    public boolean removeTerminationPendingMember(String memberId) {
+        boolean terminationPendingMemberAvailable = false;
+        for (MemberContext memberContext: terminationPendingMembers){
+            if(memberContext.getMemberId().equals(memberId)){
+                terminationPendingMemberAvailable = true;
+                terminationPendingMembers.remove(memberContext);
+                break;
+            }
+        }
+        return terminationPendingMemberAvailable;
+    }
+    
+    public long getObsoltedMemberExpiryTime() {
+        return obsoltedMemberExpiryTime;
+    }
+    
+    public void setObsoltedMemberExpiryTime(long obsoltedMemberExpiryTime) {
+        this.obsoltedMemberExpiryTime = obsoltedMemberExpiryTime;
+    }
+    
+    public void addObsoleteMember(MemberContext ctxt) {
+        this.obsoletedMembers.put(ctxt.getMemberId(), ctxt);
+    }
+    
+    public boolean removeObsoleteMember(String memberId) {
+        if(this.obsoletedMembers.remove(memberId) == null) {
+            return false;
+        }
+        return true;
+    }
+    
+    public Map<String, MemberContext> getObsoletedMembers() {
+        return obsoletedMembers;
+    }
+        
+    public void setObsoletedMembers(Map<String, MemberContext> obsoletedMembers) {
+        this.obsoletedMembers = obsoletedMembers;
+    }
+
+    public MemberStatsContext getPartitionCtxt(String id) {
+        return this.memberStatsContexts.get(id);
+    }
+
+    public List<MemberContext> getTerminationPendingMembers() {
+        return terminationPendingMembers;
+    }
+
+    public void setTerminationPendingMembers(List<MemberContext> terminationPendingMembers) {
+        this.terminationPendingMembers = terminationPendingMembers;
+    }
+
+    public int getTotalMemberCount() {
+
+        return activeMembers.size() + pendingMembers.size() + terminationPendingMembers.size();
+    }
+
+    public int getNonTerminatedMemberCount() {
+        return activeMembers.size() + pendingMembers.size() + terminationPendingMembers.size();
+    }
 }


[2/2] git commit: clusterId getters/setters in kubernetes cluster context

Posted by ra...@apache.org.
clusterId getters/setters in kubernetes cluster context


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/7162325f
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/7162325f
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/7162325f

Branch: refs/heads/container-autoscaling
Commit: 7162325f3821cd174e2355d16dde8cb9137a1cec
Parents: d4c3152
Author: R-Rajkumar <rr...@gmail.com>
Authored: Tue Oct 7 18:55:04 2014 +0530
Committer: R-Rajkumar <rr...@gmail.com>
Committed: Tue Oct 7 18:55:04 2014 +0530

----------------------------------------------------------------------
 .../apache/stratos/autoscaler/KubernetesClusterContext.java | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/7162325f/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
index 5704b18..faa93bc 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/KubernetesClusterContext.java
@@ -639,11 +639,18 @@ public class KubernetesClusterContext implements Serializable {
     }
 
     public int getTotalMemberCount() {
-
         return activeMembers.size() + pendingMembers.size() + terminationPendingMembers.size();
     }
 
     public int getNonTerminatedMemberCount() {
         return activeMembers.size() + pendingMembers.size() + terminationPendingMembers.size();
     }
+
+	public String getClusterId() {
+		return clusterId;
+	}
+
+	public void setClusterId(String clusterId) {
+		this.clusterId = clusterId;
+	}
 }