@@ -73,16 +73,14 @@ public class BackupManager {
73
73
private final InternalCache cache ;
74
74
private final CountDownLatch allowDestroys = new CountDownLatch (1 );
75
75
private final BackupDefinition backupDefinition = new BackupDefinition ();
76
- private final String diskStoreDirectoryName ;
76
+ private final String memberId ;
77
77
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 ;
81
79
82
80
public BackupManager (InternalDistributedMember sender , InternalCache gemFireCache ) {
83
81
this .sender = sender ;
84
82
this .cache = gemFireCache ;
85
- diskStoreDirectoryName = DATA_STORES_TEMPORARY_DIRECTORY + System . currentTimeMillis ();
83
+ memberId = getCleanedMemberId ();
86
84
}
87
85
88
86
public void validateRequestingAdmin () {
@@ -99,6 +97,7 @@ public HashSet<PersistentID> prepareForBackup() {
99
97
HashSet <PersistentID > persistentIds = new HashSet <>();
100
98
for (DiskStore store : cache .listDiskStoresIncludingRegionOwned ()) {
101
99
DiskStoreImpl storeImpl = (DiskStoreImpl ) store ;
100
+
102
101
storeImpl .lockStoreBeforeBackup ();
103
102
if (storeImpl .hasPersistedData ()) {
104
103
persistentIds .add (storeImpl .getPersistentID ());
@@ -110,18 +109,20 @@ public HashSet<PersistentID> prepareForBackup() {
110
109
111
110
public HashSet <PersistentID > doBackup (File targetDir , File baselineDir , boolean abort )
112
111
throws IOException {
112
+ if (abort ) {
113
+ cleanup ();
114
+ return new HashSet <>();
115
+ }
116
+
113
117
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 );
119
120
120
121
// Make sure our baseline is okay for this member, then create inspector for baseline backup
121
122
baselineDir = checkBaseline (baselineDir );
122
123
BackupInspector inspector =
123
124
(baselineDir == null ? null : BackupInspector .createInspector (baselineDir ));
124
- File storesDir = new File (backupDir , DATA_STORES_DIRECTORY );
125
+ File storesDir = new File (memberBackupDir , DATA_STORES_DIRECTORY );
125
126
Collection <DiskStore > diskStores = cache .listDiskStoresIncludingRegionOwned ();
126
127
127
128
Map <DiskStoreImpl , DiskStoreBackup > backupByDiskStores =
@@ -130,18 +131,18 @@ public HashSet<PersistentID> doBackup(File targetDir, File baselineDir, boolean
130
131
HashSet <PersistentID > persistentIds = finishDiskStoreBackups (backupByDiskStores );
131
132
132
133
if (!backupByDiskStores .isEmpty ()) {
133
- backupAdditionalFiles (backupDir );
134
+ backupAdditionalFiles (memberBackupDir );
134
135
backupDefinition .setRestoreScript (restoreScript );
135
136
}
136
137
137
138
if (!backupByDiskStores .isEmpty ()) {
138
139
// TODO: allow different stategies...
139
- BackupDestination backupDestination = new FileSystemBackupDestination (backupDir .toPath ());
140
+ BackupDestination backupDestination =
141
+ new FileSystemBackupDestination (memberBackupDir .toPath ());
140
142
backupDestination .backupFiles (backupDefinition );
141
143
}
142
144
143
145
return persistentIds ;
144
-
145
146
} finally {
146
147
cleanup ();
147
148
}
@@ -198,32 +199,15 @@ private DistributionManager getDistributionManager() {
198
199
private void cleanup () {
199
200
isCancelled = true ;
200
201
allowDestroys .countDown ();
201
- cleanupTemporaryFiles ();
202
+ if (temporaryFiles != null ) {
203
+ temporaryFiles .cleanupFiles ();
204
+ }
202
205
releaseBackupLocks ();
203
206
getDistributionManager ().removeAllMembershipListener (membershipListener );
204
207
cache .clearBackupManager ();
205
208
}
206
209
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
+
227
211
228
212
private void releaseBackupLocks () {
229
213
for (DiskStore store : cache .listDiskStoresIncludingRegionOwned ()) {
@@ -263,12 +247,12 @@ private File findBaselineForThisMember(File baselineParentDir) {
263
247
* @return null if the backup is to be a full backup otherwise return the data store directory in
264
248
* the previous backup for this member (if incremental).
265
249
*/
266
- private File checkBaseline (File baselineParentDir ) throws IOException {
250
+ private File checkBaseline (File baselineParentDir ) {
267
251
File baselineDir = null ;
268
252
269
253
if (null != baselineParentDir ) {
270
254
// Start by looking for this memberId
271
- baselineDir = getBackupDir (baselineParentDir );
255
+ baselineDir = new File (baselineParentDir , memberId );
272
256
273
257
if (!baselineDir .exists ()) {
274
258
// hmmm, did this member have a restart?
@@ -311,7 +295,7 @@ private void completeBackup(DiskStoreImpl diskStore, DiskStoreBackup backup) thr
311
295
if (isCancelled ()) {
312
296
break ;
313
297
}
314
- copyOplog (diskStore , tempDirectory .toFile (), oplog );
298
+ copyOplog (diskStore , temporaryFiles . getDirectory () .toFile (), oplog );
315
299
316
300
// Allow the oplog to be deleted, and process any pending delete
317
301
backup .backupFinished (oplog );
@@ -392,13 +376,7 @@ private DiskStoreBackup startDiskStoreBackup(DiskStoreImpl diskStore, File targe
392
376
backup = new DiskStoreBackup (allOplogs , targetDir );
393
377
backupByDiskStore .put (diskStore , backup );
394
378
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 ());
402
380
diskStore .getPersistentOplogSet ().forceRoll (null );
403
381
404
382
if (logger .isDebugEnabled ()) {
@@ -430,7 +408,7 @@ private void backupDiskInitFile(DiskStoreImpl diskStore, Path tempDir) throws IO
430
408
private void addDiskStoreDirectoriesToRestoreScript (DiskStoreImpl diskStore , File targetDir ) {
431
409
DirectoryHolder [] directories = diskStore .getDirectoryHolders ();
432
410
for (int i = 0 ; i < directories .length ; i ++) {
433
- File backupDir = getBackupDir (targetDir , i );
411
+ File backupDir = getBackupDirForCurrentMember (targetDir , i );
434
412
restoreScript .addFile (directories [i ].getDir (), backupDir );
435
413
}
436
414
}
@@ -495,12 +473,12 @@ private Map<File, File> addBaselineOplogToRestoreScript(BackupInspector baseline
495
473
return oplogMap ;
496
474
}
497
475
498
- private File getBackupDir (File targetDir , int index ) {
476
+ private File getBackupDirForCurrentMember (File targetDir , int index ) {
499
477
return new File (targetDir , BACKUP_DIR_PREFIX + index );
500
478
}
501
479
502
480
private void backupConfigFiles () throws IOException {
503
- Files .createDirectories (tempDirectory .resolve (CONFIG_DIRECTORY ));
481
+ Files .createDirectories (temporaryFiles . getDirectory () .resolve (CONFIG_DIRECTORY ));
504
482
addConfigFileToBackup (cache .getCacheXmlURL ());
505
483
addConfigFileToBackup (DistributedSystem .getPropertiesFileURL ());
506
484
// TODO: should the gfsecurity.properties file be backed up?
@@ -510,7 +488,8 @@ private void addConfigFileToBackup(URL fileUrl) throws IOException {
510
488
if (fileUrl != null ) {
511
489
try {
512
490
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 ());
514
493
Files .copy (source , destination , StandardCopyOption .COPY_ATTRIBUTES );
515
494
backupDefinition .addConfigFileToBackup (destination );
516
495
} catch (URISyntaxException e ) {
@@ -520,13 +499,14 @@ private void addConfigFileToBackup(URL fileUrl) throws IOException {
520
499
}
521
500
522
501
private void backupUserFiles (File backupDir ) throws IOException {
523
- Files .createDirectories (tempDirectory .resolve (USER_FILES ));
502
+ Files .createDirectories (temporaryFiles . getDirectory () .resolve (USER_FILES ));
524
503
List <File > backupFiles = cache .getBackupFiles ();
525
504
File userBackupDir = new File (backupDir , USER_FILES );
526
505
for (File original : backupFiles ) {
527
506
if (original .exists ()) {
528
507
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 ());
530
510
if (original .isDirectory ()) {
531
511
FileUtils .copyDirectory (original , destination .toFile ());
532
512
} else {
@@ -560,7 +540,8 @@ private void backupDeployedJars(File backupDir) throws IOException {
560
540
for (DeployedJar jar : jarList ) {
561
541
File source = new File (jar .getFileCanonicalPath ());
562
542
String sourceFileName = source .getName ();
563
- Path destination = tempDirectory .resolve (USER_FILES ).resolve (sourceFileName );
543
+ Path destination =
544
+ temporaryFiles .getDirectory ().resolve (USER_FILES ).resolve (sourceFileName );
564
545
Files .copy (source .toPath (), destination , StandardCopyOption .COPY_ATTRIBUTES );
565
546
backupDefinition .addDeployedJarToBackup (destination );
566
547
@@ -576,12 +557,11 @@ private void backupDeployedJars(File backupDir) throws IOException {
576
557
}
577
558
}
578
559
579
- private File getBackupDir ( File targetDir ) {
560
+ private String getCleanedMemberId ( ) {
580
561
InternalDistributedMember memberId =
581
562
cache .getInternalDistributedSystem ().getDistributedMember ();
582
563
String vmId = memberId .toString ();
583
- vmId = cleanSpecialCharacters (vmId );
584
- return new File (targetDir , vmId );
564
+ return cleanSpecialCharacters (vmId );
585
565
}
586
566
587
567
private void copyOplog (DiskStore diskStore , File targetDir , Oplog oplog ) throws IOException {
@@ -597,7 +577,7 @@ private void backupFile(DiskStore diskStore, DirectoryHolder dirHolder, File tar
597
577
throws IOException {
598
578
if (file != null && file .exists ()) {
599
579
try {
600
- Path tempDiskDir = getTempDirForDiskStore (diskStore , dirHolder );
580
+ Path tempDiskDir = temporaryFiles . getDiskStoreDirectory (diskStore , dirHolder );
601
581
Files .createLink (tempDiskDir .resolve (file .getName ()), file .toPath ());
602
582
backupDefinition .addOplogFileToBackup (diskStore , tempDiskDir .resolve (file .getName ()));
603
583
} catch (IOException | UnsupportedOperationException e ) {
@@ -607,26 +587,6 @@ private void backupFile(DiskStore diskStore, DirectoryHolder dirHolder, File tar
607
587
}
608
588
}
609
589
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
-
630
590
private String cleanSpecialCharacters (String string ) {
631
591
return string .replaceAll ("[^\\ w]+" , "_" );
632
592
}
0 commit comments