[ha-wg-technical] Two git patchs for resource-agents

Dejan Muhamedagic dejan at suse.de
Fri Oct 28 14:39:32 UTC 2011


Hi John,

On Fri, Oct 28, 2011 at 08:21:28AM -0600, John Shi wrote:
> 
> Hi Dejan, 
> I made the new patch for pacemaker, it contains the new NodeUtilization RA.  
> Yes, this is a resend of the same patches I sent last time, but just separate the NodeUtilization RA to pacemaker. 

So, which issues do you still think are open?

Cheers,

Dejan

> Regards, 
> John 
> 
> 
> >>> Dejan Muhamedagic <dejan at suse.de> 8/19/2011 8:18 下午 >>>
> Hi John,
> 
> On Thu, Aug 18, 2011 at 12:20:26AM -0600, John Shi wrote:
> >
> >
> >
> > >>> "John Shi" <jshi at novell.com> 8/13/2011 2:56 上午 >>>
> >
> >
> > >>> Lars Marowsky-Bree <lmb at suse.de> 07/22/11 7:40 ?? >>>
> > On 2011-07-13T22:56:06, John Shi <jshi at novell.com> wrote:
> >
> > >> how can we know that node is ready to run Xen RA or other RA, Xen RA
> > >> cares about the memory which is "physical_mem - (dom0_min_mem +
> > >> domU_mem * run_num)" but other RA just care about the physical memory
> > >> or dom0 memory(Xen kernel).
> > >>
> > >> Can we separate the memory of utilization to dom0_mem and domU_mem ?
> > >
> > >Indeed, there's a difference between the memory available to the
> > >hypervisor/domain 0/base OS and that available for running guests; this
> > >probably should be handled by os_mem and vm_mem.
> > >
> > >I think the main use case with virtualized environments is that they run
> > >"just" VMs, so nobody cares about the memory available in the HVM, but
> > >you're right, it's good to have a clean separation immediately.
> > >
> > >Good catch!
> >
> >
> > Hi,
> >   Xinwei Hu and I improved the  2  resource-agents  patches,
> >   1.  Separate the memory of utilization to host_memory and hypervisor_memory.
> >   2.  Add some parameters for cpu/memory reservation.
> >   3.  VirtualDomain RA just cares about hypervisor_memory.
> >
> >   I know more details we need to discuss, but could we put them into upstream first ?
> 
> I wasn't involved in the discussion earlier. Can you please
> reiterate which details are still open?
> 
> Also, should the new NodeUtilization RA go into the pacemaker tree?
> 
> Cheers,
> 
> Dejan
> 
> P.S. Is this a resend of the same patches you sent on Aug 12?
> 
> >   We can gradually improve these features in future.
> >
> > Regards,
> > John
> 
> > From 9071409ecd0e0951af74a7823d5d2f712a0f22f3 Mon Sep 17 00:00:00 2001
> > From: John Shi <jshi at novell.com>
> > Date: Sat, 13 Aug 2011 02:18:50 +0800
> > Subject: [PATCH] Build: Add a new agent: NodeUtilization.
> >  This agent detects system parameters and put them into CIB by crm_attribute,
> >  and it runs on every node as clone resource.
> >
> > ---
> >  heartbeat/Makefile.am     |    1 +
> >  heartbeat/NodeUtilization |  229 +++++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 230 insertions(+), 0 deletions(-)
> >  create mode 100755 heartbeat/NodeUtilization
> >
> > diff --git a/heartbeat/Makefile.am b/heartbeat/Makefile.am
> > index dacf3bd..3a3d221 100644
> > --- a/heartbeat/Makefile.am
> > +++ b/heartbeat/Makefile.am
> > @@ -77,6 +77,7 @@ ocf_SCRIPTS     =  ClusterMon\
> >  mysql\
> >  mysql-proxy\
> >  nfsserver\
> > +NodeUtilization\
> >  oracle\
> >  oralsnr\
> >  pingd\
> > diff --git a/heartbeat/NodeUtilization b/heartbeat/NodeUtilization
> > new file mode 100755
> > index 0000000..dca0d9a
> > --- /dev/null
> > +++ b/heartbeat/NodeUtilization
> > @@ -0,0 +1,229 @@
> > +#!/bin/sh
> > +#
> > +#
> > +#NodeUtilization OCF Resource Agent
> > +#
> > +# Copyright (c) 2011 SUSE LINUX, John Shi
> > +#                    All Rights Reserved.
> > +#
> > +# This program is free software; you can redistribute it and/or modify
> > +# it under the terms of version 2 of the GNU General Public License as
> > +# published by the Free Software Foundation.
> > +#
> > +# This program is distributed in the hope that it would be useful, but
> > +# WITHOUT ANY WARRANTY; without even the implied warranty of
> > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> > +#
> > +# Further, this software is distributed without any warranty that it is
> > +# free of the rightful claim of any third person regarding infringement
> > +# or the like.  Any license provided herein, whether implied or
> > +# otherwise, applies only to this software file.  Patent licenses, if
> > +# any, provided herein do not apply to combinations of this program with
> > +# other software, or any other product whatsoever.
> > +#
> > +# You should have received a copy of the GNU General Public License
> > +# along with this program; if not, write the Free Software Foundation,
> > +# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
> > +#
> > +#######################################################################
> > +# Initialization:
> > +
> > +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
> > +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
> > +
> > +#######################################################################
> > +
> > +meta_data() {
> > +cat <<END
> > +<?xml version="1.0"?>
> > +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
> > +<resource-agent name="NodeUtilization">
> > +<version>1.0</version>
> > +
> > +<longdesc lang="en">
> > +This is an NodeUtilization Resource Agent.
> > +This agent detects system parameters and put them into CIB by crm_attribute,
> > +and it runs on every node as clone resource.
> > +</longdesc>
> > +<shortdesc lang="en">NodeUtilization resource agent</shortdesc>
> > +
> > +<parameters>
> > +<parameter name="dynamic" unique="0" required="0">
> > +<longdesc lang="en">
> > +If set, some of the HA parameters will be reset if there are
> > +difference between HA parameters and system parameters when HA monitor.
> > +Otherwise, the HA parameters will be set once when the resource instance starts.
> > +</longdesc>
> > +<shortdesc lang="en">Set HA parameters when start or monitor</shortdesc>
> > +<content type="boolean" default="true" />
> > +</parameter>
> > +
> > +<parameter name="utilization_cpu" unique="0" required="0">
> > +<longdesc lang="en">Enable setting cpu utilization.</longdesc>
> > +<shortdesc lang="en">Enable setting cpu utilization.</shortdesc>
> > +<content type="boolean" default="true" />
> > +</parameter>
> > +
> > +<parameter name="utilization_cpu_reservation" unique="0" required="0">
> > +<longdesc lang="en">CPU reserved for non-HA related usage.</longdesc>
> > +<shortdesc lang="en">CPU reserved for non-HA related usage.</shortdesc>
> > +<content type="integer" default="1" />
> > +</parameter>
> > +
> > +<parameter name="utilization_host_memory" unique="0" required="0">
> > +<longdesc lang="en">Enable setting memory utilization of host.</longdesc>
> > +<shortdesc lang="en">Enable setting memory utilization of host.</shortdesc>
> > +<content type="boolean" default="true" />
> > +</parameter>
> > +
> > +<parameter name="utilization_host_memory_reservation" unique="0" required="0">
> > +<longdesc lang="en">Memory reserved for other services inside host, in MB.</longdesc>
> > +<shortdesc lang="en">Memory reserved for other services inside host, in MB.</shortdesc>
> > +<content type="integer" default="512" />
> > +</parameter>
> > +
> > +<parameter name="utilization_hv_memory" unique="0" required="0">
> > +<longdesc lang="en">Enable setting the memory utilization of hypervisor.</longdesc>
> > +<shortdesc lang="en">Enable setting the memory utilization of hypervisor.</shortdesc>
> > +<content type="boolean" default="true" />
> > +</parameter>
> > +
> > +<parameter name="utilization_hv_memory_reservation" unique="0" required="0">
> > +<longdesc lang="en">Memory reserved for the hypervisor, in MB.</longdesc>
> > +<shortdesc lang="en">Memory reserved for the hypervisor, in MB.</shortdesc>
> > +<content type="integer" default="512" />
> > +</parameter>
> > +</parameters>
> > +
> > +<actions>
> > +<action name="start"   timeout="90" />
> > +<action name="stop"    timeout="100" />
> > +<action name="monitor" timeout="20s" interval="60s"/>
> > +<action name="meta-data"  timeout="5" />
> > +<action name="validate-all"  timeout="30" />
> > +</actions>
> > +</resource-agent>
> > +END
> > +}
> > +
> > +set_utilization() {
> > +    host_name="$(hostname)"
> > +
> > +    if [ "$OCF_RESKEY_utilization_cpu" = "true" -o "$OCF_RESKEY_utilization_cpu" = "1" ]; then
> > +        sys_cpu=$(( $(grep -c processor /proc/cpuinfo) - $OCF_RESKEY_utilization_cpu_reservation ))
> > +        uti_cpu=$(crm_attribute -Q -t nodes -U "$host_name" -z -n cpu 2>/dev/null)
> > +
> > +        if [ "$sys_cpu" != "$uti_cpu" ]; then
> > +            if ! crm_attribute -t nodes -U "$host_name" -z -n cpu -v $sys_cpu; then
> > +                ocf_log err "Failed to set cpu of utilization by crm_attribute."
> > +                return 1
> > +            fi
> > +        fi
> > +    fi
> > +
> > +    if [ "$OCF_RESKEY_utilization_host_memory" = "true" -o "$OCF_RESKEY_utilization_host_memory" = "1" ]; then
> > +        sys_mem=$(( $(awk '/MemTotal/{printf("%d\n",$2/1024);exit(0)}' /proc/meminfo) - $OCF_RESKEY_utilization_host_memory_reservation ))
> > +        uti_mem=$(crm_attribute -Q -t nodes -U "$host_name" -z -n host_memory 2>/dev/null)
> > +
> > +        if [ "$sys_mem" != "$uti_mem" ]; then
> > +            if ! crm_attribute -t nodes -U "$host_name" -z -n host_memory -v $sys_mem; then
> > +                ocf_log err "Failed to set host_memory of utilization by crm_attribute."
> > +                return 1
> > +            fi
> > +        fi
> > +    fi
> > +
> > +    if [ -x /usr/sbin/xm ]; then
> > +        if [ "$OCF_RESKEY_utilization_hv_memory" = "true" -o "$OCF_RESKEY_utilization_hv_memory" = "1" ]; then
> > +            hv_mem=$(( $(xm info | awk '/max_free_memory/{printf("%d\n",$3);exit(0)}') - $OCF_RESKEY_utilization_hv_memory_reservation ))
> > +            uti_mem=$(crm_attribute -Q -t nodes -U "$host_name" -z -n hv_memory 2>/dev/null)
> > +
> > +            if [ "$hv_mem" != "$uti_mem" ]; then
> > +                if ! crm_attribute -t nodes -U "$host_name" -z -n hv_memory -v $hv_mem; then
> > +                    ocf_log err "Failed to set hv_memory of utilization by crm_attribute."
> > +                    return 1
> > +                fi
> > +            fi
> > +        fi
> > +    fi
> > +}
> > +
> > +NodeUtilization_usage() {
> > +cat <<END
> > +usage: $0 {start|stop|monitor|validate-all|meta-data}
> > +
> > +Expects to have a fully populated OCF RA-compliant environment set.
> > +END
> > +}
> > +
> > +NodeUtilization_start() {
> > +    if ! touch "$OCF_RESKEY_pidfile"; then
> > +        ocf_log err "Failed to touch pidfile: ${OCF_RESKEY_pidfile}."
> > +        exit $OCF_ERR_GENERIC
> > +    fi
> > +    if [ "$OCF_RESKEY_dynamic" = "false" -o "$OCF_RESKEY_dynamic" = "0" ]; then
> > +        if ! set_utilization; then
> > +            exit $OCF_ERR_GENERIC
> > +        fi
> > +    fi
> > +    exit $OCF_SUCCESS
> > +}
> > +
> > +NodeUtilization_stop() {
> > +    rm -f $OCF_RESKEY_pidfile
> > +    exit $OCF_SUCCESS
> > +}
> > +
> > +NodeUtilization_monitor() {
> > +    if [ ! -f $OCF_RESKEY_pidfile ]; then
> > +        exit $OCF_NOT_RUNNING
> > +    fi
> > +
> > +    if [ "$OCF_RESKEY_dynamic" = "true" -o "$OCF_RESKEY_dynamic" = "1" ]; then
> > +        if ! set_utilization; then
> > +            exit $OCF_ERR_GENERIC
> > +        fi
> > +    fi
> > +    exit $OCF_SUCCESS
> > +}
> > +
> > +NodeUtilization_validate() {
> > +    exit $OCF_SUCCESS
> > +}
> > +
> > +
> > +: ${OCF_RESKEY_pidfile:="$HA_VARRUN/NodeUtilization-${OCF_RESOURCE_INSTANCE}"}
> > +: ${OCF_RESKEY_dynamic:="true"}
> > +: ${OCF_RESKEY_utilization_cpu:="true"}
> > +: ${OCF_RESKEY_utilization_cpu_reservation="1"}
> > +: ${OCF_RESKEY_utilization_hv_memory:="true"}
> > +: ${OCF_RESKEY_utilization_hv_memory_reservation="512"}
> > +: ${OCF_RESKEY_utilization_host_memory:="true"}
> > +: ${OCF_RESKEY_utilization_host_memory_reservation="512"}
> > +
> > +if [ $# -ne 1 ]; then
> > +    NodeUtilization_usage
> > +    exit $OCF_ERR_ARGS
> > +fi
> > +
> > +case $__OCF_ACTION in
> > +meta-data)meta_data
> > +exit $OCF_SUCCESS
> > +;;
> > +start)NodeUtilization_start
> > +;;
> > +stop)NodeUtilization_stop
> > +;;
> > +monitor)NodeUtilization_monitor
> > +;;
> > +validate-all)NodeUtilization_validate
> > +;;
> > +usage|help)NodeUtilization_usage
> > +exit $OCF_SUCCESS
> > +;;
> > +*)NodeUtilization_usage
> > +exit $OCF_ERR_UNIMPLEMENTED
> > +;;
> > +esac
> > +
> > +exit $?
> > --
> > 1.7.2.5
> >
> 
> > From 3f26aa2cf5f9f7da40182008079c6ea7498f96fd Mon Sep 17 00:00:00 2001
> > From: John Shi <jshi at novell.com>
> > Date: Sat, 13 Aug 2011 02:25:37 +0800
> > Subject: [PATCH] Low: VirtualDomain: Add a functionality that modifiesutilization of resource automatically.
> >
> > ---
> >  heartbeat/VirtualDomain |   67 +++++++++++++++++++++++++++++++++++++++++++++++
> >  1 files changed, 67 insertions(+), 0 deletions(-)
> >
> > diff --git a/heartbeat/VirtualDomain b/heartbeat/VirtualDomain
> > index 0786944..d9321d9 100755
> > --- a/heartbeat/VirtualDomain
> > +++ b/heartbeat/VirtualDomain
> > @@ -19,9 +19,15 @@
> >  # Defaults
> >  OCF_RESKEY_force_stop_default=0
> >  OCF_RESKEY_hypervisor_default="$(virsh --quiet uri)"
> > +OCF_RESKEY_dynamic_utilization_default="true"
> > +OCF_RESKEY_set_utilization_cpu_default="true"
> > +OCF_RESKEY_set_utilization_memory_default="true"
> > 
> >  : ${OCF_RESKEY_force_stop=${OCF_RESKEY_force_stop_default}}
> >  : ${OCF_RESKEY_hypervisor=${OCF_RESKEY_hypervisor_default}}
> > +: ${OCF_RESKEY_dynamic_utilization=${OCF_RESKEY_dynamic_utilization_default}}
> > +: ${OCF_RESKEY_set_utilization_cpu=${OCF_RESKEY_set_utilization_cpu_default}}
> > +: ${OCF_RESKEY_set_utilization_memory=${OCF_RESKEY_set_utilization_memory_default}}
> >  #######################################################################
> > 
> >  ## I'd very much suggest to make this RA use bash,
> > @@ -117,6 +123,28 @@ Be sure to set the timeout of these operations to accommodate this delay.
> >  <content type="string" default="" />
> >  </parameter>
> > 
> > +<parameter name="dynamic_utilization" unique="0" required="0">
> > +<longdesc lang="en">
> > +If set, the utilization parameter of resource will be reset if there are
> > +difference between resource parameters and system parameters when agent monitor.
> > +Otherwise, the resource parameters will be set once when agent start.
> > +</longdesc>
> > +<shortdesc lang="en">Set utilization of resource when agent monitor</shortdesc>
> > +<content type="boolean" default="true" />
> > +</parameter>
> > +
> > +<parameter name="set_utilization_cpu" unique="0" required="0">
> > +<longdesc lang="en">Enable setting cpu of utilization.</longdesc>
> > +<shortdesc lang="en">Enable setting cpu of utilization</shortdesc>
> > +<content type="boolean" default="true" />
> > +</parameter>
> > +
> > +<parameter name="set_utilization_memory" unique="0" required="0">
> > +<longdesc lang="en">Enable setting memory of utilization.</longdesc>
> > +<shortdesc lang="en">Enable setting memory of utilization</shortdesc>
> > +<content type="boolean" default="true" />
> > +</parameter>
> > +
> >  </parameters>
> > 
> >  <actions>
> > @@ -133,6 +161,33 @@ Be sure to set the timeout of these operations to accommodate this delay.
> >  EOF
> >  }
> > 
> > +set_utilization() {
> > +    local dom_cpu dom_mem
> > +    local uti_cpu uti_mem
> > +
> > +    read dom_cpu dom_mem <<EOF
> > +$(LANG=C virsh $VIRSH_OPTIONS dominfo ${DOMAIN_NAME} |
> > +awk '/CPU\(s\)/{cpu=$2} /Max memory/{mem=$3} END{printf("%d %d\n", cpu, mem/1024)}')
> > +EOF
> > +    uti_cpu=$(crm_resource -Q -r $OCF_RESOURCE_INSTANCE -z -g cpu 2>/dev/null)
> > +    uti_mem=$(crm_resource -Q -r $OCF_RESOURCE_INSTANCE -z -g hv_memory 2>/dev/null)
> > +
> > +    if [ "$OCF_RESKEY_set_utilization_cpu" = "true" -o "$OCF_RESKEY_set_utilization_cpu" = "1" ]; then
> > +        if [ "$dom_cpu" != "$uti_cpu" ]; then
> > +            if ! crm_resource -r $OCF_RESOURCE_INSTANCE -z -p cpu -v $dom_cpu; then
> > +                ocf_log warn "Failed to set cpu of utilization by crm_resource."
> > +            fi
> > +        fi
> > +    fi
> > +    if [ "$OCF_RESKEY_set_utilization_memory" = "true" -o "$OCF_RESKEY_set_utilization_memory" = "1" ]; then
> > +        if [ "$dom_mem" != "$uti_mem" ]; then
> > +            if ! crm_resource -r $OCF_RESOURCE_INSTANCE -z -p hv_memory -v $dom_mem; then
> > +                ocf_log warn "Failed to set hv_memory of utilization by crm_resource."
> > +            fi
> > +        fi
> > +    fi
> > +}
> > +
> >  # Set options to be passed to virsh:
> >  VIRSH_OPTIONS="--connect=${OCF_RESKEY_hypervisor} --quiet"
> > 
> > @@ -236,6 +291,11 @@ VirtualDomain_Start() {
> >      while ! VirtualDomain_Monitor; do
> >  sleep 1
> >      done
> > +
> > +    if [ "$OCF_RESKEY_dynamic_utilization" = "false" -o "$OCF_RESKEY_dynamic_utilization" = "0" ]; then
> > +        set_utilization
> > +    fi
> > +
> >      return $OCF_SUCCESS
> >  }
> > 
> > @@ -404,6 +464,13 @@ VirtualDomain_Monitor() {
> >      fi
> >  done
> >      fi
> > +
> > +    if [ "$OCF_RESKEY_dynamic_utilization" = "true" -o "$OCF_RESKEY_dynamic_utilization" = "1" ]; then
> > +        if ocf_is_probe; then
> > +            set_utilization
> > +        fi
> > +    fi
> > +
> >      return ${rc}
> >  }
> > 
> > --
> > 1.7.2.5
> >
> 
> 
> _______________________________________________
> ha-wg-technical mailing list
> ha-wg-technical at lists.linux-foundation.org
> https://lists.linux-foundation.org/mailman/listinfo/ha-wg-technical

