180 else: |
180 else: |
181 return super(Connection, self).cursor(name, cursor_factory=Cursor) |
181 return super(Connection, self).cursor(name, cursor_factory=Cursor) |
182 |
182 |
183 def keep_alive(self): |
183 def keep_alive(self): |
184 '''Set socket to keepalive mode. Must be called before any query.''' |
184 '''Set socket to keepalive mode. Must be called before any query.''' |
185 sock = socket.fromfd(self.fileno(), socket.AF_INET, socket.SOCK_STREAM) |
185 sock = socket.fromfd(self.fileno(), socket.AF_INET, socket.SOCK_STREAM) |
186 sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) |
186 sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) |
187 try: |
187 try: |
188 # Maximum keep-alive probes before asuming the connection is lost |
188 # Maximum keep-alive probes before asuming the connection is lost |
189 sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5) |
189 sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5) |
190 # Interval (in seconds) between keep-alive probes |
190 # Interval (in seconds) between keep-alive probes |
191 sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 2) |
191 sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 2) |
192 # Maximum idle time (in seconds) before start sending keep-alive probes |
192 # Maximum idle time (in seconds) before start sending keep-alive probes |
193 sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 10) |
193 sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 10) |
194 except socket.error: |
194 except socket.error: |
195 pass |
195 pass |
|
196 # close duplicated fd, options set for socket stays |
|
197 sock.close() |
196 |
198 |
197 |
199 |
198 class PgManager: |
200 class PgManager: |
199 |
201 |
200 def __init__(self): |
202 def __init__(self): |