From 3c02cd09fbca498a6a8e9f451aa5f84f3f5d9bc8 Mon Sep 17 00:00:00 2001 From: Stefan Reitshamer Date: Mon, 28 Jun 2010 07:56:28 -0400 Subject: [PATCH] added autorelease pools --- ArqVerifyCommand.m | 43 +++++++++++++--- PackSetSet.h | 2 +- PackSetSet.m | 16 +++--- S3Fark.h | 2 +- S3Fark.m | 2 +- arq_restore.xcodeproj/project.pbxproj | 2 +- arq_verify.m | 2 +- s3/BucketVerifier.m | 72 ++++++++++++++++++--------- s3/S3ObjectMetadata.m | 3 +- 9 files changed, 100 insertions(+), 44 deletions(-) diff --git a/ArqVerifyCommand.m b/ArqVerifyCommand.m index c07ebb8..4d8d516 100644 --- a/ArqVerifyCommand.m +++ b/ArqVerifyCommand.m @@ -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; } diff --git a/PackSetSet.h b/PackSetSet.h index fb2bd6f..e180f40 100644 --- a/PackSetSet.h +++ b/PackSetSet.h @@ -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 diff --git a/PackSetSet.m b/PackSetSet.m index 35b9b5c..4e48d5f 100644 --- a/PackSetSet.m +++ b/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) diff --git a/S3Fark.h b/S3Fark.h index 273ca17..e426a43 100644 --- a/S3Fark.h +++ b/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 diff --git a/S3Fark.m b/S3Fark.m index 3fefa63..1d92856 100644 --- a/S3Fark.m +++ b/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]; } diff --git a/arq_restore.xcodeproj/project.pbxproj b/arq_restore.xcodeproj/project.pbxproj index 11567cb..c0e406c 100644 --- a/arq_restore.xcodeproj/project.pbxproj +++ b/arq_restore.xcodeproj/project.pbxproj @@ -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; diff --git a/arq_verify.m b/arq_verify.m index df0123e..0fbed97 100644 --- a/arq_verify.m +++ b/arq_verify.m @@ -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; diff --git a/s3/BucketVerifier.m b/s3/BucketVerifier.m index a346843..13a2ec9 100644 --- a/s3/BucketVerifier.m +++ b/s3/BucketVerifier.m @@ -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; diff --git a/s3/S3ObjectMetadata.m b/s3/S3ObjectMetadata.m index 3d46d2c..44222bc 100644 --- a/s3/S3ObjectMetadata.m +++ b/s3/S3ObjectMetadata.m @@ -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];