> From e39948043d94c30557851d2b759468da3935d072 Mon Sep 17 00:00:00 2001
> From: John Shi <jshi at suse.de>
> Date: Fri, 28 Oct 2011 21:53:33 +0800
> Subject: [PATCH] Low: Build: New agent NodeUtilization which is detecting os information and putting them into CIB by crm_attribute
> 
> ---
>  extra/resources/Makefile.am     |    1 +
>  extra/resources/NodeUtilization |  228 +++++++++++++++++++++++++++++++++++++++
>  2 files changed, 229 insertions(+), 0 deletions(-)
>  create mode 100644 extra/resources/NodeUtilization
> 
> diff --git a/extra/resources/Makefile.am b/extra/resources/Makefile.am
> index bc35401..210e9ed 100644
> --- a/extra/resources/Makefile.am
> +++ b/extra/resources/Makefile.am
> @@ -27,6 +27,7 @@ ocf_SCRIPTS	     =  ClusterMon 	\
>  			Dummy		\
>  			HealthCPU	\
>  			HealthSMART	\
> +			NodeUtilization	\
>  			o2cb		\
>  			ping		\
>  			pingd		\
> diff --git a/extra/resources/NodeUtilization b/extra/resources/NodeUtilization
> new file mode 100644
> index 0000000..483053a
> --- /dev/null
> +++ b/extra/resources/NodeUtilization
> @@ -0,0 +1,228 @@
> +#!/bin/sh
> +#
> +#
> +#	NodeUtilization OCF Resource Agent
> +#
> +# Copyright (c) 2011 SUSE LINUX, John Shi
> +#                    All Rights Reserved.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of version 2 of the GNU General Public License as
> +# published by the Free Software Foundation.
> +#
> +# This program is distributed in the hope that it would be useful, but
> +# WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> +#
> +# Further, this software is distributed without any warranty that it is
> +# free of the rightful claim of any third person regarding infringement
> +# or the like.  Any license provided herein, whether implied or
> +# otherwise, applies only to this software file.  Patent licenses, if
> +# any, provided herein do not apply to combinations of this program with
> +# other software, or any other product whatsoever.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write the Free Software Foundation,
> +# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
> +#
> +#######################################################################
> +# Initialization:
> +
> +. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
> +
> +#######################################################################
> +
> +meta_data() {
> +	cat <<END
> +<?xml version="1.0"?>
> +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
> +<resource-agent name="NodeUtilization">
> +<version>1.0</version>
> +
> +<longdesc lang="en">
> +This is an NodeUtilization Resource Agent.
> +This agent detects system parameters and put them into CIB by crm_attribute,
> +and it runs on every node as clone resource.
> +</longdesc>
> +<shortdesc lang="en">NodeUtilization resource agent</shortdesc>
> +
> +<parameters>
> +<parameter name="dynamic" unique="0" required="0">
> +<longdesc lang="en">
> +If set, some of the HA parameters will be reset if there are
> +difference between HA parameters and system parameters when HA monitor.
> +Otherwise, the HA parameters will be set once when the resource instance starts.
> +</longdesc>
> +<shortdesc lang="en">Set HA parameters when start or monitor</shortdesc>
> +<content type="boolean" default="true" />
> +</parameter>
> +
> +<parameter name="utilization_cpu" unique="0" required="0">
> +<longdesc lang="en">Enable setting cpu utilization.</longdesc>
> +<shortdesc lang="en">Enable setting cpu utilization.</shortdesc>
> +<content type="boolean" default="true" />
> +</parameter>
> +
> +<parameter name="utilization_cpu_reservation" unique="0" required="0">
> +<longdesc lang="en">CPU reserved for non-HA related usage.</longdesc>
> +<shortdesc lang="en">CPU reserved for non-HA related usage.</shortdesc>
> +<content type="integer" default="1" />
> +</parameter>
> +
> +<parameter name="utilization_host_memory" unique="0" required="0">
> +<longdesc lang="en">Enable setting memory utilization of host.</longdesc>
> +<shortdesc lang="en">Enable setting memory utilization of host.</shortdesc>
> +<content type="boolean" default="true" />
> +</parameter>
> +
> +<parameter name="utilization_host_memory_reservation" unique="0" required="0">
> +<longdesc lang="en">Memory reserved for other services inside host, in MB.</longdesc>
> +<shortdesc lang="en">Memory reserved for other services inside host, in MB.</shortdesc>
> +<content type="integer" default="512" />
> +</parameter>
> +
> +<parameter name="utilization_hv_memory" unique="0" required="0">
> +<longdesc lang="en">Enable setting the memory utilization of hypervisor.</longdesc>
> +<shortdesc lang="en">Enable setting the memory utilization of hypervisor.</shortdesc>
> +<content type="boolean" default="true" />
> +</parameter>
> +
> +<parameter name="utilization_hv_memory_reservation" unique="0" required="0">
> +<longdesc lang="en">Memory reserved for the hypervisor, in MB.</longdesc>
> +<shortdesc lang="en">Memory reserved for the hypervisor, in MB.</shortdesc>
> +<content type="integer" default="512" />
> +</parameter>
> +</parameters>
> +
> +<actions>
> +<action name="start"   timeout="90" />
> +<action name="stop"    timeout="100" />
> +<action name="monitor" timeout="20s" interval="60s"/>
> +<action name="meta-data"  timeout="5" />
> +<action name="validate-all"  timeout="30" />
> +</actions>
> +</resource-agent>
> +END
> +}
> +
> +set_utilization() {
> +    host_name="$(hostname)"
> +
> +    if [ "$OCF_RESKEY_utilization_cpu" = "true" -o "$OCF_RESKEY_utilization_cpu" = "1" ]; then
> +        sys_cpu=$(( $(grep -c processor /proc/cpuinfo) - $OCF_RESKEY_utilization_cpu_reservation ))
> +        uti_cpu=$(crm_attribute -Q -t nodes -U "$host_name" -z -n cpu 2>/dev/null)
> +
> +        if [ "$sys_cpu" != "$uti_cpu" ]; then
> +            if ! crm_attribute -t nodes -U "$host_name" -z -n cpu -v $sys_cpu; then
> +                ocf_log err "Failed to set cpu of utilization by crm_attribute."
> +                return 1
> +            fi
> +        fi
> +    fi
> +
> +    if [ "$OCF_RESKEY_utilization_host_memory" = "true" -o "$OCF_RESKEY_utilization_host_memory" = "1" ]; then
> +        sys_mem=$(( $(awk '/MemTotal/{printf("%d\n",$2/1024);exit(0)}' /proc/meminfo) - $OCF_RESKEY_utilization_host_memory_reservation ))
> +        uti_mem=$(crm_attribute -Q -t nodes -U "$host_name" -z -n host_memory 2>/dev/null)
> +
> +        if [ "$sys_mem" != "$uti_mem" ]; then
> +            if ! crm_attribute -t nodes -U "$host_name" -z -n host_memory -v $sys_mem; then
> +                ocf_log err "Failed to set host_memory of utilization by crm_attribute."
> +                return 1
> +            fi
> +        fi
> +    fi
> +
> +    if [ -x /usr/sbin/xm ]; then
> +        if [ "$OCF_RESKEY_utilization_hv_memory" = "true" -o "$OCF_RESKEY_utilization_hv_memory" = "1" ]; then
> +            hv_mem=$(( $(xm info | awk '/max_free_memory/{printf("%d\n",$3);exit(0)}') - $OCF_RESKEY_utilization_hv_memory_reservation ))
> +            uti_mem=$(crm_attribute -Q -t nodes -U "$host_name" -z -n hv_memory 2>/dev/null)
> +
> +            if [ "$hv_mem" != "$uti_mem" ]; then
> +                if ! crm_attribute -t nodes -U "$host_name" -z -n hv_memory -v $hv_mem; then
> +                    ocf_log err "Failed to set hv_memory of utilization by crm_attribute."
> +                    return 1
> +                fi
> +            fi
> +        fi
> +    fi
> +}
> +
> +NodeUtilization_usage() {
> +	cat <<END
> +usage: $0 {start|stop|monitor|validate-all|meta-data}
> +
> +Expects to have a fully populated OCF RA-compliant environment set.
> +END
> +}
> +
> +NodeUtilization_start() {
> +    if ! touch "$OCF_RESKEY_pidfile"; then
> +        ocf_log err "Failed to touch pidfile: ${OCF_RESKEY_pidfile}."
> +        exit $OCF_ERR_GENERIC
> +    fi
> +    if [ "$OCF_RESKEY_dynamic" = "false" -o "$OCF_RESKEY_dynamic" = "0" ]; then
> +        if ! set_utilization; then
> +            exit $OCF_ERR_GENERIC
> +        fi
> +    fi
> +    exit $OCF_SUCCESS
> +}
> +
> +NodeUtilization_stop() {
> +    rm -f $OCF_RESKEY_pidfile
> +    exit $OCF_SUCCESS
> +}
> +
> +NodeUtilization_monitor() {
> +    if [ ! -f $OCF_RESKEY_pidfile ]; then
> +        exit $OCF_NOT_RUNNING
> +    fi
> +
> +    if [ "$OCF_RESKEY_dynamic" = "true" -o "$OCF_RESKEY_dynamic" = "1" ]; then
> +        if ! set_utilization; then
> +            exit $OCF_ERR_GENERIC
> +        fi
> +    fi
> +    exit $OCF_SUCCESS
> +}
> +
> +NodeUtilization_validate() {
> +    exit $OCF_SUCCESS
> +}
> +
> +
> +: ${OCF_RESKEY_pidfile:="$HA_VARRUN/NodeUtilization-${OCF_RESOURCE_INSTANCE}"}
> +: ${OCF_RESKEY_dynamic:="true"}
> +: ${OCF_RESKEY_utilization_cpu:="true"}
> +: ${OCF_RESKEY_utilization_cpu_reservation="1"}
> +: ${OCF_RESKEY_utilization_hv_memory:="true"}
> +: ${OCF_RESKEY_utilization_hv_memory_reservation="512"}
> +: ${OCF_RESKEY_utilization_host_memory:="true"}
> +: ${OCF_RESKEY_utilization_host_memory_reservation="512"}
> +
> +if [ $# -ne 1 ]; then
> +    NodeUtilization_usage
> +    exit $OCF_ERR_ARGS
> +fi
> +
> +case $__OCF_ACTION in
> +meta-data)	meta_data
> +		exit $OCF_SUCCESS
> +		;;
> +start)		NodeUtilization_start
> +		;;
> +stop)		NodeUtilization_stop
> +		;;
> +monitor)	NodeUtilization_monitor
> +		;;
> +validate-all)	NodeUtilization_validate
> +		;;
> +usage|help)	NodeUtilization_usage
> +		exit $OCF_SUCCESS
> +		;;
> +*)		NodeUtilization_usage
> +		exit $OCF_ERR_UNIMPLEMENTED
> +		;;
> +esac
> +
> +exit $?
> -- 
> 1.6.0.2
> 

