From patchwork Mon May 11 12:59:49 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas Meneghel Rodrigues X-Patchwork-Id: 22970 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n4BD5aEZ000443 for ; Mon, 11 May 2009 13:05:36 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754132AbZEKNE5 (ORCPT ); Mon, 11 May 2009 09:04:57 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753592AbZEKNE5 (ORCPT ); Mon, 11 May 2009 09:04:57 -0400 Received: from mx2.redhat.com ([66.187.237.31]:43051 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752433AbZEKNEz (ORCPT ); Mon, 11 May 2009 09:04:55 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n4BD4uRx028988 for ; Mon, 11 May 2009 09:04:56 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n4BD4tw1005441; Mon, 11 May 2009 09:04:55 -0400 Received: from [10.11.13.37] (vpn-13-37.rdu.redhat.com [10.11.13.37]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n4BD4rTi024466; Mon, 11 May 2009 09:04:54 -0400 Subject: Re: [KVM-AUTOTEST][PATCH] timedrift support From: Lucas Meneghel Rodrigues To: Bear Yang Cc: Marcelo Tosatti , uril@redhat.com, kvm@vger.kernel.org In-Reply-To: <4A08008E.8060105@redhat.com> References: <4A010BCD.8060307@redhat.com> <20090506130247.GA5048@amt.cnet> <4A08008E.8060105@redhat.com> Date: Mon, 11 May 2009 09:59:49 -0300 Message-Id: <1242046789.2930.8.camel@localhost.localdomain> Mime-Version: 1.0 X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org On Mon, 2009-05-11 at 18:40 +0800, Bear Yang wrote: > Hello. > I have modified my script according Marcelo's suggestion. and resubmit > my script to you all. :) > > Marcelo, Seems except you, no one care my script. I still want to say > any suggestion on my script would be greatly appreciated. > > Thanks. > > Bear > Hi Bear, sorry, I had some hectic days here so I still haven't reviewed your patch. As a general comment, I realize that in several occasions we are using os.system() to execute commands on the host, when we would usually prefer to use the utils.system() or utils.run() API, since it already throws an exception when exit code != 0 (you can allways set ignore_fail = True to avoid this behavior if needed) and we are working on doing a better handling of stdout and stderr upstream. My comments follow: + + if not s: + raise error.TestFail, "Guest seems hang or ssh service based on guest has been crash down" + + if not time_drift_or_not(o): + count += 1 + + if count == 5: + raise error.TestFail, "TimeDrift testing Abort because guest's clock has drift too much" + + kvm_log.info("*********************** Sleep 30 seconds for next loop *************************") + time.sleep(60) + --- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff -urN kvm_runtest_2.bak/cpu_stress.c kvm_runtest_2/cpu_stress.c --- kvm_runtest_2.bak/cpu_stress.c 1969-12-31 19:00:00.000000000 -0500 +++ kvm_runtest_2/cpu_stress.c 2009-05-05 22:35:34.000000000 -0400 @@ -0,0 +1,61 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + +#define MAX_CPUS 256 +#define BUFFSIZE 1024 + + +void worker_child(int cpu) +{ + int cur_freq; + int min_freq; + int max_freq; + int last_freq; + cpu_set_t mask; + int i; + double x; + int d = 0; + /* + * bind this thread to the specified cpu + */ + CPU_ZERO(&mask); + CPU_SET(cpu, &mask); + sched_setaffinity(0, CPU_SETSIZE, &mask); + + while (d++ != 500000) { + for (i=0; i<100000; i++) + x = sqrt(x); + } + + _exit(0); + +} + + +main() { + cpu_set_t mask; + int i; + int code; + + if (sched_getaffinity(0, CPU_SETSIZE, &mask) < 0){ + perror ("sched_getaffinity"); + exit(1); + } + + for (i=0; i> /etc/timedrift.ntp.conf;\ + echo "restrict 127.0.0.1" >> /etc/timedrift.ntp.conf;\ + echo "driftfile /var/lib/ntp/drift" >> /etc/timedrift.ntp.conf;\ + echo "keys /etc/ntp/keys" >> /etc/timedrift.ntp.conf;\ + echo "server 127.127.1.0" >> /etc/timedrift.ntp.conf;\ + echo "fudge 127.127.1.0 stratum 1" >> /etc/timedrift.ntp.conf;\ + ntpd -c /etc/timedrift.ntp.conf; + ''' + if os.system(ntp_cmd): + raise error.TestFail, "NTP server has not starting correct..." Here you could have used regular utils.system API instead of os.system since it integrates better with the autotest infrastructure. Instead of the if clause we'd put a try/except block. Minor nipticking, "NTP server has not started correctly..." + #kvm_log.info("sync system clock to BIOS") + #os.system("/sbin/hwclock --systohc") + +def run_timedrift(test, params, env): + """judge wether the guest clock will encounter timedrift prblem or not. including three stages: Typo, "whether" + 1: try to sync the clock with host, if the offset value of guest clock is large than 1 sec. + 2: running the cpu stress testing program on guest + 3: then run analyze loop totally 20 times to determine if the clock on guest has time drift. + """ + # variables using in timedrift testcase + cpu_stress_program = "cpu_stress.c" + remote_dir = '/root' + + clock_resource_cmd = "cat /sys/devices/system/clocksource/clocksource0/current_clocksource" + + pwd = os.path.join(os.environ['AUTODIR'],'tests/kvm_runtest_2') + cpu_stress_test = os.path.join(pwd, cpu_stress_program) + cpu_stress_cmdline = 'cd %s;gcc %s -lm;./a.out &' % (remote_dir, os.path.basename(cpu_stress_test)) + + cpu_stress_search_cmdline = "ps -ef|grep 'a.out'|grep -v grep" + + hostname = os.environ.get("HOSTNAME") Can't we use socket.gethostname() here instead of relying on environment variable values? + if "localhost.localdomain" == hostname: + hostname = os.popen('hostname').read().split('\n')[0] + kvm_log.info("since get wrong hostname from python evnironment, then use the hostname get from system call(hostname).") + + kvm_log.info("get host name :%s" % hostname) + + # ntpdate info command and ntpdate sync command + ntpdate_info_cmd = "ntpdate -q %s" % hostname + ntpdate_sync_cmd = "ntpdate %s" % hostname + + # get vm handle + vm = kvm_utils.env_get_vm(env,params.get("main_vm")) + if not vm: + raise error.TestError, "VM object not found in environment" + if not vm.is_alive(): + raise error.TestError, "VM seems to be dead; Test requires a living VM" I am seeing this piece of code to get the VM handle on several tests, I am starting to think we should factor this on an utility function... + kvm_log.info("Waiting for guest to be up...") + + pxssh = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2) + if not pxssh: + raise error.TestFail, "Could not log into guest" + + kvm_log.info("Logged into guest IN run_timedrift function.") + + # clock resource get from host and guest + host_clock_resource = os.popen(clock_resource_cmd).read().split('\n')[0] + kvm_log.info("the clock resource on host is :%s" % host_clock_resource) + + pxssh.sendline(clock_resource_cmd) + s, o = pxssh.read_up_to_prompt() + guest_clock_resource = o.splitlines()[-2] + kvm_log.info("the clock resource on guest is :%s" % guest_clock_resource) + + if host_clock_resource != guest_clock_resource: + #raise error.TestFail, "Host and Guest using different clock resource" + kvm_log.info("Host and Guest using different clock resource,Let's moving on.") + else: + kvm_log.info("Host and Guest using same clock resource,Let's moving on.") Little mistake here, "Let's move on." + # helper function: + # ntpdate_op: a entire process to get ntpdate command line result from guest. + # time_drift_or_not: get the numeric handing by regular expression and make timedrift calulation. + def ntpdate_op(command): + output = [] + try: + pxssh = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2) + if not pxssh: + raise error.TestFail, "Could not log into guest" + + kvm_log.info("Logged in:(ntpdate_op)") + + while True: + pxssh.sendline(command) + s, output = pxssh.read_up_to_prompt() + if "time server" in output: + # output is a string contain the (ntpdate -q) infor on guest + return True, output + else: + continue + except: + pxssh.close() + return False, output + return False, output + + def time_drift_or_not(output): + date_string = re.findall(r'offset [+-]?(.*) sec', output, re.M) + num = float(date_string[0]) + if num >= 1: + kvm_log.info("guest clock has drifted in this scenario :%s %s" % (date_string, num)) + return False + else: + kvm_log.info("guest clock running veracious in now stage :%s %s" % (date_string, num)) + return True + + # send the command and get the ouput from guest + # this loop will pick out several conditions need to be process + # Actually, we want to get the info match "time server", then script can analyzing it to + # determine if guest's clock need sync with host or not. + while True: + pxssh.sendline(ntpdate_info_cmd) + s, output = pxssh.read_up_to_prompt() + kvm_log.info("the ntpdate query info get from guest is below: \n%s" %output) + if ("no server suitable" not in output) and ("time server" not in output): + kvm_log.info("very creazying output got. let's try again") + continue + elif "no server suitable" in output: + kvm_log.info("seems NTP server is not ready for servicing") + time.sleep(30) + continue + elif "time server" in output: + # get the ntpdate info from guest + # kvm_log.info("Got the correct output for analyze. The output is below: \n%s" %output) + break + + kvm_log.info("get the ntpdate infomation from guest successfully :%s" % os.popen('date').read()) + + # judge the clock need to sync with host or not + while True: + date_string = re.findall(r'offset [+-]?(.*) sec', output, re.M) + num = float(date_string[0]) + if num >= 1: + kvm_log.info("guest need sync with the server: %s" % hostname) + s, output = ntpdate_op(ntpdate_sync_cmd) + if s: + continue + else: + #pxssh.sendline("hwclock --systohc") + #kvm_log.info("guest clock sync prcdure is finished. then sync the guest clock to guest bios.") + + #pxssh.sendline("hwclock --show") + #s, o = pxssh.read_up_to_prompt() + #kvm_log.info("the date infomation get from guest bios is :\n%s" % o) + + pxssh.sendline(ntpdate_info_cmd) + s, o = pxssh.read_up_to_prompt() + kvm_log.info("guest clock after sync with host is :\n%s" % o) + + break + + kvm_log.info("Timedrift Preparation *Finished* at last :%s" % os.popen('date').read()) + + if not vm.scp_to_remote(cpu_stress_test, remote_dir): + raise error.TestError, "Could not copy program to guest." + + pxssh.sendline(ntpdate_info_cmd) + s, o = pxssh.read_up_to_prompt() + kvm_log.info("the ntpdate query from host *BEFORE* running the cpu stress program.\n%s" % o) + pxssh.sendline(cpu_stress_cmdline) + s, o = pxssh.read_up_to_prompt() + kvm_log.info("running command line on guest and sleeping for 1200 secs.\n%s" % o) + + time.sleep(1200) + + while True: + if pxssh.get_command_status(cpu_stress_search_cmdline): + #(s, o) = pxssh.get_command_status_output(cpu_stress_search_cmdline) + #print "s is :%s" % s + #print "o is :%s" % o + #print "--------------------------------------------" + #aaa = pxssh.get_command_status(cpu_stress_search_cmdline) + #print "aaa is :%s" % aaa + #print "--------------------------------------------" + + print "stress testing process has been completed and quit." + break + else: + print "stress testing on CPU has not finished yet.waiting for next detect after sleep 60 secs." + time.sleep(60) + continue + + pxssh.sendline(ntpdate_info_cmd) + s, o = pxssh.read_up_to_prompt() + kvm_log.info("the ntpdate query from host *AFTER* running the cpu stress program.\n%s" % o) + + pxssh.close() + + # Sleep for analyze... + kvm_log.info("sleeping(180 secs) Starting... :%s" % os.popen('date').read()) + time.sleep(180) + kvm_log.info("wakeup to get the analyzing... :%s" % os.popen('date').read()) + count = 0 + for i in range(1, 21): + kvm_log.info("this is %s time to get clock info from guest." % i) + s, o = ntpdate_op(ntpdate_info_cmd)