Current File : //proc/thread-self/root/kunden/usr/share/gems/doc/memcache-client-1.8.5/rdoc/MemCache/Server.html |
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>class MemCache::Server - memcache-client-1.8.5 Documentation</title>
<script type="text/javascript">
var rdoc_rel_prefix = "../";
var index_rel_prefix = "../";
</script>
<script src="../js/navigation.js" defer></script>
<script src="../js/search.js" defer></script>
<script src="../js/search_index.js" defer></script>
<script src="../js/searcher.js" defer></script>
<script src="../js/darkfish.js" defer></script>
<link href="../css/fonts.css" rel="stylesheet">
<link href="../css/rdoc.css" rel="stylesheet">
<body id="top" role="document" class="class">
<nav role="navigation">
<div id="project-navigation">
<div id="home-section" role="region" title="Quick navigation" class="nav-section">
<h2>
<a href="../index.html" rel="home">Home</a>
</h2>
<div id="table-of-contents-navigation">
<a href="../table_of_contents.html#pages">Pages</a>
<a href="../table_of_contents.html#classes">Classes</a>
<a href="../table_of_contents.html#methods">Methods</a>
</div>
</div>
<div id="search-section" role="search" class="project-section initially-hidden">
<form action="#" method="get" accept-charset="utf-8">
<div id="search-field-wrapper">
<input id="search-field" role="combobox" aria-label="Search"
aria-autocomplete="list" aria-controls="search-results"
type="text" name="search" placeholder="Search" spellcheck="false"
title="Type to search, Up and Down to navigate, Enter to load">
</div>
<ul id="search-results" aria-label="Search Results"
aria-busy="false" aria-expanded="false"
aria-atomic="false" class="initially-hidden"></ul>
</form>
</div>
</div>
<div id="class-metadata">
<div id="parent-class-section" class="nav-section">
<h3>Parent</h3>
<p class="link"><a href="../Object.html">Object</a>
</div>
<!-- Method Quickref -->
<div id="method-list-section" class="nav-section">
<h3>Methods</h3>
<ul class="link-list" role="directory">
<li ><a href="#method-c-new">::new</a>
<li ><a href="#method-i-alive-3F">#alive?</a>
<li ><a href="#method-i-close">#close</a>
<li ><a href="#method-i-connect_to">#connect_to</a>
<li ><a href="#method-i-inspect">#inspect</a>
<li ><a href="#method-i-mark_dead">#mark_dead</a>
<li ><a href="#method-i-socket">#socket</a>
</ul>
</div>
</div>
</nav>
<main role="main" aria-labelledby="class-MemCache::Server">
<h1 id="class-MemCache::Server" class="class">
class MemCache::Server
</h1>
<section class="description">
<p>This class represents a memcached server instance.</p>
</section>
<section id="5Buntitled-5D" class="documentation-section">
<section class="constants-list">
<header>
<h3>Constants</h3>
</header>
<dl>
<dt id="RETRY_DELAY">RETRY_DELAY
<dd><p>The amount of time to wait before attempting to re-establish a connection with a server that is marked dead.</p>
</dl>
</section>
<section class="attribute-method-details" class="method-section">
<header>
<h3>Attributes</h3>
</header>
<div id="attribute-i-host" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">host</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
<p>The host the memcached server is running on.</p>
</div>
</div>
<div id="attribute-i-logger" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">logger</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
</div>
</div>
<div id="attribute-i-port" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">port</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
<p>The port the memcached server is listening on.</p>
</div>
</div>
<div id="attribute-i-retry" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">retry</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
<p>The time of next retry if the connection is dead.</p>
</div>
</div>
<div id="attribute-i-status" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">status</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
<p>A text status string describing the state of the server.</p>
</div>
</div>
<div id="attribute-i-weight" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">weight</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
<p>The weight given to the server.</p>
</div>
</div>
</section>
<section id="public-class-5Buntitled-5D-method-details" class="method-section">
<header>
<h3>Public Class Methods</h3>
</header>
<div id="method-c-new" class="method-detail ">
<div class="method-heading">
<span class="method-name">new</span><span
class="method-args">(memcache, host, port = DEFAULT_PORT, weight = DEFAULT_WEIGHT)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Create a new <a href="Server.html"><code>MemCache::Server</code></a> object for the memcached instance listening on the given host and port, weighted by the given weight.</p>
<div class="method-source-code" id="new-source">
<pre><span class="ruby-comment"># File lib/memcache.rb, line 1004</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(<span class="ruby-identifier">memcache</span>, <span class="ruby-identifier">host</span>, <span class="ruby-identifier">port</span> = <span class="ruby-constant">DEFAULT_PORT</span>, <span class="ruby-identifier">weight</span> = <span class="ruby-constant">DEFAULT_WEIGHT</span>)
<span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-string">"No host specified"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">host</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">host</span>.<span class="ruby-identifier">empty?</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-string">"No port specified"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">port</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">port</span>.<span class="ruby-identifier">to_i</span>.<span class="ruby-identifier">zero?</span>
<span class="ruby-ivar">@host</span> = <span class="ruby-identifier">host</span>
<span class="ruby-ivar">@port</span> = <span class="ruby-identifier">port</span>.<span class="ruby-identifier">to_i</span>
<span class="ruby-ivar">@weight</span> = <span class="ruby-identifier">weight</span>.<span class="ruby-identifier">to_i</span>
<span class="ruby-ivar">@sock</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-ivar">@retry</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-ivar">@status</span> = <span class="ruby-string">'NOT CONNECTED'</span>
<span class="ruby-ivar">@timeout</span> = <span class="ruby-identifier">memcache</span>.<span class="ruby-identifier">timeout</span>
<span class="ruby-ivar">@logger</span> = <span class="ruby-identifier">memcache</span>.<span class="ruby-identifier">logger</span>
<span class="ruby-keyword">if</span> <span class="ruby-keyword">defined?</span>(<span class="ruby-constant">EM</span>) <span class="ruby-keyword">and</span> <span class="ruby-constant">EM</span>.<span class="ruby-identifier">reactor_running?</span> <span class="ruby-keyword">and</span> <span class="ruby-keyword">defined?</span>(<span class="ruby-constant">MemCache</span><span class="ruby-operator">::</span><span class="ruby-constant">EventedServer</span>)
<span class="ruby-keyword">self</span>.<span class="ruby-identifier">extend</span>(<span class="ruby-constant">MemCache</span><span class="ruby-operator">::</span><span class="ruby-constant">EventedServer</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
</section>
<section id="public-instance-5Buntitled-5D-method-details" class="method-section">
<header>
<h3>Public Instance Methods</h3>
</header>
<div id="method-i-alive-3F" class="method-detail ">
<div class="method-heading">
<span class="method-name">alive?</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Check whether the server connection is alive. This will cause the socket to attempt to connect if it isn't already connected and or if the server was previously marked as down and the retry time has been exceeded.</p>
<div class="method-source-code" id="alive-3F-source">
<pre><span class="ruby-comment"># File lib/memcache.rb, line 1036</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">alive?</span>
<span class="ruby-operator">!</span><span class="ruby-operator">!</span><span class="ruby-identifier">socket</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-close" class="method-detail ">
<div class="method-heading">
<span class="method-name">close</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Close the connection to the memcached server targeted by this object. The server is not considered dead.</p>
<div class="method-source-code" id="close-source">
<pre><span class="ruby-comment"># File lib/memcache.rb, line 1100</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">close</span>
<span class="ruby-ivar">@sock</span>.<span class="ruby-identifier">close</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@sock</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@sock</span>.<span class="ruby-identifier">closed?</span>
<span class="ruby-ivar">@sock</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-ivar">@retry</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-ivar">@status</span> = <span class="ruby-string">"NOT CONNECTED"</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-connect_to" class="method-detail ">
<div class="method-heading">
<span class="method-name">connect_to</span><span
class="method-args">(host, port, timeout=nil)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="connect_to-source">
<pre><span class="ruby-comment"># File lib/memcache.rb, line 1066</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">connect_to</span>(<span class="ruby-identifier">host</span>, <span class="ruby-identifier">port</span>, <span class="ruby-identifier">timeout</span>=<span class="ruby-keyword">nil</span>)
<span class="ruby-identifier">sock</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">timeout</span>
<span class="ruby-constant">MemCacheTimer</span>.<span class="ruby-identifier">timeout</span>(<span class="ruby-identifier">timeout</span>) <span class="ruby-keyword">do</span>
<span class="ruby-identifier">sock</span> = <span class="ruby-constant">TCPSocket</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">host</span>, <span class="ruby-identifier">port</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">sock</span> = <span class="ruby-constant">TCPSocket</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">host</span>, <span class="ruby-identifier">port</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">io</span> = <span class="ruby-constant">MemCache</span><span class="ruby-operator">::</span><span class="ruby-constant">BufferedIO</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">sock</span>)
<span class="ruby-identifier">io</span>.<span class="ruby-identifier">read_timeout</span> = <span class="ruby-identifier">timeout</span>
<span class="ruby-comment"># Getting reports from several customers, including 37signals,</span>
<span class="ruby-comment"># that the non-blocking timeouts in 1.7.5 don't seem to be reliable.</span>
<span class="ruby-comment"># It can't hurt to set the underlying socket timeout also, if possible.</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">timeout</span>
<span class="ruby-identifier">secs</span> = <span class="ruby-constant">Integer</span>(<span class="ruby-identifier">timeout</span>)
<span class="ruby-identifier">usecs</span> = <span class="ruby-constant">Integer</span>((<span class="ruby-identifier">timeout</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">secs</span>) <span class="ruby-operator">*</span> <span class="ruby-value">1_000_000</span>)
<span class="ruby-identifier">optval</span> = [<span class="ruby-identifier">secs</span>, <span class="ruby-identifier">usecs</span>].<span class="ruby-identifier">pack</span>(<span class="ruby-string">"l_2"</span>)
<span class="ruby-keyword">begin</span>
<span class="ruby-identifier">io</span>.<span class="ruby-identifier">setsockopt</span> <span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">SOL_SOCKET</span>, <span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">SO_RCVTIMEO</span>, <span class="ruby-identifier">optval</span>
<span class="ruby-identifier">io</span>.<span class="ruby-identifier">setsockopt</span> <span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">SOL_SOCKET</span>, <span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">SO_SNDTIMEO</span>, <span class="ruby-identifier">optval</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">Exception</span> <span class="ruby-operator">=></span> <span class="ruby-identifier">ex</span>
<span class="ruby-comment"># Solaris, for one, does not like/support socket timeouts.</span>
<span class="ruby-ivar">@logger</span>.<span class="ruby-identifier">info</span> <span class="ruby-node">"[memcache-client] Unable to use raw socket timeouts: #{ex.class.name}: #{ex.message}"</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@logger</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">io</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-inspect" class="method-detail ">
<div class="method-heading">
<span class="method-name">inspect</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Return a string representation of the server object.</p>
<div class="method-source-code" id="inspect-source">
<pre><span class="ruby-comment"># File lib/memcache.rb, line 1026</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">inspect</span>
<span class="ruby-string">"<MemCache::Server: %s:%d [%d] (%s)>"</span> <span class="ruby-operator">%</span> [<span class="ruby-ivar">@host</span>, <span class="ruby-ivar">@port</span>, <span class="ruby-ivar">@weight</span>, <span class="ruby-ivar">@status</span>]
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-mark_dead" class="method-detail ">
<div class="method-heading">
<span class="method-name">mark_dead</span><span
class="method-args">(error)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Mark the server as dead and close its socket.</p>
<div class="method-source-code" id="mark_dead-source">
<pre><span class="ruby-comment"># File lib/memcache.rb, line 1110</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">mark_dead</span>(<span class="ruby-identifier">error</span>)
<span class="ruby-identifier">close</span>
<span class="ruby-ivar">@retry</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">+</span> <span class="ruby-constant">RETRY_DELAY</span>
<span class="ruby-identifier">reason</span> = <span class="ruby-node">"#{error.class.name}: #{error.message}"</span>
<span class="ruby-ivar">@status</span> = <span class="ruby-identifier">sprintf</span> <span class="ruby-string">"%s:%s DEAD (%s), will retry at %s"</span>, <span class="ruby-ivar">@host</span>, <span class="ruby-ivar">@port</span>, <span class="ruby-identifier">reason</span>, <span class="ruby-ivar">@retry</span>
<span class="ruby-ivar">@logger</span>.<span class="ruby-identifier">info</span> { <span class="ruby-ivar">@status</span> } <span class="ruby-keyword">if</span> <span class="ruby-ivar">@logger</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-socket" class="method-detail ">
<div class="method-heading">
<span class="method-name">socket</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Try to connect to the memcached server targeted by this object. Returns the connected socket object on success or nil on failure.</p>
<div class="method-source-code" id="socket-source">
<pre><span class="ruby-comment"># File lib/memcache.rb, line 1044</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">socket</span>
<span class="ruby-keyword">return</span> <span class="ruby-ivar">@sock</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@sock</span> <span class="ruby-keyword">and</span> <span class="ruby-keyword">not</span> <span class="ruby-ivar">@sock</span>.<span class="ruby-identifier">closed?</span>
<span class="ruby-ivar">@sock</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-comment"># If the host was dead, don't retry for a while.</span>
<span class="ruby-keyword">return</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@retry</span> <span class="ruby-keyword">and</span> <span class="ruby-ivar">@retry</span> <span class="ruby-operator">></span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
<span class="ruby-comment"># Attempt to connect if not already connected.</span>
<span class="ruby-keyword">begin</span>
<span class="ruby-ivar">@sock</span> = <span class="ruby-identifier">connect_to</span>(<span class="ruby-ivar">@host</span>, <span class="ruby-ivar">@port</span>, <span class="ruby-ivar">@timeout</span>)
<span class="ruby-ivar">@sock</span>.<span class="ruby-identifier">setsockopt</span> <span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">IPPROTO_TCP</span>, <span class="ruby-constant">Socket</span><span class="ruby-operator">::</span><span class="ruby-constant">TCP_NODELAY</span>, <span class="ruby-value">1</span>
<span class="ruby-ivar">@retry</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-ivar">@status</span> = <span class="ruby-string">'CONNECTED'</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">SocketError</span>, <span class="ruby-constant">SystemCallError</span>, <span class="ruby-constant">IOError</span>, <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span> <span class="ruby-operator">=></span> <span class="ruby-identifier">err</span>
<span class="ruby-identifier">logger</span>.<span class="ruby-identifier">warn</span> { <span class="ruby-node">"Unable to open socket: #{err.class.name}, #{err.message}"</span> } <span class="ruby-keyword">if</span> <span class="ruby-identifier">logger</span>
<span class="ruby-identifier">mark_dead</span> <span class="ruby-identifier">err</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> <span class="ruby-ivar">@sock</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
</section>
</section>
</main>
<footer id="validator-badges" role="contentinfo">
<p><a href="https://validator.w3.org/check/referer">Validate</a>
<p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.3.3.
<p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
</footer>