> From 7fffa2d22efb1610a4ca2424b6bc9455f1f5cce8 Mon Sep 17 00:00:00 2001
> From: John Shi <jshi at suse.de>
> Date: Fri, 28 Oct 2011 21:56:51 +0800
> Subject: [PATCH] Low: VirtualDomain: Add a functionality that modifies utilization of resource automatically.
> 
> ---
>  heartbeat/VirtualDomain |   67 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 67 insertions(+), 0 deletions(-)
> 
> diff --git a/heartbeat/VirtualDomain b/heartbeat/VirtualDomain
> index 0786944..d9321d9 100755
> --- a/heartbeat/VirtualDomain
> +++ b/heartbeat/VirtualDomain
> @@ -19,9 +19,15 @@
>  # Defaults
>  OCF_RESKEY_force_stop_default=0
>  OCF_RESKEY_hypervisor_default="$(virsh --quiet uri)"
> +OCF_RESKEY_dynamic_utilization_default="true"
> +OCF_RESKEY_set_utilization_cpu_default="true"
> +OCF_RESKEY_set_utilization_memory_default="true"
>  
>  : ${OCF_RESKEY_force_stop=${OCF_RESKEY_force_stop_default}}
>  : ${OCF_RESKEY_hypervisor=${OCF_RESKEY_hypervisor_default}}
> +: ${OCF_RESKEY_dynamic_utilization=${OCF_RESKEY_dynamic_utilization_default}}
> +: ${OCF_RESKEY_set_utilization_cpu=${OCF_RESKEY_set_utilization_cpu_default}}
> +: ${OCF_RESKEY_set_utilization_memory=${OCF_RESKEY_set_utilization_memory_default}}
>  #######################################################################
>  
>  ## I'd very much suggest to make this RA use bash,
> @@ -117,6 +123,28 @@ Be sure to set the timeout of these operations to accommodate this delay.
>  <content type="string" default="" />
>  </parameter>
>  
> +<parameter name="dynamic_utilization" unique="0" required="0">
> +<longdesc lang="en">
> +If set, the utilization parameter of resource will be reset if there are
> +difference between resource parameters and system parameters when agent monitor.
> +Otherwise, the resource parameters will be set once when agent start.
> +</longdesc>
> +<shortdesc lang="en">Set utilization of resource when agent monitor</shortdesc>
> +<content type="boolean" default="true" />
> +</parameter>
> +
> +<parameter name="set_utilization_cpu" unique="0" required="0">
> +<longdesc lang="en">Enable setting cpu of utilization.</longdesc>
> +<shortdesc lang="en">Enable setting cpu of utilization</shortdesc>
> +<content type="boolean" default="true" />
> +</parameter>
> +
> +<parameter name="set_utilization_memory" unique="0" required="0">
> +<longdesc lang="en">Enable setting memory of utilization.</longdesc>
> +<shortdesc lang="en">Enable setting memory of utilization</shortdesc>
> +<content type="boolean" default="true" />
> +</parameter>
> +
>  </parameters>
>  
>  <actions>
> @@ -133,6 +161,33 @@ Be sure to set the timeout of these operations to accommodate this delay.
>  EOF
>  }
>  
> +set_utilization() {
> +    local dom_cpu dom_mem
> +    local uti_cpu uti_mem
> +
> +    read dom_cpu dom_mem <<EOF
> +$(LANG=C virsh $VIRSH_OPTIONS dominfo ${DOMAIN_NAME} |
> +awk '/CPU\(s\)/{cpu=$2} /Max memory/{mem=$3} END{printf("%d %d\n", cpu, mem/1024)}')
> +EOF
> +    uti_cpu=$(crm_resource -Q -r $OCF_RESOURCE_INSTANCE -z -g cpu 2>/dev/null)
> +    uti_mem=$(crm_resource -Q -r $OCF_RESOURCE_INSTANCE -z -g hv_memory 2>/dev/null)
> +
> +    if [ "$OCF_RESKEY_set_utilization_cpu" = "true" -o "$OCF_RESKEY_set_utilization_cpu" = "1" ]; then
> +        if [ "$dom_cpu" != "$uti_cpu" ]; then
> +            if ! crm_resource -r $OCF_RESOURCE_INSTANCE -z -p cpu -v $dom_cpu; then
> +                ocf_log warn "Failed to set cpu of utilization by crm_resource."
> +            fi
> +        fi
> +    fi
> +    if [ "$OCF_RESKEY_set_utilization_memory" = "true" -o "$OCF_RESKEY_set_utilization_memory" = "1" ]; then
> +        if [ "$dom_mem" != "$uti_mem" ]; then
> +            if ! crm_resource -r $OCF_RESOURCE_INSTANCE -z -p hv_memory -v $dom_mem; then
> +                ocf_log warn "Failed to set hv_memory of utilization by crm_resource."
> +            fi
> +        fi
> +    fi
> +}
> +
>  # Set options to be passed to virsh:
>  VIRSH_OPTIONS="--connect=${OCF_RESKEY_hypervisor} --quiet"
>  
> @@ -236,6 +291,11 @@ VirtualDomain_Start() {
>      while ! VirtualDomain_Monitor; do
>  	sleep 1
>      done
> +
> +    if [ "$OCF_RESKEY_dynamic_utilization" = "false" -o "$OCF_RESKEY_dynamic_utilization" = "0" ]; then
> +        set_utilization
> +    fi
> +
>      return $OCF_SUCCESS
>  }
>  
> @@ -404,6 +464,13 @@ VirtualDomain_Monitor() {
>  	    fi
>  	done
>      fi
> +
> +    if [ "$OCF_RESKEY_dynamic_utilization" = "true" -o "$OCF_RESKEY_dynamic_utilization" = "1" ]; then
> +        if ocf_is_probe; then
> +            set_utilization
> +        fi
> +    fi
> +
>      return ${rc}
>  }
>  
> -- 
> 1.6.4.2
> 

> _______________________________________________
> ha-wg-technical mailing list
> ha-wg-technical at lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/ha-wg-technical



More information about the ha-wg-technical mailing list