I am having a hard time with a logic problem related to scheduling an event
based on data stored in a MySQL table. Below is a sample data set.
The basic concept is a monitoring program that checks a website to see if
its up or down based on info stored in a table.
The way I am doing it requires me to know the last time the site was checked
and how often the site should be checked. I threw in the nc_epoch (next
check epoch seconds) while trying to work through this. That field can be
ignored, unless you see a solution using it.

mc_id = customer id related to another table
url_id = url_id related to another table
chk_freq = how often in seconds the site should be checked
url_timeout = how long to wait for website before considering it down
lc_epoch = last time the site was checked - converted to UNIX epoch in DBI
query
active = is the site supposed to be checked
nc_epoch = next time the site should be checked - converted to UNIX epoch in
DBI query

mc_id  url_id  chk_freq  url_timeout  lc_epoch                 lc_status
active  nc_epoch
1         1         60           5                 20020409144829  150
1        20020409145310
1         51       5             5                 20020409144829  0
1        20020409144210
32       49       5             0                 20020409144829  0
1        20020407101341
32       50       3600      15                20020409144829  0
1        20020407221241

select * from table where lc_epoch + chk_freq = now
This will not work because this perl script will run from cron every 60
seconds and it's highly unlikely it will run at the exact second that the
lc_epoch + chk_freq will ever equal $now.

select * from table where nc_epoch = now
This will not work because of the same reason as above

select * from table where lc_epoch + chk_freq >= now
This will not work because if lc_epoch + chk_freq will almost always be
greater than $now

Is there any work or past research in scheduling based on values in a
column?

I have tried numerous select logic and non will work 100% of the time.

Here's my latest failure:

my $select_query = "SELECT url_id, chk_freq, url_timeout,
UNIX_TIMESTAMP(nc_epoch), UNIX_TIMESTAMP(lc
_epoch)
                      FROM monitor_check
                      WHERE active = 1
#                     AND ((UNIX_TIMESTAMP(nc_epoch) + chk_freq) >= ?)";
                      AND ((UNIX_TIMESTAMP(lc_epoch) + chk_freq) >= ?)";

  my $url_list = $dbh->selectall_arrayref($select_query, undef,
\$current_time)
        or die "Can't execute statement: $DBI::errstr";

The ideal query in my eyes would be:
Select * from table where lc_epoch + chk_freq is greater than $now but not
greater than $now minus chk_freq.

Does this make any sense?

Thanks
zack

Reply via email to