|
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