* Updated hydra_eval_jobs for the new evaluator.

[?]
May 18, 2010, 9:57 AM
AEKIREIHNEHL4CQEHRZJGRWMCV2XO6ICZK2OM342IKAJV6MUMDOAC

Dependencies

  • [2] FMJMW4PU
  • [3] HOVPJBFF * Require every argument to be specified.
  • [4] VTNP5KDO * Don't catch all errors. Some errors mess up the connection with the
  • [5] 4XR2A7QD * Fix building hydra_eval_jobs against the sqlite branch.
  • [6] YGRLM2SK * Export all relevant info about the derivation.
  • [7] HVXL2XUZ
  • [8] 4N5APGRG * Start of a helper tool to evaluate job expressions efficiently.
  • [9] KD5237CU * eval-jobs now efficiently evaluates all Hydra jobs from a
  • [10] IZ2AHLM3 * Export all relevant info about the derivation.
  • [11] A63IHCMX * Register GC roots properly.
  • [12] POPU2ATH * hydra_scheduler: use eval-jobs.
  • [13] 4LWGZL33
  • [14] 7YCFGMZB * Report evaluation errors per job, and don't bail out if a job fails

Change contents

  • edit in src/c/hydra_eval_jobs.cc at line 8
    [6.425][6.0:26]()
    #include "nixexpr-ast.hh"
  • edit in src/c/hydra_eval_jobs.cc at line 11
    [6.23][5.142:162]()
    #include "aterm.hh"
  • replacement in src/c/hydra_eval_jobs.cc at line 24
    [6.28][6.75:159](),[6.75][6.75:159]()
    Expr evalAttr(EvalState & state, Expr e)
    {
    return e ? evalExpr(state, e) : e;
    }
    [6.28]
    [6.159]
    typedef std::map<Symbol, std::pair<unsigned int, Value> > ArgsUsed;
    typedef std::map<Symbol, list<Value> > AutoArgs;
  • replacement in src/c/hydra_eval_jobs.cc at line 29
    [6.218][6.0:96]()
    const ATermMap & argsUsed, const ATermMap & argsLeft,
    Expr e, const string & attrPath);
    [6.218]
    [6.96]
    const ArgsUsed & argsUsed, const AutoArgs & argsLeft,
    Value & v, const string & attrPath);
  • replacement in src/c/hydra_eval_jobs.cc at line 34
    [6.157][6.157:306]()
    const ATermMap & argsUsed, const ATermMap & argsLeft,
    const string & attrPath, Expr fun,
    ATermList formals, const ATermMap & actualArgs)
    [6.157]
    [6.306]
    const ArgsUsed & argsUsed, const AutoArgs & argsLeft,
    const string & attrPath, Value & fun,
    Formals::Formals_::iterator cur,
    Formals::Formals_::iterator last,
    const Bindings & actualArgs)
  • replacement in src/c/hydra_eval_jobs.cc at line 40
    [6.308][6.308:448]()
    if (formals == ATempty) {
    findJobs(state, doc, argsUsed, argsLeft,
    makeCall(fun, makeAttrs(actualArgs)), attrPath);
    [6.308]
    [6.448]
    if (cur == last) {
    Value v, arg;
    state.mkAttrs(arg);
    *arg.attrs = actualArgs;
    mkApp(v, fun, arg);
    findJobs(state, doc, argsUsed, argsLeft, v, attrPath);
  • replacement in src/c/hydra_eval_jobs.cc at line 49
    [6.471][6.165:210](),[6.210][6.521:643](),[6.521][6.521:643](),[6.644][2.0:83](),[2.83][6.703:898](),[6.703][6.703:898](),[6.898][2.84:164](),[2.164][6.935:1087](),[6.935][6.935:1087](),[6.1096][6.1096:1102](),[6.1102][6.0:5](),[6.5][6.1297:1306](),[6.1297][6.1297:1306]()
    Expr name; ATerm def2; ATermList values;
    if (!matchFormal(ATgetFirst(formals), name, def2)) abort();
    if ((values = (ATermList) argsLeft.get(name))) {
    int n = 0;
    for (ATermIterator i(ATreverse(values)); i; ++i, ++n) {
    ATermMap actualArgs2(actualArgs);
    ATermMap argsUsed2(argsUsed);
    ATermMap argsLeft2(argsLeft);
    actualArgs2.set(name, makeAttrRHS(*i, makeNoPos()));
    argsUsed2.set(name, (ATerm) ATmakeList2(*i, (ATerm) ATmakeInt(n)));
    argsLeft2.remove(name);
    tryJobAlts(state, doc, argsUsed2, argsLeft2, attrPath, fun, ATgetNext(formals), actualArgs2);
    }
    }
    else
    [6.471]
    [3.0]
    AutoArgs::const_iterator a = argsLeft.find(cur->name);
    if (a == argsLeft.end())
  • replacement in src/c/hydra_eval_jobs.cc at line 53
    [3.77][3.77:123]()
    % attrPath % aterm2String(name));
    [3.77]
    [6.0]
    % attrPath % cur->name);
    Formals::Formals_::iterator next = cur; ++next;
    int n = 0;
    foreach (list<Value>::const_iterator, i, a->second) {
    Bindings actualArgs2(actualArgs); // !!! inefficient
    ArgsUsed argsUsed2(argsUsed);
    AutoArgs argsLeft2(argsLeft);
    actualArgs2[cur->name].value = *i;
    argsUsed2[cur->name] = std::pair<unsigned int, Value>(n, *i);
    argsLeft2.erase(cur->name);
    tryJobAlts(state, doc, argsUsed2, argsLeft2, attrPath, fun, next, last, actualArgs2);
    ++n;
    }
  • replacement in src/c/hydra_eval_jobs.cc at line 71
    [6.4][6.4:73]()
    static void showArgsUsed(XMLWriter & doc, const ATermMap & argsUsed)
    [6.4]
    [6.73]
    static void showArgsUsed(XMLWriter & doc, const ArgsUsed & argsUsed)
  • replacement in src/c/hydra_eval_jobs.cc at line 73
    [6.75][6.75:129]()
    foreach (ATermMap::const_iterator, i, argsUsed) {
    [6.75]
    [6.129]
    foreach (ArgsUsed::const_iterator, i, argsUsed) {
  • replacement in src/c/hydra_eval_jobs.cc at line 75
    [6.157][6.157:207](),[6.207][2.165:343]()
    xmlAttrs2["name"] = aterm2String(i->key);
    xmlAttrs2["value"] = showValue(ATelementAt((ATermList) i->value, 0));
    xmlAttrs2["altnr"] = int2String(ATgetInt((ATermInt) ATelementAt((ATermList) i->value, 1)));
    [6.157]
    [6.257]
    xmlAttrs2["name"] = i->first;
    xmlAttrs2["value"] = (format("%1%") % i->second.second).str();
    xmlAttrs2["altnr"] = int2String(i->second.first);
  • replacement in src/c/hydra_eval_jobs.cc at line 102
    [6.1408][6.1408:1413]()
    [6.1408]
    [6.313]
  • replacement in src/c/hydra_eval_jobs.cc at line 104
    [6.377][6.1470:1528](),[6.1470][6.1470:1528](),[6.1528][6.218:255](),[6.218][6.218:255]()
    const ATermMap & argsUsed, const ATermMap & argsLeft,
    Expr e, const string & attrPath)
    [6.377]
    [6.255]
    const ArgsUsed & argsUsed, const AutoArgs & argsLeft,
    Value & v, const string & attrPath)
  • replacement in src/c/hydra_eval_jobs.cc at line 109
    [6.308][6.308:336]()
    e = evalExpr(state, e);
    [6.308]
    [6.336]
    state.forceValue(v);
  • replacement in src/c/hydra_eval_jobs.cc at line 111
    [6.337][6.731:758](),[6.758][6.31:55](),[6.31][6.31:55](),[6.55][6.359:511](),[6.359][6.359:511]()
    ATermList as, formals;
    ATermBool ellipsis;
    ATerm pat, body, pos;
    string s;
    PathSet context;
    if (matchAttrs(e, as)) {
    ATermMap attrs;
    queryAllAttrs(e, attrs);
    [6.337]
    [6.511]
    if (v.type == tAttrs) {
  • replacement in src/c/hydra_eval_jobs.cc at line 115
    [6.54][6.54:98]()
    if (getDerivation(state, e, drv)) {
    [6.54]
    [6.681]
    if (getDerivation(state, v, drv)) {
  • replacement in src/c/hydra_eval_jobs.cc at line 155
    [6.1212][6.1212:1269](),[6.1269][6.1864:1931](),[6.1931][6.1316:1402](),[6.1316][6.1316:1402]()
    foreach (ATermMap::const_iterator, i, attrs)
    findJobs(state, doc, argsUsed, argsLeft, i->value,
    (attrPath.empty() ? "" : attrPath + ".") + aterm2String(i->key));
    [6.1174]
    [6.1402]
    foreach (Bindings::iterator, i, *v.attrs)
    findJobs(state, doc, argsUsed, argsLeft, i->second.value,
    (attrPath.empty() ? "" : attrPath + ".") + (string) i->first);
  • replacement in src/c/hydra_eval_jobs.cc at line 161
    [6.1419][6.56:146](),[6.146][6.1932:2018]()
    else if (matchFunction(e, pat, body, pos) && matchAttrsPat(pat, formals, ellipsis)) {
    tryJobAlts(state, doc, argsUsed, argsLeft, attrPath, e, formals, ATermMap());
    [6.1419]
    [6.1503]
    else if (v.type == tLambda && v.lambda.fun->matchAttrs) {
    tryJobAlts(state, doc, argsUsed, argsLeft, attrPath, v,
    v.lambda.fun->formals->formals.begin(),
    v.lambda.fun->formals->formals.end(),
    Bindings());
  • replacement in src/c/hydra_eval_jobs.cc at line 169
    [6.2029][6.420:490]()
    throw TypeError(format("unknown value: %1%") % showValue(e));
    [6.2029]
    [6.490]
    throw TypeError(format("unsupported value: %1%") % v);
  • replacement in src/c/hydra_eval_jobs.cc at line 174
    [6.551][6.551:646]()
    const ATermMap & argsUsed, const ATermMap & argsLeft,
    Expr e, const string & attrPath)
    [6.551]
    [6.646]
    const ArgsUsed & argsUsed, const AutoArgs & argsLeft,
    Value & v, const string & attrPath)
  • replacement in src/c/hydra_eval_jobs.cc at line 178
    [6.658][6.658:728]()
    findJobsWrapped(state, doc, argsUsed, argsLeft, e, attrPath);
    [6.658]
    [4.0]
    findJobsWrapped(state, doc, argsUsed, argsLeft, v, attrPath);
  • replacement in src/c/hydra_eval_jobs.cc at line 193
    [6.613][6.2103:2126]()
    ATermMap autoArgs;
    [6.613]
    [6.613]
    AutoArgs autoArgs;
  • replacement in src/c/hydra_eval_jobs.cc at line 206
    [6.2604][6.1003:1039](),[6.1039][3.124:207](),[3.207][6.1105:1139](),[6.1105][6.1105:1139](),[6.1139][6.2674:2857](),[6.2674][6.2674:2857]()
    Expr e = arg == "--arg"
    ? evalExpr(state, parseExprFromString(state, value, absPath(".")))
    : makeStr(value);
    autoArgs.set(toATerm(name), (ATerm) ATinsert(autoArgs.get(toATerm(name))
    ? (ATermList) autoArgs.get(toATerm(name))
    : ATempty, e));
    [6.2604]
    [6.2857]
    Value v;
    if (arg == "--arg")
    state.eval(parseExprFromString(state, value, absPath(".")), v);
    else
    mkString(v, value);
    autoArgs[state.symbols.create(name)].push_back(v);
  • replacement in src/c/hydra_eval_jobs.cc at line 229
    [6.881][6.1572:1624]()
    Expr e = parseExprFromFile(state, releaseExpr);
    [6.881]
    [6.1624]
    Expr * e = parseExprFromFile(state, releaseExpr);
    Value v;
    state.mkThunk_(v, e);
  • replacement in src/c/hydra_eval_jobs.cc at line 235
    [6.1699][6.2900:2955]()
    findJobs(state, doc, ATermMap(), autoArgs, e, "");
    [6.1699]
    [6.1019]
    findJobs(state, doc, ArgsUsed(), autoArgs, v, "");