GreenCloud Simulator
cbrclouduser.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
2 /*
3  */
4 
5 #include <stdlib.h>
6 
7 #include "random.h"
8 #include "trafgen.h"
9 #include "ranvar.h"
10 #include "clouduser.h"
11 
12 
13 /*
14  * Constant bit rate traffic source. Parameterized by interval, (optional)
15  * random noise in the interval, and packet size.
16  */
17 
18 class CBRCloudUser : public TrafficGenerator, public CloudUser {
19 public:
20  CBRCloudUser();
21  virtual double next_interval(int&);
22  //HACK so that udp agent knows interpacket arrival time within a burst
23  inline double interval() { return (interval_); }
24  virtual void timeout();
25  int command(int argc, const char*const* argv);
26 
27  void addDataCenterPointer(DataCenter *joindc_);
28 protected:
29  virtual void start();
30  void init();
31  double rate_; /* send rate during on time (bps) */
32  double interval_; /* packet inter-arrival time during burst (sec) */
33  double random_;
34  int seqno_;
35  int maxpkts_;
36 };
37 
38 
39 static class CBRCloudUserClass : public TclClass {
40 public:
41  CBRCloudUserClass() : TclClass("Application/Traffic/CBRCloudUser") {}
42  TclObject* create(int, const char*const*) {
43  return (new CBRCloudUser());
44  }
46 
47 int CBRCloudUser::command(int argc, const char*const* argv){
48 
49  if(argc==3){
50  if (strcmp(argv[1], "join-datacenter") == 0) {
51  DataCenter *dc = dynamic_cast<DataCenter*> (TclObject::lookup(argv[2]));
52  if(dc){
53  dc_ = dc;
54  return (TCL_OK);
55  }
56  return (TCL_ERROR);
57  }
58  }
59  return Application::command(argc,argv);
60 }
61 
63 {
64  bind_time("random_tskmips_",random_tskmips_.avgp());
65  bind_bw("rate_", &rate_);
66  bind("random_", &random_);
67  bind("packetSize_", &size_);
68  bind("maxpkts_", &maxpkts_);
69 
70  // Bind CloudUser variables
71  bind("id_", &id_);
72  bind("tskmips_", &tskmips_);
73  bind("tsksize_", &tsksize_);
74  bind("tskmaxduration_", &tskmaxduration_);
75  bind("mean_response_time_", &mean_response_time_);
76  bind("sd_response_time_", &sd_response_time_);
77  bind("unfinished_tasks_", &unfinished_tasks_);
78 }
79 
81 {
82  // compute inter-packet interval
83  interval_ = (double)(size_ << 3)/(double)rate_;
84  if (agent_)
85  if (agent_->get_pkttype() != PT_TCP &&
86  agent_->get_pkttype() != PT_TFRC)
87  agent_->set_pkttype(PT_CBR);
88 }
89 
91 {
92  init();
93  running_ = 1;
94  timeout();
95 }
96 
97 double CBRCloudUser::next_interval(int& size)
98 {
99  // Recompute interval in case rate_ or size_ has changes
100  interval_ = (double)(size_ << 3)/(double)rate_;
101  double t = interval_;
102  if (random_)
103  t += interval_ * Random::uniform(-0.5, 0.5);
104  size = size_;
105  if (++seqno_ < maxpkts_)
106  return(t);
107  else
108  return(-1);
109 }
110 
112 {
113  if (! running_)
114  return;
115 
116  /* send a packet */
117  dc_->receivedTsk(size_, createTask());
118  /* figure out when to send the next one */
119  nextPkttime_ = next_interval(size_);
120  /* schedule it */
121  if (nextPkttime_ > 0)
122  timer_.resched(nextPkttime_);
123  else
124  running_ = 0;
125 }
double interval()
Definition: cbrclouduser.cc:23
CloudTask * createTask()
Definition: clouduser.cc:19
ExponentialRandomVariable random_tskmips_
Definition: clouduser.h:47
int command(int argc, const char *const *argv)
Definition: cbrclouduser.cc:47
double sd_response_time_
Definition: clouduser.h:41
int id_
Definition: clouduser.h:26
double mean_response_time_
Definition: clouduser.h:40
double interval_
Definition: cbrclouduser.cc:32
CBRCloudUserClass class_cbr_clouduser
virtual void start()
Definition: cbrclouduser.cc:90
double tskmips_
Definition: clouduser.h:29
double random_
Definition: cbrclouduser.cc:33
double tskmaxduration_
Definition: clouduser.h:33
TclObject * create(int, const char *const *)
Definition: cbrclouduser.cc:42
virtual void receivedTsk(int tsksize, CloudTask *pTask, const char *flags=0)
Definition: datacenter.cc:161
virtual double next_interval(int &)
Definition: cbrclouduser.cc:97
virtual void timeout()
int unfinished_tasks_
Definition: clouduser.h:42
void addDataCenterPointer(DataCenter *joindc_)
unsigned int tsksize_
Definition: clouduser.h:32
DataCenter * dc_
Definition: clouduser.h:45