Skip to content

Commit 6501fb5

Browse files
author
Nick Reich
authored
GEODE-4330: Move logic for handling temporary files during backup (#1323)
1 parent 63a96d9 commit 6501fb5

File tree

3 files changed

+286
-76
lines changed

3 files changed

+286
-76
lines changed

geode-core/src/main/java/org/apache/geode/internal/cache/backup/BackupManager.java

Lines changed: 36 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,14 @@ public class BackupManager {
7373
private final InternalCache cache;
7474
private final CountDownLatch allowDestroys = new CountDownLatch(1);
7575
private final BackupDefinition backupDefinition = new BackupDefinition();
76-
private final String diskStoreDirectoryName;
76+
private final String memberId;
7777
private volatile boolean isCancelled = false;
78-
private Path tempDirectory;
79-
private final Map<DiskStore, Map<DirectoryHolder, Path>> diskStoreDirTempDirsByDiskStore =
80-
new HashMap<>();
78+
private TemporaryBackupFiles temporaryFiles;
8179

8280
public BackupManager(InternalDistributedMember sender, InternalCache gemFireCache) {
8381
this.sender = sender;
8482
this.cache = gemFireCache;
85-
diskStoreDirectoryName = DATA_STORES_TEMPORARY_DIRECTORY + System.currentTimeMillis();
83+
memberId = getCleanedMemberId();
8684
}
8785

8886
public void validateRequestingAdmin() {
@@ -99,6 +97,7 @@ public HashSet<PersistentID> prepareForBackup() {
9997
HashSet<PersistentID> persistentIds = new HashSet<>();
10098
for (DiskStore store : cache.listDiskStoresIncludingRegionOwned()) {
10199
DiskStoreImpl storeImpl = (DiskStoreImpl) store;
100+
102101
storeImpl.lockStoreBeforeBackup();
103102
if (storeImpl.hasPersistedData()) {
104103
persistentIds.add(storeImpl.getPersistentID());
@@ -110,18 +109,20 @@ public HashSet<PersistentID> prepareForBackup() {
110109

111110
public HashSet<PersistentID> doBackup(File targetDir, File baselineDir, boolean abort)
112111
throws IOException {
112+
if (abort) {
113+
cleanup();
114+
return new HashSet<>();
115+
}
116+
113117
try {
114-
if (abort) {
115-
return new HashSet<>();
116-
}
117-
tempDirectory = Files.createTempDirectory("backup_" + System.currentTimeMillis());
118-
File backupDir = getBackupDir(targetDir);
118+
temporaryFiles = TemporaryBackupFiles.create();
119+
File memberBackupDir = new File(targetDir, memberId);
119120

120121
// Make sure our baseline is okay for this member, then create inspector for baseline backup
121122
baselineDir = checkBaseline(baselineDir);
122123
BackupInspector inspector =
123124
(baselineDir == null ? null : BackupInspector.createInspector(baselineDir));
124-
File storesDir = new File(backupDir, DATA_STORES_DIRECTORY);
125+
File storesDir = new File(memberBackupDir, DATA_STORES_DIRECTORY);
125126
Collection<DiskStore> diskStores = cache.listDiskStoresIncludingRegionOwned();
126127

127128
Map<DiskStoreImpl, DiskStoreBackup> backupByDiskStores =
@@ -130,18 +131,18 @@ public HashSet<PersistentID> doBackup(File targetDir, File baselineDir, boolean
130131
HashSet<PersistentID> persistentIds = finishDiskStoreBackups(backupByDiskStores);
131132

132133
if (!backupByDiskStores.isEmpty()) {
133-
backupAdditionalFiles(backupDir);
134+
backupAdditionalFiles(memberBackupDir);
134135
backupDefinition.setRestoreScript(restoreScript);
135136
}
136137

137138
if (!backupByDiskStores.isEmpty()) {
138139
// TODO: allow different stategies...
139-
BackupDestination backupDestination = new FileSystemBackupDestination(backupDir.toPath());
140+
BackupDestination backupDestination =
141+
new FileSystemBackupDestination(memberBackupDir.toPath());
140142
backupDestination.backupFiles(backupDefinition);
141143
}
142144

143145
return persistentIds;
144-
145146
} finally {
146147
cleanup();
147148
}
@@ -198,32 +199,15 @@ private DistributionManager getDistributionManager() {
198199
private void cleanup() {
199200
isCancelled = true;
200201
allowDestroys.countDown();
201-
cleanupTemporaryFiles();
202+
if (temporaryFiles != null) {
203+
temporaryFiles.cleanupFiles();
204+
}
202205
releaseBackupLocks();
203206
getDistributionManager().removeAllMembershipListener(membershipListener);
204207
cache.clearBackupManager();
205208
}
206209

207-
private void cleanupTemporaryFiles() {
208-
if (tempDirectory != null) {
209-
try {
210-
FileUtils.deleteDirectory(tempDirectory.toFile());
211-
} catch (IOException e) {
212-
logger.warn("Unable to delete temporary directory created during backup, " + tempDirectory,
213-
e);
214-
}
215-
}
216-
for (Map<DirectoryHolder, Path> diskStoreDirToTempDirMap : diskStoreDirTempDirsByDiskStore
217-
.values()) {
218-
for (Path tempDir : diskStoreDirToTempDirMap.values()) {
219-
try {
220-
FileUtils.deleteDirectory(tempDir.toFile());
221-
} catch (IOException e) {
222-
logger.warn("Unable to delete temporary directory created during backup, " + tempDir, e);
223-
}
224-
}
225-
}
226-
}
210+
227211

228212
private void releaseBackupLocks() {
229213
for (DiskStore store : cache.listDiskStoresIncludingRegionOwned()) {
@@ -263,12 +247,12 @@ private File findBaselineForThisMember(File baselineParentDir) {
263247
* @return null if the backup is to be a full backup otherwise return the data store directory in
264248
* the previous backup for this member (if incremental).
265249
*/
266-
private File checkBaseline(File baselineParentDir) throws IOException {
250+
private File checkBaseline(File baselineParentDir) {
267251
File baselineDir = null;
268252

269253
if (null != baselineParentDir) {
270254
// Start by looking for this memberId
271-
baselineDir = getBackupDir(baselineParentDir);
255+
baselineDir = new File(baselineParentDir, memberId);
272256

273257
if (!baselineDir.exists()) {
274258
// hmmm, did this member have a restart?
@@ -311,7 +295,7 @@ private void completeBackup(DiskStoreImpl diskStore, DiskStoreBackup backup) thr
311295
if (isCancelled()) {
312296
break;
313297
}
314-
copyOplog(diskStore, tempDirectory.toFile(), oplog);
298+
copyOplog(diskStore, temporaryFiles.getDirectory().toFile(), oplog);
315299

316300
// Allow the oplog to be deleted, and process any pending delete
317301
backup.backupFinished(oplog);
@@ -392,13 +376,7 @@ private DiskStoreBackup startDiskStoreBackup(DiskStoreImpl diskStore, File targe
392376
backup = new DiskStoreBackup(allOplogs, targetDir);
393377
backupByDiskStore.put(diskStore, backup);
394378

395-
396-
// TODO cleanup new location definition code
397-
/*
398-
* Path diskstoreDir = getBackupDir(tempDir.toFile(),
399-
* diskStore.getInforFileDirIndex()).toPath(); Files.createDirectories(diskstoreDir);
400-
*/
401-
backupDiskInitFile(diskStore, tempDirectory);
379+
backupDiskInitFile(diskStore, temporaryFiles.getDirectory());
402380
diskStore.getPersistentOplogSet().forceRoll(null);
403381

404382
if (logger.isDebugEnabled()) {
@@ -430,7 +408,7 @@ private void backupDiskInitFile(DiskStoreImpl diskStore, Path tempDir) throws IO
430408
private void addDiskStoreDirectoriesToRestoreScript(DiskStoreImpl diskStore, File targetDir) {
431409
DirectoryHolder[] directories = diskStore.getDirectoryHolders();
432410
for (int i = 0; i < directories.length; i++) {
433-
File backupDir = getBackupDir(targetDir, i);
411+
File backupDir = getBackupDirForCurrentMember(targetDir, i);
434412
restoreScript.addFile(directories[i].getDir(), backupDir);
435413
}
436414
}
@@ -495,12 +473,12 @@ private Map<File, File> addBaselineOplogToRestoreScript(BackupInspector baseline
495473
return oplogMap;
496474
}
497475

498-
private File getBackupDir(File targetDir, int index) {
476+
private File getBackupDirForCurrentMember(File targetDir, int index) {
499477
return new File(targetDir, BACKUP_DIR_PREFIX + index);
500478
}
501479

502480
private void backupConfigFiles() throws IOException {
503-
Files.createDirectories(tempDirectory.resolve(CONFIG_DIRECTORY));
481+
Files.createDirectories(temporaryFiles.getDirectory().resolve(CONFIG_DIRECTORY));
504482
addConfigFileToBackup(cache.getCacheXmlURL());
505483
addConfigFileToBackup(DistributedSystem.getPropertiesFileURL());
506484
// TODO: should the gfsecurity.properties file be backed up?
@@ -510,7 +488,8 @@ private void addConfigFileToBackup(URL fileUrl) throws IOException {
510488
if (fileUrl != null) {
511489
try {
512490
Path source = Paths.get(fileUrl.toURI());
513-
Path destination = tempDirectory.resolve(CONFIG_DIRECTORY).resolve(source.getFileName());
491+
Path destination =
492+
temporaryFiles.getDirectory().resolve(CONFIG_DIRECTORY).resolve(source.getFileName());
514493
Files.copy(source, destination, StandardCopyOption.COPY_ATTRIBUTES);
515494
backupDefinition.addConfigFileToBackup(destination);
516495
} catch (URISyntaxException e) {
@@ -520,13 +499,14 @@ private void addConfigFileToBackup(URL fileUrl) throws IOException {
520499
}
521500

522501
private void backupUserFiles(File backupDir) throws IOException {
523-
Files.createDirectories(tempDirectory.resolve(USER_FILES));
502+
Files.createDirectories(temporaryFiles.getDirectory().resolve(USER_FILES));
524503
List<File> backupFiles = cache.getBackupFiles();
525504
File userBackupDir = new File(backupDir, USER_FILES);
526505
for (File original : backupFiles) {
527506
if (original.exists()) {
528507
original = original.getAbsoluteFile();
529-
Path destination = tempDirectory.resolve(USER_FILES).resolve(original.getName());
508+
Path destination =
509+
temporaryFiles.getDirectory().resolve(USER_FILES).resolve(original.getName());
530510
if (original.isDirectory()) {
531511
FileUtils.copyDirectory(original, destination.toFile());
532512
} else {
@@ -560,7 +540,8 @@ private void backupDeployedJars(File backupDir) throws IOException {
560540
for (DeployedJar jar : jarList) {
561541
File source = new File(jar.getFileCanonicalPath());
562542
String sourceFileName = source.getName();
563-
Path destination = tempDirectory.resolve(USER_FILES).resolve(sourceFileName);
543+
Path destination =
544+
temporaryFiles.getDirectory().resolve(USER_FILES).resolve(sourceFileName);
564545
Files.copy(source.toPath(), destination, StandardCopyOption.COPY_ATTRIBUTES);
565546
backupDefinition.addDeployedJarToBackup(destination);
566547

@@ -576,12 +557,11 @@ private void backupDeployedJars(File backupDir) throws IOException {
576557
}
577558
}
578559

579-
private File getBackupDir(File targetDir) {
560+
private String getCleanedMemberId() {
580561
InternalDistributedMember memberId =
581562
cache.getInternalDistributedSystem().getDistributedMember();
582563
String vmId = memberId.toString();
583-
vmId = cleanSpecialCharacters(vmId);
584-
return new File(targetDir, vmId);
564+
return cleanSpecialCharacters(vmId);
585565
}
586566

587567
private void copyOplog(DiskStore diskStore, File targetDir, Oplog oplog) throws IOException {
@@ -597,7 +577,7 @@ private void backupFile(DiskStore diskStore, DirectoryHolder dirHolder, File tar
597577
throws IOException {
598578
if (file != null && file.exists()) {
599579
try {
600-
Path tempDiskDir = getTempDirForDiskStore(diskStore, dirHolder);
580+
Path tempDiskDir = temporaryFiles.getDiskStoreDirectory(diskStore, dirHolder);
601581
Files.createLink(tempDiskDir.resolve(file.getName()), file.toPath());
602582
backupDefinition.addOplogFileToBackup(diskStore, tempDiskDir.resolve(file.getName()));
603583
} catch (IOException | UnsupportedOperationException e) {
@@ -607,26 +587,6 @@ private void backupFile(DiskStore diskStore, DirectoryHolder dirHolder, File tar
607587
}
608588
}
609589

610-
private Path getTempDirForDiskStore(DiskStore diskStore, DirectoryHolder dirHolder)
611-
throws IOException {
612-
Map<DirectoryHolder, Path> tempDirByDirectoryHolder =
613-
diskStoreDirTempDirsByDiskStore.get(diskStore);
614-
if (tempDirByDirectoryHolder == null) {
615-
tempDirByDirectoryHolder = new HashMap<>();
616-
diskStoreDirTempDirsByDiskStore.put(diskStore, tempDirByDirectoryHolder);
617-
}
618-
Path directory = tempDirByDirectoryHolder.get(dirHolder);
619-
if (directory != null) {
620-
return directory;
621-
}
622-
623-
File diskStoreDir = dirHolder.getDir();
624-
directory = diskStoreDir.toPath().resolve(diskStoreDirectoryName);
625-
Files.createDirectories(directory);
626-
tempDirByDirectoryHolder.put(dirHolder, directory);
627-
return directory;
628-
}
629-
630590
private String cleanSpecialCharacters(String string) {
631591
return string.replaceAll("[^\\w]+", "_");
632592
}

0 commit comments

Comments
 (0)