diff options
Diffstat (limited to 'memcache.py')
-rw-r--r-- | memcache.py | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/memcache.py b/memcache.py index e3ce42a..1eefcf7 100644 --- a/memcache.py +++ b/memcache.py @@ -364,6 +364,11 @@ class Client(threading.local): serverData[slab[0]][slab[1]] = item[2] return data + def quit_all(self): + '''Send a "quit" command to all servers and wait for the connection to close.''' + for s in self.servers: + s.quit() + def get_slabs(self): data = [] for s in self.servers: @@ -1475,6 +1480,23 @@ class _Host(object): self.buffer = buf[rlen:] return buf[:rlen] + def quit(self): + '''Send a "quit" command to remote server and wait for connection to close.''' + if self.socket: + # Using self.send_cmd, so no need for '\r\n'. + self.send_cmd('quit') + + # We can't close the local socket until the remote end processes the quit + # command and sends us a FIN packet. When that happens, socket.recv() + # will stop blocking and return an empty string. If we try to close the + # socket before then, the OS will think we're initiating the connection + # close and will put the socket into TIME_WAIT. + self.socket.recv(1) + + # At this point, socket should be in CLOSE_WAIT. Closing the socket should + # release the port back to the OS. + self.close_socket() + def flush(self): self.send_cmd('flush_all') self.expect(b'OK') |