mirror of
https://github.com/samsonjs/arq_restore.git
synced 2026-03-25 09:25:53 +00:00
added autorelease pools
This commit is contained in:
parent
4884a60a9d
commit
3c02cd09fb
9 changed files with 100 additions and 44 deletions
|
|
@ -43,7 +43,16 @@
|
|||
printf("s3bucket name: %s\n", [s3BucketName UTF8String]);
|
||||
}
|
||||
for (NSString *s3BucketName in s3BucketNames) {
|
||||
if (![self verifyS3BucketName:s3BucketName error:error]) {
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
BOOL ret = [self verifyS3BucketName:s3BucketName error:error];
|
||||
if (error != NULL) {
|
||||
[*error retain];
|
||||
}
|
||||
[pool drain];
|
||||
if (error != NULL) {
|
||||
[*error autorelease];
|
||||
}
|
||||
if (!ret) {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
|
@ -88,6 +97,7 @@
|
|||
return NO;
|
||||
}
|
||||
for (NSString *s3BucketUUIDPath in s3BucketUUIDPaths) {
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
NSString *bucketUUID = [s3BucketUUIDPath lastPathComponent];
|
||||
printf("verifying bucketUUID %s computerUUID %s s3Bucket %s\n", [bucketUUID UTF8String], [computerUUID UTF8String], [s3BucketName UTF8String]);
|
||||
BucketVerifier *bucketVerifier = [[[BucketVerifier alloc] initWithS3Service:s3
|
||||
|
|
@ -96,7 +106,15 @@
|
|||
bucketUUID:bucketUUID
|
||||
s3ObjectSHA1s:objectSHA1s
|
||||
encryptionKey:encryptionPassword] autorelease];
|
||||
if (![bucketVerifier verify:error]) {
|
||||
BOOL ret = [bucketVerifier verify:error];
|
||||
if (error != NULL) {
|
||||
[*error retain];
|
||||
}
|
||||
[pool drain];
|
||||
if (error != NULL) {
|
||||
[*error autorelease];
|
||||
}
|
||||
if (!ret) {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
|
@ -123,16 +141,25 @@
|
|||
|
||||
@implementation ArqVerifyCommand (internal)
|
||||
- (NSArray *)objectSHA1sForS3BucketName:(NSString *)s3BucketName computerUUID:(NSString *)computerUUID error:(NSError **)error {
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
NSMutableArray *objectSHA1s = nil;
|
||||
NSString *objectsPrefix = [NSString stringWithFormat:@"/%@/%@/objects", s3BucketName, computerUUID];
|
||||
printf("loading S3 object SHA1s with prefix %s\n", [objectsPrefix UTF8String]);
|
||||
NSArray *objectPaths = [s3 pathsWithPrefix:objectsPrefix error:error];
|
||||
if (objectPaths == nil) {
|
||||
return NO;
|
||||
if (objectPaths != nil) {
|
||||
objectSHA1s = [[NSMutableArray alloc] init];
|
||||
printf("loaded %u object SHA1s with prefix %s\n", [objectPaths count], [objectsPrefix UTF8String]);
|
||||
for (NSString *objectPath in objectPaths) {
|
||||
[objectSHA1s addObject:[objectPath lastPathComponent]];
|
||||
}
|
||||
}
|
||||
printf("loaded %u object SHA1s with prefix %s\n", [objectPaths count], [objectsPrefix UTF8String]);
|
||||
NSMutableArray *objectSHA1s = [NSMutableArray array];
|
||||
for (NSString *objectPath in objectPaths) {
|
||||
[objectSHA1s addObject:[objectPath lastPathComponent]];
|
||||
if (error != NULL) {
|
||||
[*error retain];
|
||||
}
|
||||
[pool drain];
|
||||
[objectSHA1s autorelease];
|
||||
if (error != NULL) {
|
||||
[*error autorelease];
|
||||
}
|
||||
return objectSHA1s;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,5 +51,5 @@
|
|||
- (NSString *)packSHA1ForPackedBlobSHA1:(NSString *)sha1 packSetName:(NSString *)packSetName;
|
||||
|
||||
// Sync local cache files to S3 data; reload PackIndexEntries from local cache files.
|
||||
- (BOOL)resetFromS3:(NSError **)error;
|
||||
- (NSArray *)resetFromS3:(NSError **)error;
|
||||
@end
|
||||
|
|
|
|||
16
PackSetSet.m
16
PackSetSet.m
|
|
@ -91,12 +91,12 @@
|
|||
}
|
||||
return [packSet packSHA1ForPackedBlobSHA1:sha1];
|
||||
}
|
||||
- (BOOL)resetFromS3:(NSError **)error {
|
||||
- (NSArray *)resetFromS3:(NSError **)error {
|
||||
HSLogDebug(@"resetting pack sets from S3");
|
||||
[packSets removeAllObjects];
|
||||
NSDictionary *s3PackSHA1sByPackSetName = [self packSHA1sByPackSetNameFromS3:error];
|
||||
if (s3PackSHA1sByPackSetName == nil) {
|
||||
return NO;
|
||||
return nil;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -104,7 +104,7 @@
|
|||
//
|
||||
NSMutableSet *diskPackSetNames = [self diskPackSetNames:error];
|
||||
if (diskPackSetNames == nil) {
|
||||
return NO;
|
||||
return nil;
|
||||
}
|
||||
NSMutableSet *s3PackSetNames = [NSMutableSet setWithArray:[s3PackSHA1sByPackSetName allKeys]];
|
||||
[diskPackSetNames minusSet:s3PackSetNames];
|
||||
|
|
@ -112,7 +112,7 @@
|
|||
NSString *packSetPath = [PackSet localPathWithComputerUUID:computerUUID packSetName:bogusDiskPackSetName];
|
||||
HSLogDebug(@"removing local pack set that doesn't exist in S3: %@", packSetPath);
|
||||
if (![[NSFileManager defaultManager] removeItemAtPath:packSetPath error:error]) {
|
||||
return NO;
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -128,11 +128,15 @@
|
|||
keepPacksLocal:[s3PackSetName hasSuffix:@"-trees"]
|
||||
packSHA1s:packSHA1s error:error] autorelease];
|
||||
if (packSet == nil) {
|
||||
return NO;
|
||||
return nil;
|
||||
}
|
||||
[packSets setObject:packSet forKey:s3PackSetName];
|
||||
}
|
||||
return YES;
|
||||
NSMutableArray *ret = [NSMutableArray array];
|
||||
for (NSArray *sha1s in [s3PackSHA1sByPackSetName allValues]) {
|
||||
[ret addObjectsFromArray:sha1s];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@end
|
||||
@implementation PackSetSet (internal)
|
||||
|
|
|
|||
2
S3Fark.h
2
S3Fark.h
|
|
@ -50,5 +50,5 @@
|
|||
- (ServerBlob *)newServerBlobForSHA1:(NSString *)sha1 packSetName:(NSString *)packSetName searchPackOnly:(BOOL)searchPackOnly error:(NSError **)error;
|
||||
- (BOOL)containsBlobForSHA1:(NSString *)sha1 packSetName:(NSString *)packSetName searchPackOnly:(BOOL)searchPackOnly;
|
||||
- (NSString *)packSHA1ForPackedBlobSHA1:(NSString *)sha1 packSetName:(NSString *)packSetName;
|
||||
- (BOOL)reloadPacksFromS3:(NSError **)error;
|
||||
- (NSArray *)reloadPacksFromS3:(NSError **)error;
|
||||
@end
|
||||
|
|
|
|||
2
S3Fark.m
2
S3Fark.m
|
|
@ -99,7 +99,7 @@
|
|||
- (NSString *)packSHA1ForPackedBlobSHA1:(NSString *)sha1 packSetName:(NSString *)packSetName {
|
||||
return [packSetSet packSHA1ForPackedBlobSHA1:sha1 packSetName:packSetName];
|
||||
}
|
||||
- (BOOL)reloadPacksFromS3:(NSError **)error {
|
||||
- (NSArray *)reloadPacksFromS3:(NSError **)error {
|
||||
NSAssert([NSThread currentThread] == creatorThread, @"must be on same thread!");
|
||||
return [packSetSet resetFromS3:error];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1076,7 +1076,7 @@
|
|||
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
|
||||
HEADER_SEARCH_PATHS = "";
|
||||
INSTALL_PATH = /usr/local/bin;
|
||||
PRODUCT_NAME = arq_restore;
|
||||
PRODUCT_NAME = arq_verify;
|
||||
SDKROOT = macosx10.5;
|
||||
};
|
||||
name = Release;
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ int main (int argc, const char * argv[]) {
|
|||
|
||||
NSString *accessKey = [NSString stringWithUTF8String:cAccessKey];
|
||||
NSString *secretKey = [NSString stringWithUTF8String:cSecretKey];
|
||||
NSString *encryptionPassword = [[NSString alloc] initWithUTF8String:cEncryptionPassword];
|
||||
NSString *encryptionPassword = [[[NSString alloc] initWithUTF8String:cEncryptionPassword] autorelease];
|
||||
ArqVerifyCommand *cmd = [[[ArqVerifyCommand alloc] initWithAccessKey:accessKey secretKey:secretKey encryptionPassword:encryptionPassword] autorelease];
|
||||
NSError *error = nil;
|
||||
BOOL ret = NO;
|
||||
|
|
|
|||
|
|
@ -45,9 +45,15 @@
|
|||
}
|
||||
- (BOOL)verify:(NSError **)error {
|
||||
printf("reloading packs from S3 for s3Bucket %s computerUUID %s bucketUUID %s\n", [s3BucketName UTF8String], [computerUUID UTF8String], [bucketUUID UTF8String]);
|
||||
if (![fark reloadPacksFromS3:error]) {
|
||||
NSArray *s3PackSHA1s = [fark reloadPacksFromS3:error];
|
||||
if (s3PackSHA1s == nil) {
|
||||
return NO;
|
||||
}
|
||||
printf("S3 packs found for computer UUID %s:\n", [computerUUID UTF8String]);
|
||||
for (NSString *s3PackSHA1 in s3PackSHA1s) {
|
||||
printf("S3 pack SHA1: %s\n", [s3PackSHA1 UTF8String]);
|
||||
}
|
||||
|
||||
NSString *headSHA1 = nil;
|
||||
if (![repo localHeadSHA1:&headSHA1 error:error]) {
|
||||
return NO;
|
||||
|
|
@ -82,13 +88,19 @@
|
|||
fprintf(stderr, "tree %s not found\n", [treeSHA1 UTF8String]);
|
||||
return NO;
|
||||
}
|
||||
if (![self verify:[tree xattrsSHA1] error:error]) {
|
||||
fprintf(stderr, "tree %s's xattrsSHA1 %s not found", [treeSHA1 UTF8String], [[tree xattrsSHA1] UTF8String]);
|
||||
return NO;
|
||||
if ([tree xattrsSHA1] != nil) {
|
||||
printf("verifying xattrsSHA1 for tree %s\n", [treeSHA1 UTF8String]);
|
||||
if (![self verify:[tree xattrsSHA1] error:error]) {
|
||||
fprintf(stderr, "tree %s's xattrsSHA1 %s not found", [treeSHA1 UTF8String], [[tree xattrsSHA1] UTF8String]);
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
if (![self verify:[tree aclSHA1] error:error]) {
|
||||
fprintf(stderr, "tree %s's aclSHA1 %s not found", [treeSHA1 UTF8String], [[tree aclSHA1] UTF8String]);
|
||||
return NO;
|
||||
if ([tree aclSHA1] != nil) {
|
||||
printf("verifying aclSHA1 for tree %s\n", [treeSHA1 UTF8String]);
|
||||
if (![self verify:[tree aclSHA1] error:error]) {
|
||||
fprintf(stderr, "tree %s's aclSHA1 %s not found", [treeSHA1 UTF8String], [[tree aclSHA1] UTF8String]);
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
for (NSString *childNodeName in [tree childNodeNames]) {
|
||||
Node *node = [tree childNodeWithName:childNodeName];
|
||||
|
|
@ -100,29 +112,41 @@
|
|||
return NO;
|
||||
}
|
||||
} else {
|
||||
printf("verifying node %s\n", [childPath UTF8String]);
|
||||
printf("verifying data sha1s for node %s\n", [childPath UTF8String]);
|
||||
for (NSString *dataSHA1 in dataSHA1s) {
|
||||
if (![self verify:dataSHA1 error:error]) {
|
||||
HSLogError(@"missing data sha1 %@ for node %@ in tree %@", dataSHA1, childNodeName, treeSHA1);
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
if (![self verify:[node thumbnailSHA1] error:error]) {
|
||||
HSLogError(@"missing thumbnail sha1 %@ for node %@ in tree %@", [node thumbnailSHA1], childNodeName, treeSHA1);
|
||||
return NO;
|
||||
}
|
||||
if (![self verify:[node previewSHA1] error:error]) {
|
||||
HSLogError(@"missing preview sha1 %@ for node %@ in tree %@", [node previewSHA1], childNodeName, treeSHA1);
|
||||
return NO;
|
||||
}
|
||||
if (![self verify:[node xattrsSHA1] error:error]) {
|
||||
HSLogError(@"missing xattrs sha1 %@ for node %@ in tree %@", [node xattrsSHA1], childNodeName, treeSHA1);
|
||||
return NO;
|
||||
}
|
||||
if (![self verify:[node aclSHA1] error:error]) {
|
||||
HSLogError(@"missing acl sha1 %@ for node %@ in tree %@", [node aclSHA1], childNodeName, treeSHA1);
|
||||
return NO;
|
||||
}
|
||||
if ([node thumbnailSHA1] != nil) {
|
||||
printf("verifying thumbnailSHA1 for node %s\n", [childPath UTF8String]);
|
||||
if (![self verify:[node thumbnailSHA1] error:error]) {
|
||||
HSLogError(@"missing thumbnail sha1 %@ for node %@ in tree %@", [node thumbnailSHA1], childNodeName, treeSHA1);
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
if ([node previewSHA1] != nil) {
|
||||
printf("verifying previewSHA1 for node %s\n", [childPath UTF8String]);
|
||||
if (![self verify:[node previewSHA1] error:error]) {
|
||||
HSLogError(@"missing preview sha1 %@ for node %@ in tree %@", [node previewSHA1], childNodeName, treeSHA1);
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
if ([node xattrsSHA1] != nil) {
|
||||
printf("verifying xattrsSHA1 for node %s\n", [childPath UTF8String]);
|
||||
if (![self verify:[node xattrsSHA1] error:error]) {
|
||||
HSLogError(@"missing xattrs sha1 %@ for node %@ in tree %@", [node xattrsSHA1], childNodeName, treeSHA1);
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
if ([node aclSHA1] != nil) {
|
||||
printf("verifying aclSHA1 for node %s\n", [childPath UTF8String]);
|
||||
if (![self verify:[node aclSHA1] error:error]) {
|
||||
HSLogError(@"missing acl sha1 %@ for node %@ in tree %@", [node aclSHA1], childNodeName, treeSHA1);
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return YES;
|
||||
|
|
|
|||
|
|
@ -60,8 +60,9 @@
|
|||
goto init_error;
|
||||
}
|
||||
NSXMLNode *sizeNode = [nodes objectAtIndex:0];
|
||||
NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
|
||||
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
|
||||
size = [[numberFormatter numberFromString:[sizeNode stringValue]] longValue];
|
||||
[numberFormatter release];
|
||||
goto init_done;
|
||||
init_error:
|
||||
[self release];
|
||||
|
|
|
|||
Loading…
Reference in a new issue