This file is indexed.

/usr/share/doc/ganeti/html/locking.html is in ganeti-doc 2.16.0~rc2-1build1.

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
<!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" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Ganeti locking &#8212; Ganeti 2.16.0~rc2 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.16.0~rc2',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true,
        SOURCELINK_SUFFIX: '.txt'
      };
    </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="search" title="Search" href="search.html" />
    <link rel="next" title="Man pages" href="manpages.html" />
    <link rel="prev" title="Ganeti quick installation guide" href="install-quick.html" /> 
  </head>
  <body>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="manpages.html" title="Man pages"
             accesskey="N">next</a></li>
        <li class="right" >
          <a href="install-quick.html" title="Ganeti quick installation guide"
             accesskey="P">previous</a> |</li>
        <li class="nav-item nav-item-0"><a href="index.html">Ganeti 2.16.0~rc2 documentation</a> &#187;</li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <div class="section" id="ganeti-locking">
<h1>Ganeti locking<a class="headerlink" href="#ganeti-locking" title="Permalink to this headline"></a></h1>
<div class="section" id="introduction">
<h2>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h2>
<p>This document describes lock order dependencies in Ganeti.
It is divided by functional sections</p>
</div>
<div class="section" id="opcode-execution-locking">
<h2>Opcode Execution Locking<a class="headerlink" href="#opcode-execution-locking" title="Permalink to this headline"></a></h2>
<p>These locks are declared by Logical Units (LUs) (in cmdlib.py) and
acquired by the Processor (in mcpu.py) with the aid of the Ganeti
Locking Library (locking.py). They are acquired in the following order:</p>
<blockquote>
<div><ul class="simple">
<li>BGL: this is the Big Ganeti Lock, it exists for retrocompatibility.
New LUs acquire it in a shared fashion, and are able to execute all
toghether (baring other lock waits) while old LUs acquire it
exclusively and can only execute one at a time, and not at the same
time with new LUs.</li>
<li>Instance locks: can be declared in ExpandNames() or DeclareLocks()
by an LU, and have the same name as the instance itself. They are
acquired as a set.  Internally the locking library acquired them in
alphabetical order.</li>
<li>Node locks: can be declared in ExpandNames() or DeclareLocks() by an
LU, and have the same name as the node itself. They are acquired as
a set.  Internally the locking library acquired them in alphabetical
order. Given this order it’s possible to safely acquire a set of
instances, and then the nodes they reside on.</li>
</ul>
</div></blockquote>
<p>The ConfigWriter (in config.py) is also protected by a SharedLock, which
is shared by functions that read the config and acquired exclusively by
functions that modify it. Since the ConfigWriter calls
rpc.call_upload_file to all nodes to distribute the config without
holding the node locks, this call must be able to execute on the nodes
in parallel with other operations (but not necessarily concurrently with
itself on the same file, as inside the ConfigWriter this is called with
the internal config lock held.</p>
</div>
<div class="section" id="job-queue-locking">
<h2>Job Queue Locking<a class="headerlink" href="#job-queue-locking" title="Permalink to this headline"></a></h2>
<p>The job queue is designed to be thread-safe. This means that its public
functions can be called from any thread. The job queue can be called
from functions called by the queue itself (e.g. logical units), but
special attention must be paid not to create deadlocks or an invalid
state.</p>
<p>The single queue lock is used from all classes involved in the queue
handling.  During development we tried to split locks, but deemed it to
be too dangerous and difficult at the time. Job queue functions
acquiring the lock can be safely called from all the rest of the code,
as the lock is released before leaving the job queue again. Unlocked
functions should only be called from job queue related classes (e.g. in
jqueue.py) and the lock must be acquired beforehand.</p>
<p>In the job queue worker (<code class="docutils literal"><span class="pre">_JobQueueWorker</span></code>), the lock must be released
before calling the LU processor. Otherwise a deadlock can occur when log
messages are added to opcode results.</p>
</div>
<div class="section" id="node-daemon-locking">
<h2>Node Daemon Locking<a class="headerlink" href="#node-daemon-locking" title="Permalink to this headline"></a></h2>
<p>The node daemon contains a lock for the job queue. In order to avoid
conflicts and/or corruption when an eventual master daemon or another
node daemon is running, it must be held for all job queue operations</p>
<p>There’s one special case for the node daemon running on the master node.
If grabbing the lock in exclusive fails on startup, the code assumes all
checks have been done by the process keeping the lock.</p>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">
  <h3><a href="index.html">Table Of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">Ganeti locking</a><ul>
<li><a class="reference internal" href="#introduction">Introduction</a></li>
<li><a class="reference internal" href="#opcode-execution-locking">Opcode Execution Locking</a></li>
<li><a class="reference internal" href="#job-queue-locking">Job Queue Locking</a></li>
<li><a class="reference internal" href="#node-daemon-locking">Node Daemon Locking</a></li>
</ul>
</li>
</ul>

  <h4>Previous topic</h4>
  <p class="topless"><a href="install-quick.html"
                        title="previous chapter">Ganeti quick installation guide</a></p>
  <h4>Next topic</h4>
  <p class="topless"><a href="manpages.html"
                        title="next chapter">Man pages</a></p>
  <div role="note" aria-label="source link">
    <h3>This Page</h3>
    <ul class="this-page-menu">
      <li><a href="_sources/locking.rst.txt"
            rel="nofollow">Show Source</a></li>
    </ul>
   </div>
<div id="searchbox" style="display: none" role="search">
  <h3>Quick search</h3>
    <form class="search" action="search.html" method="get">
      <div><input type="text" name="q" /></div>
      <div><input type="submit" value="Go" /></div>
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="manpages.html" title="Man pages"
             >next</a></li>
        <li class="right" >
          <a href="install-quick.html" title="Ganeti quick installation guide"
             >previous</a> |</li>
        <li class="nav-item nav-item-0"><a href="index.html">Ganeti 2.16.0~rc2 documentation</a> &#187;</li> 
      </ul>
    </div>
    <div class="footer" role="contentinfo">
        &#169; Copyright 2018, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Google Inc..
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.7.
    </div>
  </body>
</html>