source: trunk/eval/download.php @ 1184

Revision 867, 3.6 KB checked in by cdleonard@…, 4 years ago (diff)

Max grader download retries config option

  • Property svn:eol-style set to native
Line 
1<?php
2
3require_once(IA_ROOT_DIR . 'common/common.php');
4require_once(IA_ROOT_DIR . 'common/db/attachment.php');
5
6function copy_grader_file($task, $filename, $target)
7{
8    $attempts = 0;
9    while (true) {
10        $result = copy_attachment_file($task['page_name'], "grader_".$filename, $target);
11        if ($result) {
12            return true;
13        }
14        if ($result == false && $attempts < IA_JUDGE_MAX_GRADER_DOWNLOAD_RETRIES) {
15            ++$attempts;
16            log_print("Failed downloading grader file... sleep and retry");
17            milisleep(1000);
18            continue;
19        }
20        return false;
21    }
22}
23
24// Copy a grader file over to some other location.
25// This will download the file from the server and cache it.
26//
27// Return success value.
28function copy_attachment_file($pagename, $filename, $target)
29{
30    $pagename = normalize_page_name($pagename);
31    log_assert(is_page_name($pagename), "Invalid page name '$pagename'");
32    log_assert(is_attachment_name($filename), "Invalid attachment name '$filename'");
33
34    // Get attachment from database.
35    $att = attachment_get($filename, $pagename);
36    if (!$att) {
37        log_warn("Attachment $pagename/$filename not found.");
38        return false;
39    }
40
41    // Make grader dir, in case it doesn't exit.
42    @mkdir(IA_ROOT_DIR.'eval/grader_cache/'.$pagename.'/', 0700, true);
43
44    // My cached version timestamp
45    $cachefname = IA_ROOT_DIR.'eval/grader_cache/'.$pagename.'/'.$filename;
46
47    clearstatcache();
48    // Check modification time and file size.
49    $cachemtime = @filemtime($cachefname);
50    $servermtime = db_date_parse($att['timestamp']);
51    $cachefsize = @filesize($cachefname);
52    $serverfsize = $att['size'];
53
54    log_print("Server file mtime $servermtime size $serverfsize");
55    log_print("Cache file mtime $cachemtime size $cachefsize");
56    if ($cachemtime === false || $cachemtime < $servermtime ||
57        $cachefsize === false || $cachefsize != $att['size']) {
58        $curl = curl_init();
59        // Can't use url_attachment here because it's in www.
60        curl_setopt($curl, CURLOPT_URL, IA_URL . "$pagename?action=download&file=$filename");
61        curl_setopt($curl, CURLOPT_USERPWD, IA_JUDGE_USERNAME . ":" . IA_JUDGE_PASSWORD);
62
63        $cachefd = fopen($cachefname, "wb");
64        if (!$cachefd) {
65            log_warn("Failed to open $pagename/$filename for writing.");
66            return false;
67        }
68
69        curl_setopt($curl, CURLOPT_FILE, $cachefd);
70        curl_setopt($curl, CURLOPT_FAILONERROR, true);
71        //curl_setopt($curl, CURLOPT_VERBOSE, true);
72
73        log_print("Downloading new version of $pagename/$filename...");
74        if (!curl_exec($curl)) {
75            log_warn("Failed curl download for $pagename/$filename.");
76            log_warn("Curl says: ".curl_error($curl));
77            return false;
78        }
79        curl_close($curl);
80        if (!fclose($cachefd)) {
81            log_warn("Failed closing $pagename/$filename.");
82            return false;
83        }
84
85        clearstatcache();
86        $newcachemtime = @filemtime($cachefname);
87        $newcachefsize = @filesize($cachefname);
88        log_print("Downloaded new file $pagename/$filename, mtime $newcachemtime size $newcachefsize");
89        if ($newcachefsize != $serverfsize) {
90            log_warn("Downloaded file has different size: $newcachefsize != $serverfsize");
91            return false;
92        }
93    } else {
94        log_print("Using cached $pagename/$filename");
95    }
96    if (!copy($cachefname, $target)) {
97        log_warn("Failed copying grader file $pagename/$filename");
98        return false;
99    }
100    return true;
101}
102
103?>
Note: See TracBrowser for help on using the repository browser.