|
30 | 30 | import atexit |
31 | 31 | import logging |
32 | 32 | import os |
33 | | -import pwd |
34 | | -import select |
35 | 33 | import shutil |
36 | 34 | import six |
37 | 35 | import subprocess |
@@ -156,6 +154,7 @@ def run(self): |
156 | 154 | # work until we're asked to stop |
157 | 155 | while not self._stop_event.is_set(): |
158 | 156 | # do we have new lines? |
| 157 | + import select # used only here |
159 | 158 | if fd in select.select([fd], [], [], 0)[0]: |
160 | 159 | for line in fd.readlines(): |
161 | 160 | line = line.strip() |
@@ -307,9 +306,12 @@ def __init__(self, |
307 | 306 | if base_dir and not os.path.exists(base_dir): |
308 | 307 | os.makedirs(base_dir) |
309 | 308 |
|
| 309 | + # public |
310 | 310 | self.original_node = node |
311 | 311 | self.base_dir = base_dir |
312 | | - self.available = True |
| 312 | + |
| 313 | + # private |
| 314 | + self._available = True |
313 | 315 |
|
314 | 316 | data_dir = os.path.join(self.base_dir, DATA_DIR) |
315 | 317 | _params = [ |
@@ -337,30 +339,31 @@ def _prepare_dir(self, destroy): |
337 | 339 | Path to data directory. |
338 | 340 | """ |
339 | 341 |
|
340 | | - if not self.available: |
| 342 | + if not self._available: |
341 | 343 | raise BackupException('Backup is exhausted') |
342 | 344 |
|
343 | 345 | # Do we want to use this backup several times? |
344 | 346 | available = not destroy |
345 | 347 |
|
346 | 348 | if available: |
347 | | - base_dir = tempfile.mkdtemp() |
| 349 | + dest_base_dir = tempfile.mkdtemp() |
348 | 350 |
|
349 | 351 | data1 = os.path.join(self.base_dir, DATA_DIR) |
350 | | - data2 = os.path.join(base_dir, DATA_DIR) |
| 352 | + data2 = os.path.join(dest_base_dir, DATA_DIR) |
351 | 353 |
|
352 | 354 | try: |
353 | 355 | # Copy backup to new data dir |
354 | 356 | shutil.copytree(data1, data2) |
355 | 357 | except Exception as e: |
356 | 358 | raise BackupException(_explain_exception(e)) |
357 | 359 | else: |
358 | | - base_dir = self.base_dir |
| 360 | + dest_base_dir = self.base_dir |
359 | 361 |
|
360 | | - # Update value |
361 | | - self.available = available |
| 362 | + # Is this backup exhausted? |
| 363 | + self._available = available |
362 | 364 |
|
363 | | - return base_dir |
| 365 | + # Return path to new node |
| 366 | + return dest_base_dir |
364 | 367 |
|
365 | 368 | def spawn_primary(self, name, destroy=True, use_logging=False): |
366 | 369 | """ |
@@ -410,9 +413,9 @@ def spawn_replica(self, name, destroy=True, use_logging=False): |
410 | 413 | return node |
411 | 414 |
|
412 | 415 | def cleanup(self): |
413 | | - if self.available: |
| 416 | + if self._available: |
414 | 417 | shutil.rmtree(self.base_dir, ignore_errors=True) |
415 | | - self.available = False |
| 418 | + self._available = False |
416 | 419 |
|
417 | 420 |
|
418 | 421 | class NodeStatus(Enum): |
@@ -504,13 +507,11 @@ def _prepare_dirs(self): |
504 | 507 |
|
505 | 508 | def _maybe_start_logger(self): |
506 | 509 | if self._use_logging: |
507 | | - if not self._logger: |
| 510 | + # spawn new logger if it doesn't exist or stopped |
| 511 | + if not self._logger or not self._logger.is_alive(): |
508 | 512 | self._logger = TestgresLogger(self.name, self.pg_log_name) |
509 | 513 | self._logger.start() |
510 | 514 |
|
511 | | - elif not self._logger.is_alive(): |
512 | | - self._logger.start() |
513 | | - |
514 | 515 | def _maybe_stop_logger(self): |
515 | 516 | if self._logger: |
516 | 517 | self._logger.stop() |
@@ -1290,6 +1291,7 @@ def default_username(): |
1290 | 1291 | Return current user. |
1291 | 1292 | """ |
1292 | 1293 |
|
| 1294 | + import pwd # used only here |
1293 | 1295 | return pwd.getpwuid(os.getuid())[0] |
1294 | 1296 |
|
1295 | 1297 |
|
|
0 commit comments