Removed /usr/local from CDPATH
[clearscm.git] / cc / perf / pulse
1 #!/usr/bin/perl
2 ################################################################################
3 #
4 # File:         pulse,v
5 # Revision:     1.1.1.1
6 # Description:  Checks Clearcase's "pulse" by attempting to some rudimentary
7 #               Clearcase operations and timing them. Timing data is logged
8 #               for historical purposes.
9 # Author:       Andrew@DeFaria.com
10 # Created:      Thu Dec 29 12:07:59 PST 2005
11 # Modified:     2007/05/17 07:45:48
12 # Language:     perl
13 #
14 # (c) Copyright 2005, Andrew@DeFaria.com, all rights reserved
15 #
16 ################################################################################
17 use strict;
18 use warnings;
19 use File::Spec;
20
21 my $me;
22
23 BEGIN {
24   # Set $lib_path
25   my $lib_path = $^O =~ /MSWin/ ? "\\\\brcm-irv\\dfs\\projects\\ccase\\SCM\\lib"
26                                 : "/projects/ccase/SCM/lib";
27
28   # Extract relative path and basename from script name.
29   $0 =~ /(.*)[\/\\](.*)/;
30
31   my $abs_path  = (!defined $1) ? "." : File::Spec->rel2abs ($1);
32   $me           = (!defined $2) ? $0  : $2;
33   $me           =~ s/\.pl$//;
34
35   # Add the appropriate path to our modules to @INC array.
36   unshift @INC, "$lib_path";
37   unshift @INC, $ENV {SITE_PERL_LIBPATH} if defined $ENV {SITE_PERL_LIBPATH};
38   unshift @INC, "$abs_path";
39 } # BEGIN
40
41 use OSDep;
42 use Display;
43 use Logger;
44 use Clearcase;
45 use Clearcase::Vob;
46 use Clearcase::View;
47 use Clearcase::Element;
48 use TimeUtils;
49
50 my $version = "1.0";
51
52 # We need a view context. We'll create this view if necessary.
53 my $tag = "default";
54
55 # Which vob are we going to use
56 my $vobtag = "perftest";
57
58 # We need an element to check out and in
59 my $element_name = "testelement";
60
61 # How long is too long?
62 my $too_long = 60; # seconds;
63
64 # How many times will we perform the checkout/in?
65 my $iterations = 10;
66
67 # Some options that we use
68 my %identical = (
69   "-identical", "",
70   "-nc",        "",
71 );
72 my %nc = (
73   "-nc",        "",
74 );
75 my %rm = (
76   "-rm",        "",
77 );
78 my %force = (
79   "-force",     "",
80 );
81
82 my $log;
83 my $view;
84 my $step_start_time;
85
86 # Path to logs directory
87 my $logdir = "$scm_base$/logs";
88
89 error "Logdir $logdir does not exist - $!", 1 if !-d $logdir;
90
91 my $cc = Clearcase->new;
92
93 sub Usage {
94   my $msg = shift;
95
96   display "ERROR: $msg\n" if defined $msg;
97
98   display "Usage:\t$me (v$version) [-u] [-v] [-d] [-view <viewtag>] [-vob <vobtag>]
99 \t[-element <element>] [-t <n>] [-i <n>]
100
101 Where:
102
103   -u:       Display usage
104   -v:       Turn on verbose mode
105   -d:       Turn on debug mode
106   -view:    View tag to create/use (Default: $tag)
107   -vob:     Vob tag to use (Default $vobtag)
108   -element: Vob relative path to element to checkout/in (Default: $element_name)
109   -t <n>:   Threshold of what is \"too long\" (Default $too_long seconds)
110   -i <n>:   Number of iterations (default $iterations)
111 ";
112   exit 1;
113 } # Usage
114
115 sub Setup {
116   $log = Logger->new (
117     name        => $cc->sitename . "." . $me,
118     path        => $logdir,
119     timestamped => "true",
120     append      => "true"
121   );
122
123   verbose "Startup";
124
125   # Set up view
126   verbose "Setting u p view $tag";
127   $view = Clearcase::View->new (tag => $tag);
128   $view->create;
129
130   $view->set;
131
132   # Set up vob
133   verbose "Setting up vob $vobtag";
134   my $vob = Clearcase::Vob->new (tag => $vobtag);
135
136   $log->err ("Vob $Clearcase::VOBTAG_PREFIX$vobtag doesn't exist", 1) if !$vob;
137
138   $vob->mount;
139
140   chdir "$Clearcase::VIEWTAG_PREFIX/$tag$Clearcase::VOBTAG_PREFIX$vobtag"
141     or $log->err ("Unable to chdir to vob root", 1);
142
143   # Create an element
144   verbose "Creating element $element_name";
145   my $size              = 5;
146   my $meg               = 1024 * 1024;
147   my $buf               = 1024;
148   my $bytes_to_write    = $size * $meg;
149   my $bytes_written     = 0;
150
151   # Can we make a file in tmp?
152   open ELEMENT, ">$element_name"
153     or error "Unable to create element $element_name - $!", 1;
154
155   while ($bytes_written < $bytes_to_write) {
156     my $data = "." x $buf;
157
158     print ELEMENT $data;
159     $bytes_written += $buf;
160   } # while
161
162   close ELEMENT;
163
164   verbose "Setup complete";
165
166   return Clearcase::Element->create ($element_name);
167 } # Setup
168
169 sub Shutdown {
170   my $element = shift;
171
172   verbose "Shutdown";
173   verbose "Unchecking out $element->{name}";
174   $element->uncheckout (%rm);
175   verbose "Removing $element->{name}";
176   $element->remove     (%force);
177
178   my $parent = Clearcase::Element->new (name => ".");
179
180   verbose "Canceling checkout of parent directory";
181   $parent->uncheckout;
182 } # Shutdown
183
184 sub Checkout_in {
185   my $element = shift;
186
187   verbose "Checking in $element->{name}";
188   $element->checkin (%identical);
189
190   verbose "Checking out $element->{name}";
191   $element->checkout (%nc);
192 } # Checkout_in
193
194 while ($ARGV [0]) {
195   if ($ARGV [0] eq "-v") {
196     Display::set_verbose;
197   } elsif ($ARGV [0] eq "-d") {
198     set_debug;
199   } elsif ($ARGV [0] eq "-u") {
200     Usage;
201   } elsif ($ARGV [0] eq "-view") {
202     shift @ARGV;
203     if ($ARGV [0]) {
204       $view = $ARGV [0];
205     } else {
206       Usage "Need to specify view after -view";
207     } # if
208   } elsif ($ARGV [0] eq "-vob") {
209     shift @ARGV;
210     if ($ARGV [0]) {
211       $too_long = $ARGV [0];
212     } else {
213       Usage "Need to specify vob after -vob";
214     } # if
215   } elsif ($ARGV [0] eq "-element") {
216     shift @ARGV;
217     if ($ARGV [0]) {
218       $too_long = $ARGV [0];
219     } else {
220       Usage "Need to specify vob relative path to element after -element";
221     } # if
222   } elsif ($ARGV [0] eq "-t") {
223     shift @ARGV;
224     if ($ARGV [0]) {
225       $too_long = $ARGV [0];
226     } else {
227       Usage "Need to specify number of seconds after -t";
228     } # if
229   } elsif ($ARGV [0] eq "-i") {
230     shift @ARGV;
231     if ($ARGV [0]) {
232       $too_long = $ARGV [0];
233     } else {
234       Usage "Need to specify number of iterations after -i";
235     } # if
236   } else {
237     Usage "Invalid argument: $ARGV [0]";
238   } # if
239
240   shift (@ARGV);
241 } # while
242
243 my $element = Setup;
244
245 $log->err ("Unable to setup environment", 1) if !$element;
246
247 $step_start_time = time;
248
249 $log->msg ("Performing $iterations checkout/ins in view $tag vob $vobtag of element " . $element->name);
250 for (my $i = 0; $i < $iterations; $i++) {
251   verbose "Iteration #" . ($i + 1);
252   Checkout_in $element;
253 } # for
254
255 my $end_time = time;
256
257 display_duration $step_start_time, $log;
258
259 if (($end_time - $step_start_time) > $too_long) {
260   my $msg = "Taking too long to perform $iterations checkout/ins\nShould take less than $too_long seconds";
261   $log->err ($msg);
262   error $msg;
263 } # if
264
265 Shutdown $element;