[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[ns] bug in webtraf.cc
Hi,
I found a bug in webtraf.cc. The code in the current snapshot only uses one
object per page. The problem is that WebPage instances do not reschedule more
object requests after the first one is completed. It looks like something got
broken by the last patch.
I have fixed it by modifying WebPage::start() and WebPage::handle() in the
following way:
inline void start() {
expire();
sched(sess_->interObj()->value()); // <---- NEW
curObj_++; // <---- NEW
}
virtual void handle(Event *e) {
// XXX Note when curObj_ == nObj_, we still schedule the timer
// once, but we do not actually send out requests. This extra
// schedule is only meant to be a hint to wait for the last
// request to finish, then we will ask our parent to delete
// this page.
if (curObj_ < nObj_)
TimerHandler::handle(e);
// If this is not the last object, schedule the next one.
// Otherwise stop and tell session to delete me.
if (curObj_ >= nObj_) { // <---- MODIFIED
sess_->donePage((void*)this);
} else {
curObj_++;
sched(sess_->interObj()->value());
}
}
I also modified donePage() and expire() in WebTrafSession, adding an extra
schedule to get rid of deletion problems:
void WebTrafSession::donePage(void* ClntData)
{
delete (WebPage*)ClntData;
// If all pages are done, tell my parent to delete myself
// extra schedule
if (++donePage_ > nPage_) // <--- MODIFIED
mgr_->doneSession(id_);
}
// Launch the current page
void WebTrafSession::expire(Event *)
{
if (donePage_ < nPage_) { // <---- NEW
// Pick destination for this page
Node* dst = mgr_->pickdst();
// Make sure page size is not 0!
WebPage* pg = new WebPage(LASTPAGE_++, this,
(int)ceil(rvPageSize_->value()), dst);
#if 0
printf("Session %d starting page %d, curpage %d \n",
id_, LASTPAGE_-1, curPage_);
#endif
pg->start();
} else { // <---- NEW
donePage((void*)this); // <---- NEW
} // <---- NEW
}
The generated traffic looks correct.
-- Felix Hernandez