/usr/share/doc/ganeti-doc/html/design-bulk-create.html is in ganeti-doc 2.9.3-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ganeti Bulk Create — Ganeti 2.9.3 documentation</title>
<link rel="stylesheet" href="_static/style.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '2.9.3',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="Ganeti 2.9.3 documentation" href="index.html" />
<link rel="next" title="Chained jobs" href="design-chained-jobs.html" />
<link rel="prev" title="Instance auto-repair" href="design-autorepair.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="design-chained-jobs.html" title="Chained jobs"
accesskey="N">next</a></li>
<li class="right" >
<a href="design-autorepair.html" title="Instance auto-repair"
accesskey="P">previous</a> |</li>
<li><a href="index.html">Ganeti 2.9.3 documentation</a> »</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="ganeti-bulk-create">
<h1><a class="toc-backref" href="#id1">Ganeti Bulk Create</a><a class="headerlink" href="#ganeti-bulk-create" title="Permalink to this headline">¶</a></h1>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#ganeti-bulk-create" id="id1">Ganeti Bulk Create</a><ul>
<li><a class="reference internal" href="#current-state-and-shortcomings" id="id2">Current state and shortcomings</a><ul>
<li><a class="reference internal" href="#proposed-changes" id="id3">Proposed changes</a></li>
<li><a class="reference internal" href="#problems" id="id4">Problems</a></li>
</ul>
</li>
<li><a class="reference internal" href="#implementation" id="id5">Implementation</a><ul>
<li><a class="reference internal" href="#iallocator" id="id6">IAllocator</a></li>
<li><a class="reference internal" href="#opinstancebulkadd" id="id7">OpInstanceBulkAdd</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="current-state-and-shortcomings">
<h2><a class="toc-backref" href="#id2">Current state and shortcomings</a><a class="headerlink" href="#current-state-and-shortcomings" title="Permalink to this headline">¶</a></h2>
<p>Creation of instances happens a lot. A fair load is done by just
creating instances and due to bad allocation shifting them around later
again. Additionally, if you turn up a new cluster you already know a
bunch of instances, which need to exists on the cluster. Doing this
one-by-one is not only cumbersome but might also fail, due to lack of
resources or lead to badly balanced clusters.</p>
<p>Since the early Ganeti 2.0 alpha version there is a <tt class="docutils literal"><span class="pre">gnt-instance</span>
<span class="pre">batch-create</span></tt> command to allocate a bunch of instances based on a json
file. This feature, however, doesn’t take any advantages of iallocator
and submits jobs in a serialized manner.</p>
<div class="section" id="proposed-changes">
<h3><a class="toc-backref" href="#id3">Proposed changes</a><a class="headerlink" href="#proposed-changes" title="Permalink to this headline">¶</a></h3>
<p>To overcome this shortcoming we would extend the current iallocator
interface to allow bulk requests. On the Ganeti side, a new opcode is
introduced to handle the bulk creation and returning the resulting
placement from the <a class="reference internal" href="#iallocator">IAllocator</a>.</p>
</div>
<div class="section" id="problems">
<h3><a class="toc-backref" href="#id4">Problems</a><a class="headerlink" href="#problems" title="Permalink to this headline">¶</a></h3>
<p>Due to the design of chained jobs, we can guarantee, that with the state
at which the <tt class="docutils literal"><span class="pre">multi-alloc</span></tt> opcode is run, all of the instances will
fit (or all won’t). But we can’t guarantee that once the instance
creation requests were submit, no other jobs have sneaked in between.
This might still lead to failing jobs because the resources have changed
in the meantime.</p>
</div>
</div>
<div class="section" id="implementation">
<h2><a class="toc-backref" href="#id5">Implementation</a><a class="headerlink" href="#implementation" title="Permalink to this headline">¶</a></h2>
<div class="section" id="iallocator">
<h3><a class="toc-backref" href="#id6">IAllocator</a><a class="headerlink" href="#iallocator" title="Permalink to this headline">¶</a></h3>
<p>A new additional <tt class="docutils literal"><span class="pre">type</span></tt> will be added called <tt class="docutils literal"><span class="pre">multi-allocate</span></tt> to
distinguish between normal and bulk operation. For the bulk operation
the <tt class="docutils literal"><span class="pre">request</span></tt> will be a finite list of request dicts.</p>
<p>If <tt class="docutils literal"><span class="pre">multi-allocate</span></tt> is declared, <tt class="docutils literal"><span class="pre">request</span></tt> must exist and is a list
of <tt class="docutils literal"><span class="pre">request</span></tt> dicts as described in <a class="reference internal" href="iallocator.html"><em>Operation specific input</em></a>. The <tt class="docutils literal"><span class="pre">result</span></tt> then is a list of instance name and node
placements in the order of the <tt class="docutils literal"><span class="pre">request</span></tt> field.</p>
<p>In addition, the old <tt class="docutils literal"><span class="pre">allocate</span></tt> request type will be deprecated and at
latest in Ganeti 2.8 incooperated into this new request. Current code
will need slight adaption to work with the new request. This needs
careful testing.</p>
</div>
<div class="section" id="opinstancebulkadd">
<h3><a class="toc-backref" href="#id7">OpInstanceBulkAdd</a><a class="headerlink" href="#opinstancebulkadd" title="Permalink to this headline">¶</a></h3>
<p>We add a new opcode <tt class="docutils literal"><span class="pre">OpInstanceBulkAdd</span></tt>. It receives a list of
<tt class="docutils literal"><span class="pre">OpInstanceCreate</span></tt> on the <tt class="docutils literal"><span class="pre">instances</span></tt> field. This is done to make
sure, that these two loosely coupled opcodes do not get out of sync. On
the RAPI side, however, this just is a list of instance create
definitions. And the client is adapted accordingly.</p>
<p>The opcode itself does some sanity checks on the instance creation
opcodes which includes:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">mode</span></tt> is not set</li>
<li><tt class="docutils literal"><span class="pre">pnode</span></tt> and <tt class="docutils literal"><span class="pre">snodes</span></tt> is not set</li>
<li><tt class="docutils literal"><span class="pre">iallocator</span></tt> is not set</li>
</ul>
<p>Any of the above error will be aborted with <tt class="docutils literal"><span class="pre">OpPrereqError</span></tt>. Once the
list has been verified it is handed to the <tt class="docutils literal"><span class="pre">iallocator</span></tt> as described
in <a class="reference internal" href="#iallocator">IAllocator</a>. Upon success we then return the result of the
<a class="reference internal" href="#iallocator">IAllocator</a> call.</p>
<p>At this point the current instance allocation would work with the
resources available on the cluster as perceived upon
<tt class="docutils literal"><span class="pre">OpInstanceBulkAdd</span></tt> invocation. However, there might be corner cases
where this is not true as described in <a class="reference internal" href="#problems">Problems</a>.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Ganeti Bulk Create</a><ul>
<li><a class="reference internal" href="#current-state-and-shortcomings">Current state and shortcomings</a><ul>
<li><a class="reference internal" href="#proposed-changes">Proposed changes</a></li>
<li><a class="reference internal" href="#problems">Problems</a></li>
</ul>
</li>
<li><a class="reference internal" href="#implementation">Implementation</a><ul>
<li><a class="reference internal" href="#iallocator">IAllocator</a></li>
<li><a class="reference internal" href="#opinstancebulkadd">OpInstanceBulkAdd</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="design-autorepair.html"
title="previous chapter">Instance auto-repair</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="design-chained-jobs.html"
title="next chapter">Chained jobs</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/design-bulk-create.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="design-chained-jobs.html" title="Chained jobs"
>next</a></li>
<li class="right" >
<a href="design-autorepair.html" title="Instance auto-repair"
>previous</a> |</li>
<li><a href="index.html">Ganeti 2.9.3 documentation</a> »</li>
</ul>
</div>
<div class="footer">
© Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Google Inc..
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.1.
</div>
</body>
</html>
|