Skip to content

Commit

Permalink
Merge pull request #173 from aliyun/dhc/bugfix
Browse files Browse the repository at this point in the history
时间同步逻辑优化
  • Loading branch information
duan007a authored Sep 13, 2018
2 parents f768bef + a94b2d0 commit d696d1d
Show file tree
Hide file tree
Showing 8 changed files with 147 additions and 138 deletions.
186 changes: 93 additions & 93 deletions AliyunOSSSDK/OSSClient.m
Original file line number Diff line number Diff line change
Expand Up @@ -1406,7 +1406,7 @@ - (void)executePartUpload:(OSSMultipartUploadRequest *)request totalBytesExpecte
OSSTask * uploadPartTask = [self uploadPart:uploadPart];
[uploadPartTask waitUntilFinished];
if (uploadPartTask.error) {
if (uploadPartTask.error.code != -409) {
if (abs(uploadPartTask.error.code) != 409) {
*errorTask = uploadPartTask;
}
} else {
Expand Down Expand Up @@ -1541,35 +1541,33 @@ - (OSSTask *)multipartUpload:(OSSMultipartUploadRequest *)request resumable:(BOO
}

[uploadedPart enumerateObjectsUsingBlock:^(NSDictionary *partInfo, NSUInteger idx, BOOL * _Nonnull stop) {
unsigned long long iPartNum = 0;
NSString *partNumberString = [partInfo objectForKey:OSSPartNumberXMLTOKEN];
NSScanner *scanner = [NSScanner scannerWithString:partNumberString];
[scanner scanUnsignedLongLong:&iPartNum];
unsigned long long remotePartNumber = 0;
NSString *partNumberString = [partInfo objectForKey: OSSPartNumberXMLTOKEN];
NSScanner *scanner = [NSScanner scannerWithString: partNumberString];
[scanner scanUnsignedLongLong: &remotePartNumber];

unsigned long long iPartSize = 0;
NSString *remotePartEtag = [partInfo objectForKey:OSSETagXMLTOKEN];

unsigned long long remotePartSize = 0;
NSString *partSizeString = [partInfo objectForKey:OSSSizeXMLTOKEN];
scanner = [NSScanner scannerWithString:partSizeString];
[scanner scanUnsignedLongLong:&iPartSize];

NSString *eTag = [partInfo objectForKey:OSSETagXMLTOKEN];
[scanner scanUnsignedLongLong:&remotePartSize];

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshorten-64-to-32"

OSSPartInfo * info = [OSSPartInfo partInfoWithPartNum:iPartNum
eTag:eTag
size:iPartSize
crc64:0];
#pragma clang diagnostic pop
OSSPartInfo * info = [[OSSPartInfo alloc] init];
info.partNum = remotePartNumber;
info.size = remotePartSize;
info.eTag = remotePartEtag;

NSDictionary *tPartInfo = [localPartInfos objectForKey:[NSString stringWithFormat:@"%llu",iPartNum]];
if (tPartInfo)
{
info.crc64 = [tPartInfo[@"crc64"] unsignedLongLongValue];
}
#pragma clang diagnostic pop

NSDictionary *tPartInfo = [localPartInfos objectForKey: [@(remotePartNumber) stringValue]];
info.crc64 = [tPartInfo[@"crc64"] unsignedLongLongValue];

[uploadedPartInfos addObject:info];
[alreadyUploadIndex addObject:@(info.partNum)];
[alreadyUploadIndex addObject:@(remotePartNumber)];
}];

if ([alreadyUploadIndex count] > 0 && request.uploadProgress && uploadFileSize) {
Expand Down Expand Up @@ -1597,6 +1595,8 @@ - (OSSTask *)multipartUpload:(OSSMultipartUploadRequest *)request resumable:(BOO
}

request.uploadId = uploadId;
localPartInfosPath = [[[NSString oss_documentDirectory] stringByAppendingPathComponent:oss_partInfos_storage_name] stringByAppendingPathComponent:uploadId];

if (request.isCancelled)
{
if(resumable)
Expand Down Expand Up @@ -1685,7 +1685,6 @@ - (OSSTask *)sequentialUpload:(OSSMultipartUploadRequest *)request
fileSize:(unsigned long long)uploadFileSize
{
OSSRequestCRCFlag crcFlag = request.crcFlag;
__block BOOL isCancel = NO;
__block OSSTask *errorTask;
__block NSMutableDictionary *localPartInfos = nil;

Expand All @@ -1703,94 +1702,95 @@ - (OSSTask *)sequentialUpload:(OSSMultipartUploadRequest *)request
return [OSSTask taskWithError: readError];
}

NSData * uploadPartData;
NSUInteger realPartLength = request.partSize;

for (int i = 1; i <= partCout; i++) {
realPartLength = request.partSize;
if (isCancel && errorTask != nil) {
if (errorTask == nil) {
errorTask = [OSSTask taskWithError:[OSSClient cancelError]];
}
if (errorTask) {
break;
}

if (request.isCancelled) {
errorTask = [OSSTask taskWithError:[OSSClient cancelError]];
break;
}

if ([alreadyUploadIndex containsObject:@(i)]) {
continue;
}

realPartLength = request.partSize;
@autoreleasepool{
//alreadyUploadIndex 为空 return false
if (alreadyUploadIndex && [alreadyUploadIndex containsObject:@(i)]) {
continue;
}
[fileHande seekToFileOffset:request.partSize * (i - 1)];
if (i == partCout) {
[fileHande seekToFileOffset:request.partSize * (i - 1)];
if (i == partCout) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshorten-64-to-32"
realPartLength = uploadFileSize - request.partSize * (i - 1);
realPartLength = uploadFileSize - request.partSize * (i - 1);
#pragma clang diagnostic pop
}
uploadPartData = [fileHande readDataOfLength:realPartLength];
}
NSData *uploadPartData = [fileHande readDataOfLength:realPartLength];

@autoreleasepool {
OSSUploadPartRequest * uploadPart = [OSSUploadPartRequest new];
uploadPart.bucketName = request.bucketName;
uploadPart.objectkey = request.objectKey;
uploadPart.partNumber = i;
uploadPart.uploadId = request.uploadId;
uploadPart.uploadPartData = uploadPartData;
uploadPart.contentMd5 = [OSSUtil base64Md5ForData:uploadPartData];
uploadPart.crcFlag = request.crcFlag;

if (request.isCancelled) {
@synchronized(lock){
if(!isCancel){
isCancel = YES;
}
OSSTask * uploadPartTask = [self uploadPart:uploadPart];
[uploadPartTask waitUntilFinished];

if (uploadPartTask.error) {
if (abs(uploadPartTask.error.code) != 409) {
errorTask = uploadPartTask;
break;
} else {
NSDictionary *partDict = uploadPartTask.error.userInfo;
OSSPartInfo *partInfo = [[OSSPartInfo alloc] init];
partInfo.eTag = partDict[@"PartEtag"];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshorten-64-to-32"
partInfo.partNum = [(NSString *)partDict[@"PartNumber"] integerValue];
partInfo.size = realPartLength;
#pragma clang diagnostic push
partInfo.crc64 = [[uploadPartData mutableCopy] oss_crc64];

[alreadyUploadPart addObject:partInfo];
}
} else {
OSSUploadPartRequest * uploadPart = [OSSUploadPartRequest new];
uploadPart.bucketName = request.bucketName;
uploadPart.objectkey = request.objectKey;
uploadPart.partNumber = i;
uploadPart.uploadId = request.uploadId;
uploadPart.uploadPartData = uploadPartData;
uploadPart.contentMd5 = [OSSUtil base64Md5ForData:uploadPartData];
uploadPart.crcFlag = request.crcFlag;
OSSUploadPartResult * result = uploadPartTask.result;
OSSPartInfo * partInfo = [OSSPartInfo new];
partInfo.partNum = i;
partInfo.eTag = result.eTag;
partInfo.size = realPartLength;
uint64_t crc64OfPart;
@try {
NSScanner *scanner = [NSScanner scannerWithString:result.remoteCRC64ecma];
[scanner scanUnsignedLongLong:&crc64OfPart];
partInfo.crc64 = crc64OfPart;
} @catch (NSException *exception) {
OSSLogError(@"multipart upload error with nil remote crc64!");
}

OSSTask * uploadPartTask = [self uploadPart:uploadPart];
[uploadPartTask waitUntilFinished];
if (uploadPartTask.error) {
if (uploadPartTask.error.code != -409) {
errorTask = uploadPartTask;
break;
}
} else {
OSSUploadPartResult * result = uploadPartTask.result;
OSSPartInfo * partInfo = [OSSPartInfo new];
partInfo.partNum = i;
partInfo.eTag = result.eTag;
partInfo.size = realPartLength;
uint64_t crc64OfPart;
@try {
NSScanner *scanner = [NSScanner scannerWithString:result.remoteCRC64ecma];
[scanner scanUnsignedLongLong:&crc64OfPart];
partInfo.crc64 = crc64OfPart;
} @catch (NSException *exception) {
OSSLogError(@"multipart upload error with nil remote crc64!");
}

@synchronized(lock){

[alreadyUploadPart addObject:partInfo];

if (crcFlag == OSSRequestCRCOpen)
{
[self processForLocalPartInfos:localPartInfos
partInfo:partInfo
uploadId:request.uploadId];
[self persistencePartInfos:localPartInfos
withUploadId:request.uploadId];
}
*uploadedLength += realPartLength;
if (request.uploadProgress)
{
request.uploadProgress(realPartLength, *uploadedLength, uploadFileSize);
}
[alreadyUploadPart addObject:partInfo];
if (crcFlag == OSSRequestCRCOpen)
{
[self processForLocalPartInfos:localPartInfos
partInfo:partInfo
uploadId:request.uploadId];
[self persistencePartInfos:localPartInfos
withUploadId:request.uploadId];
}

@synchronized(lock) {
*uploadedLength += realPartLength;
if (request.uploadProgress)
{
request.uploadProgress(realPartLength, *uploadedLength, uploadFileSize);
}
}
}
if (isCancel) {
errorTask = [OSSTask taskWithError:[OSSClient cancelError]];
break;
}
}
}
[fileHande closeFile];
Expand Down
2 changes: 1 addition & 1 deletion AliyunOSSSDK/OSSDefine.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
#elif TARGET_OS_OSX
#define OSSUAPrefix @"aliyun-sdk-mac"
#endif
#define OSSSDKVersion @"2.10.6"
#define OSSSDKVersion @"2.10.7"

#define OSSListBucketResultXMLTOKEN @"ListBucketResult"
#define OSSNameXMLTOKEN @"Name"
Expand Down
25 changes: 12 additions & 13 deletions AliyunOSSSDK/OSSNetworking.m
Original file line number Diff line number Diff line change
Expand Up @@ -282,19 +282,6 @@ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)sessionTask
return ;
}

//Correct Clock Skew
NSString * dateStr = [[httpResponse allHeaderFields] objectForKey:@"Date"];
if ([dateStr length] > 0) {
NSDate * serverTime = [NSDate oss_dateFromString:dateStr];
NSDate * deviceTime = [NSDate date];
NSTimeInterval skewTime = [deviceTime timeIntervalSinceDate:serverTime];
[NSDate oss_setClockSkew:skewTime];
} else if (!error) {
// The response header does not have the 'Date' field.
// This should not happen.
OSSLogError(@"Date header does not exist, unable to fix the clock skew");
}

/* background upload task will not call back didRecieveResponse */
if (delegate.isBackgroundUploadFileTask) {
OSSLogVerbose(@"backgroud upload task did recieve response: %@", httpResponse);
Expand Down Expand Up @@ -359,6 +346,18 @@ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)sessionTask

case OSSNetworkingRetryTypeShouldCorrectClockSkewAndRetry: {
/* correct clock skew */
NSString * dateStr = [[httpResponse allHeaderFields] objectForKey:@"Date"];
if ([dateStr length] > 0) {
NSDate * serverTime = [NSDate oss_dateFromString:dateStr];
NSDate * deviceTime = [NSDate date];
NSTimeInterval skewTime = [deviceTime timeIntervalSinceDate:serverTime];
[NSDate oss_setClockSkew:skewTime];
} else if (!error) {
// The response header does not have the 'Date' field.
// This should not happen.
OSSLogError(@"Date header does not exist, unable to fix the clock skew");
}

[delegate.interceptors insertObject:[OSSTimeSkewedFixingInterceptor new] atIndex:0];
break;
}
Expand Down
59 changes: 31 additions & 28 deletions AliyunOSSSDK/OSSNetworkingRequestDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -72,28 +72,32 @@ - (OSSTask *)buildInternalHttpRequest {
}

#define URLENCODE(a) [OSSUtil encodeURL:(a)]
OSSLogDebug(@"start to build request");
OSSLogDebug(@"start to build request")
// build base url string
NSString * urlString = self.allNeededMessage.endpoint;

NSURL * endPointURL = [NSURL URLWithString:self.allNeededMessage.endpoint];
if (self.allNeededMessage.bucketName) {
OSSIPv6Adapter *ipv6Adapter = [OSSIPv6Adapter getInstance];
if ([OSSUtil isOssOriginBucketHost:endPointURL.host]) {
urlString = [NSString stringWithFormat:@"%@://%@.%@", endPointURL.scheme, self.allNeededMessage.bucketName, endPointURL.host];
} else if ([ipv6Adapter isIPv4Address: endPointURL.host] || [ipv6Adapter isIPv6Address: endPointURL.host]) {
urlString = [NSString stringWithFormat:@"%@://%@/%@/", endPointURL.scheme, endPointURL.host, self.allNeededMessage.bucketName];
NSString *urlString = self.allNeededMessage.endpoint;
NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithString:urlString];
NSString *headerHost = nil;

if ([self.allNeededMessage.bucketName oss_isNotEmpty]) {
OSSIPv6Adapter *ipAdapter = [OSSIPv6Adapter getInstance];
if ([OSSUtil isOssOriginBucketHost:urlComponents.host]) {
// eg. insert bucket to the begining of host.
urlComponents.host = [NSString stringWithFormat:@"%@.%@", self.allNeededMessage.bucketName, urlComponents.host];
headerHost = urlComponents.host;

if (self.isHttpdnsEnable) {
NSString *dnsResult = [OSSUtil getIpByHost: urlComponents.host];
urlComponents.host = dnsResult;
}
} else if ([ipAdapter isIPv4Address:urlComponents.host] || [ipAdapter isIPv6Address:urlComponents.host]) {
urlComponents.path = [NSString stringWithFormat:@"/%@%@",self.allNeededMessage.bucketName, urlComponents.path];
}
}

endPointURL = [NSURL URLWithString:urlString];
NSString * urlHost = endPointURL.host;
if (!self.isAccessViaProxy && [OSSUtil isOssOriginBucketHost:urlHost] && self.isHttpdnsEnable) {
NSString * httpdnsResolvedResult = [OSSUtil getIpByHost:urlHost];
urlString = [NSString stringWithFormat:@"%@://%@", endPointURL.scheme, httpdnsResolvedResult];
}
urlString = urlComponents.string;

if (self.allNeededMessage.objectKey) {
// join object name
if ([self.allNeededMessage.objectKey oss_isNotEmpty]) {
urlString = [urlString oss_stringByAppendingPathComponentForURL:URLENCODE(self.allNeededMessage.objectKey)];
}

Expand All @@ -115,22 +119,21 @@ - (OSSTask *)buildInternalHttpRequest {
urlString = [NSString stringWithFormat:@"%@?%@", urlString, queryString];
}
}
OSSLogDebug(@"built full url: %@", urlString);

NSString * headerHost = urlHost;
if (![OSSUtil isOssOriginBucketHost:urlHost] && self.allNeededMessage.isHostInCnameExcludeList && self.allNeededMessage.bucketName) {
headerHost = [NSString stringWithFormat:@"%@.%@", self.allNeededMessage.bucketName, urlHost];
}
OSSLogDebug(@"built full url: %@", urlString)

// set header fields
// generate internal request For NSURLSession
self.internalRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];

// override default host
[self.internalRequest setValue:headerHost forHTTPHeaderField:@"Host"];

// set http method of request
if (self.allNeededMessage.httpMethod) {
[self.internalRequest setHTTPMethod:self.allNeededMessage.httpMethod];
}

// set host of header fields
if ([headerHost oss_isNotEmpty]) {
[self.internalRequest setValue:headerHost forHTTPHeaderField:@"Host"];
}

if (self.allNeededMessage.contentType) {
[self.internalRequest setValue:self.allNeededMessage.contentType forHTTPHeaderField:@"Content-Type"];
}
Expand All @@ -154,7 +157,7 @@ - (OSSTask *)buildInternalHttpRequest {


OSSLogVerbose(@"buidlInternalHttpRequest -\nmethod: %@\nurl: %@\nheader: %@", self.internalRequest.HTTPMethod,
self.internalRequest.URL, self.internalRequest.allHTTPHeaderFields);
self.internalRequest.URL, self.internalRequest.allHTTPHeaderFields)

#undef URLENCODE//(a)
return [OSSTask taskWithResult:nil];
Expand Down
2 changes: 1 addition & 1 deletion AliyunOSSSDK/OSSRequest.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
/**
the flag of request canceled.
*/
@property (nonatomic, assign) BOOL isCancelled;
@property (atomic, assign) BOOL isCancelled;

/**
the flag of verification about crc64
Expand Down
Loading

0 comments on commit d696d1d

Please sign in to comment.