Skip to content

Commit

Permalink
respect backoffs
Browse files Browse the repository at this point in the history
  • Loading branch information
kevin-montrose committed Apr 3, 2013
1 parent dd93fe8 commit 4598575
Show file tree
Hide file tree
Showing 23 changed files with 141 additions and 114 deletions.
Binary file not shown.
5 changes: 3 additions & 2 deletions StacMan/StacManAccessTokenMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//

#import "StacManAccessTokenMethods.h"
#import "Utils.h"

@implementation StacManAccessTokenMethods
__weak StacManClient* client;
Expand Down Expand Up @@ -36,7 +37,7 @@ -(StacManResponse*)invalidAccessTokens:(NSArray*)accessTokens filter:(NSString*)
pageSize
];

return [client enqueue:url ofType:@"access_token" delegate:del];
return [client enqueue:url ofType:@"access_token" delegate:del backoffKey:@"aci"];
}

-(StacManResponse*)getAccessTokens:(NSArray*)accessTokens filter:(NSString*)filter page:(int)page pageSize:(int)pageSize delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -53,6 +54,6 @@ -(StacManResponse*)getAccessTokens:(NSArray*)accessTokens filter:(NSString*)filt
pageSize
];

return [client enqueue:url ofType:@"access_token" delegate:del];
return [client enqueue:url ofType:@"access_token" delegate:del backoffKey:@"acg"];
}
@end
6 changes: 3 additions & 3 deletions StacMan/StacManAnswerMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ -(StacManResponse*)getAllOnSite:(NSString*)site filter:(NSString*)filter page:(i
order ?: @""
];

return [client enqueue:url ofType:@"answer" delegate:del];
return [client enqueue:url ofType:@"answer" delegate:del backoffKey:@"aall"];
}

-(StacManResponse*)getByIdsOnSite:(NSString*)site ids:(NSArray*)ids filter:(NSString*)filter page:(int)page pageSize:(int)pageSize fromDate:(NSDate*)fromDate toDate:(NSDate*)toDate sort:(NSString*)sort minDate:(NSDate*)minDate maxDate:(NSDate*)maxDate min:(NSNumber*)min max:(NSNumber*)max order:(NSString*)order delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -67,7 +67,7 @@ -(StacManResponse*)getByIdsOnSite:(NSString*)site ids:(NSArray*)ids filter:(NSSt
order ?: @""
];

return [client enqueue:url ofType:@"answer" delegate:del];
return [client enqueue:url ofType:@"answer" delegate:del backoffKey:@"aaids"];
}

-(StacManResponse*)getCommentsOnSite:(NSString*)site ids:(NSArray*)ids filter:(NSString*)filter page:(int)page pageSize:(int)pageSize fromDate:(NSDate*)fromDate toDate:(NSDate*)toDate sort:(NSString*)sort minDate:(NSDate*)minDate maxDate:(NSDate*)maxDate min:(NSNumber*)min max:(NSNumber*)max order:(NSString*)order delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -91,6 +91,6 @@ -(StacManResponse*)getCommentsOnSite:(NSString*)site ids:(NSArray*)ids filter:(N
order ?: @""
];

return [client enqueue:url ofType:@"comment" delegate:del];
return [client enqueue:url ofType:@"comment" delegate:del backoffKey:@"aacs"];
}
@end
2 changes: 1 addition & 1 deletion StacMan/StacManApplicationMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ -(StacManResponse*)deauthenticateWithAccessTokens:(NSArray*)accessTokens filter:
pageSize
];

return [client enqueue:url ofType:@"access_token" delegate:del];
return [client enqueue:url ofType:@"access_token" delegate:del backoffKey:@"actok"];
}
@end
12 changes: 6 additions & 6 deletions StacMan/StacManBadgeMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ -(StacManResponse*)getAllOnSite:(NSString*)site filter:(NSString*)filter page:(i
inname ?: @""
];

return [client enqueue:url ofType:@"badge" delegate:del];
return [client enqueue:url ofType:@"badge" delegate:del backoffKey:@"ball"];
}

-(StacManResponse*)getByIdsOnSite:(NSString*)site ids:(NSArray*)ids filter:(NSString*)filter page:(int)page pageSize:(int)pageSize fromDate:(NSDate*)fromDate toDate:(NSDate*)toDate sort:(NSString*)sort minRank:(NSString*)minRank maxRank:(NSString*)maxRank minName:(NSString*)minName maxName:(NSString*)maxName minType:(NSString*)minType maxType:(NSString*)maxType order:(NSString*)order inname:(NSString*)inname delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -69,7 +69,7 @@ -(StacManResponse*)getByIdsOnSite:(NSString*)site ids:(NSArray*)ids filter:(NSSt
inname ?: @""
];

return [client enqueue:url ofType:@"badge" delegate:del];
return [client enqueue:url ofType:@"badge" delegate:del backoffKey:@"bids"];
}

-(StacManResponse*)getNamedOnSite:(NSString*)site filter:(NSString*)filter page:(int)page pageSize:(int)pageSize fromDate:(NSDate*)fromDate toDate:(NSDate*)toDate sort:(NSString*)sort minRank:(NSString*)minRank maxRank:(NSString*)maxRank minName:(NSString*)minName maxName:(NSString*)maxName minType:(NSString*)minType maxType:(NSString*)maxType order:(NSString*)order inname:(NSString*)inname delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -93,7 +93,7 @@ -(StacManResponse*)getNamedOnSite:(NSString*)site filter:(NSString*)filter page:
inname ?: @""
];

return [client enqueue:url ofType:@"badge" delegate:del];
return [client enqueue:url ofType:@"badge" delegate:del backoffKey:@"bnamed"];
}

//getRecent(String site, String filter, Integer page, Integer pagesize, Date fromdate, Date todate)
Expand All @@ -113,7 +113,7 @@ -(StacManResponse*)getRecentOnSite:(NSString*)site filter:(NSString*)filter page
ConvertDate(toDate) ?: @""
];

return [client enqueue:url ofType:@"badge" delegate:del];
return [client enqueue:url ofType:@"badge" delegate:del backoffKey:@"brecent"];
}

//getRecentByIds(String site, Integer[] ids, String filter, Integer page, Integer pagesize, Date fromdate, Date todate) {
Expand All @@ -134,7 +134,7 @@ -(StacManResponse*)getRecentByIdsOnSite:(NSString*)site ids:(NSArray*)ids filter
ConvertDate(toDate) ?: @""
];

return [client enqueue:url ofType:@"badge" delegate:del];
return [client enqueue:url ofType:@"badge" delegate:del backoffKey:@"brecentids"];
}

//getTagBased(String site, String filter, Integer page, Integer pagesize, Date fromdate, Date todate, BadgeSort sort, BadgeRank minrank, BadgeRank maxrank, String minname, String maxname, Order order, String inname)
Expand All @@ -159,6 +159,6 @@ -(StacManResponse*)getTagBasedOnSite:(NSString*)site filter:(NSString*)filter pa
inname ?: @""
];

return [client enqueue:url ofType:@"badge" delegate:del];
return [client enqueue:url ofType:@"badge" delegate:del backoffKey:@"btags"];
}
@end
2 changes: 1 addition & 1 deletion StacMan/StacManClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,5 +78,5 @@
@property (readonly) NSOperationQueue* queue;

-(id)initWithKey:(NSString*)key;
-(StacManResponse*)enqueue:(NSString*)url ofType:(NSString*)type delegate:(NSObject<StacManDelegate>*)delegate;
-(StacManResponse*)enqueue:(NSString*)url ofType:(NSString*)type delegate:(NSObject<StacManDelegate>*)delegate backoffKey:(NSString*)key;
@end
37 changes: 31 additions & 6 deletions StacMan/StacManClient.m
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ @implementation StacManClient
dispatch_semaphore_t globalBlock;
dispatch_source_t timer;

NSMutableDictionary* backoffs;

-(id)initWithKey:(NSString*)key;
{
self = [super init];
Expand Down Expand Up @@ -69,18 +71,17 @@ -(id)initWithKey:(NSString*)key;
_suggestedEdits = [[StacManSuggestedEditMethods alloc] initWithClient:self];
_tags = [[StacManTagMethods alloc] initWithClient:self];

_queue = [[NSOperationQueue alloc] init];
[_queue setMaxConcurrentOperationCount:30];

globalBlock = dispatch_semaphore_create(30);
// resetTimer = [NSTimer timerWithTimeInterval:5.0 target:self selector:@selector(resetGlobalBlock:) userInfo:nil repeats:YES];
backoffs = [NSMutableDictionary dictionaryWithCapacity:10];

globalBlock = dispatch_semaphore_create(30);
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));

dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), 5.0, 0);
dispatch_source_set_event_handler(timer, ^{ [self resetGlobalBlock]; });
dispatch_resume(timer);

_queue = [[NSOperationQueue alloc] init];
[_queue setMaxConcurrentOperationCount:30];
}

return self;
Expand All @@ -106,7 +107,7 @@ -(void)resetGlobalBlock
}
}

-(StacManResponse*)enqueue:(NSString*)str ofType:(NSString*)type delegate:(NSObject<StacManDelegate>*)del
-(StacManResponse*)enqueue:(NSString*)str ofType:(NSString*)type delegate:(NSObject<StacManDelegate>*)del backoffKey:(NSString*)backoff
{
NSURL* url = [NSURL URLWithString:str];

Expand All @@ -121,6 +122,17 @@ -(StacManResponse*)enqueue:(NSString*)str ofType:(NSString*)type delegate:(NSObj
{
dispatch_semaphore_wait(blockOn, DISPATCH_TIME_FOREVER);

NSNumber* waitFor;
@synchronized(backoffs)
{
waitFor = [backoffs valueForKey:backoff];
}

if(waitFor)
{
sleep([waitFor intValue]);
}

NSError* error = nil;
NSData* json = [NSData dataWithContentsOfURL:url options:0 error:&error];

Expand All @@ -132,11 +144,24 @@ -(StacManResponse*)enqueue:(NSString*)str ofType:(NSString*)type delegate:(NSObj
{
StacManWrapper* wrapper = [[StacManWrapper alloc] initWithJson:json type:type];

if(wrapper.backoff > 0)
{
[self enforceBackoff: backoff forSeconds:wrapper.backoff];
}

[ret fulfil:wrapper success:YES error:nil];
}
}
];

return ret;
}

-(void)enforceBackoff:(NSString*)key forSeconds:(int)forSeconds
{
@synchronized(backoffs)
{
[backoffs setValue:[NSNumber numberWithInt:forSeconds] forKey:key];
}
}
@end
4 changes: 2 additions & 2 deletions StacMan/StacManCommentMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ -(StacManResponse*)getAllOnSite:(NSString*)site filter:(NSString*)filter page:(i
order ?: @""
];

return [client enqueue:url ofType:@"comment" delegate:del];
return [client enqueue:url ofType:@"comment" delegate:del backoffKey:@"calls"];
}

-(StacManResponse*)getByIdsSite:(NSString*)site ids:(NSArray*)ids filter:(NSString*)filter page:(int)page pageSize:(int)pageSize fromDate:(NSDate*)fromDate toDate:(NSDate*)toDate sort:(NSString*)sort minDate:(NSDate*)minDate maxDate:(NSDate*)maxDate min:(NSNumber*)min max:(NSNumber*)max order:(NSString*)order delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -67,6 +67,6 @@ -(StacManResponse*)getByIdsSite:(NSString*)site ids:(NSArray*)ids filter:(NSStri
order ?: @""
];

return [client enqueue:url ofType:@"comment" delegate:del];
return [client enqueue:url ofType:@"comment" delegate:del backoffKey:@"cids"];
}
@end
4 changes: 2 additions & 2 deletions StacMan/StacManErrorMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ -(StacManResponse*)getAllWithFilter:(NSString*)filter page:(int)page pageSize:(i
pageSize
];

return [client enqueue:url ofType:@"error" delegate:del];
return [client enqueue:url ofType:@"error" delegate:del backoffKey:@"ealls"];
}

-(StacManResponse*)simulateWithId:(int)_id filter:(NSString*)filter delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -50,6 +50,6 @@ -(StacManResponse*)simulateWithId:(int)_id filter:(NSString*)filter delegate:(NS
filter ?: @""
];

return [client enqueue:url ofType:@"error" delegate:del];
return [client enqueue:url ofType:@"error" delegate:del backoffKey:@"esimulate"];
}
@end
2 changes: 1 addition & 1 deletion StacMan/StacManEventMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,6 @@ -(StacManResponse*)getRecentOnSite:(NSString*)site accessToken:(NSString*)access
ConvertDate(since) ?: @""
];

return [client enqueue:url ofType:@"event" delegate:del];
return [client enqueue:url ofType:@"event" delegate:del backoffKey:@"events"];
}
@end
5 changes: 3 additions & 2 deletions StacMan/StacManFilterMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//

#import "StacManFilterMethods.h"
#import "Utils.h"

@implementation StacManFilterMethods
__weak StacManClient* client;
Expand Down Expand Up @@ -34,7 +35,7 @@ -(StacManResponse*)readFilters:(NSArray*)filters filter:(NSString*)filter delega
filter ?: @""
];

return [client enqueue:url ofType:@"filter" delegate:del];
return [client enqueue:url ofType:@"filter" delegate:del backoffKey:@"fread"];
}

-(StacManResponse*)createFilterWithIncludes:(NSArray*)includes excludes:(NSArray*)excludes base:(NSString*)base unsafe:(BOOL)unsafe filter:(NSString*)filter delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -52,6 +53,6 @@ -(StacManResponse*)createFilterWithIncludes:(NSArray*)includes excludes:(NSArray
(unsafe ? @"true" : @"false")
];

return [client enqueue:url ofType:@"filter" delegate:del];
return [client enqueue:url ofType:@"filter" delegate:del backoffKey:@"fcreate"];
}
@end
4 changes: 2 additions & 2 deletions StacMan/StacManInboxMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ -(StacManResponse*)getWithAccessToken:(NSString*)accessToken filter:(NSString*)f
pageSize
];

return [client enqueue:url ofType:@"inbox_item" delegate:del];
return [client enqueue:url ofType:@"inbox_item" delegate:del backoffKey:@"iall"];
}

-(StacManResponse*)getUnreadWithAccessToken:(NSString*)accessToken filter:(NSString*)filter page:(int)page pageSize:(int)pageSize since:(NSDate*)since delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -55,6 +55,6 @@ -(StacManResponse*)getUnreadWithAccessToken:(NSString*)accessToken filter:(NSStr
ConvertDate(since) ?: @""
];

return [client enqueue:url ofType:@"inbox_item" delegate:del];
return [client enqueue:url ofType:@"inbox_item" delegate:del backoffKey:@"iunread"];
}
@end
2 changes: 1 addition & 1 deletion StacMan/StacManInfoMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@ -(StacManResponse*)getOnSite:(NSString*)site filter:(NSString*)filter delegate:(
filter ?: @""
];

return [client enqueue:url ofType:@"info" delegate:del];
return [client enqueue:url ofType:@"info" delegate:del backoffKey:@"info"];
}
@end
10 changes: 5 additions & 5 deletions StacMan/StacManPostMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ -(StacManResponse*)getAllOnSite:(NSString*)site filter:(NSString*)filter page:(i
order ?: @""
];

return [client enqueue:url ofType:@"post" delegate:del];
return [client enqueue:url ofType:@"post" delegate:del backoffKey:@"palls"];
}

-(StacManResponse*)getByIdsOnSite:(NSString*)site ids:(NSArray*)ids filter:(NSString*)filter page:(int)page pageSize:(int)pageSize fromDate:(NSDate*)fromDate toDate:(NSDate*)toDate sort:(NSString*)sort minDate:(NSDate*)minDate maxDate:(NSDate*)maxDate min:(NSNumber*)min max:(NSNumber*)max order:(NSString*)order delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -67,7 +67,7 @@ -(StacManResponse*)getByIdsOnSite:(NSString*)site ids:(NSArray*)ids filter:(NSSt
order ?: @""
];

return [client enqueue:url ofType:@"post" delegate:del];
return [client enqueue:url ofType:@"post" delegate:del backoffKey:@"pids"];
}

-(StacManResponse*)getCommentsOnSite:(NSString*)site ids:(NSArray*)ids filter:(NSString*)filter page:(int)page pageSize:(int)pageSize fromDate:(NSDate*)fromDate toDate:(NSDate*)toDate sort:(NSString*)sort minDate:(NSDate*)minDate maxDate:(NSDate*)maxDate min:(NSNumber*)min max:(NSNumber*)max order:(NSString*)order delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -91,7 +91,7 @@ -(StacManResponse*)getCommentsOnSite:(NSString*)site ids:(NSArray*)ids filter:(N
order ?: @""
];

return [client enqueue:url ofType:@"comment" delegate:del];
return [client enqueue:url ofType:@"comment" delegate:del backoffKey:@"pcs"];
}

-(StacManResponse*)getRevisionsOnSite:(NSString*)site ids:(NSArray*)ids filter:(NSString*)filter page:(int)page pageSize:(int)pageSize fromDate:(NSDate*)fromDate toDate:(NSDate*)toDate sort:(NSString*)sort minDate:(NSDate*)minDate maxDate:(NSDate*)maxDate min:(NSNumber*)min max:(NSNumber*)max order:(NSString*)order delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -115,7 +115,7 @@ -(StacManResponse*)getRevisionsOnSite:(NSString*)site ids:(NSArray*)ids filter:(
order ?: @""
];

return [client enqueue:url ofType:@"revision" delegate:del];
return [client enqueue:url ofType:@"revision" delegate:del backoffKey:@"prevs"];
}

-(StacManResponse*)getSuggestedEditsOnSite:(NSString*)site ids:(NSArray*)ids filter:(NSString*)filter page:(int)page pageSize:(int)pageSize fromDate:(NSDate*)fromDate toDate:(NSDate*)toDate sort:(NSString*)sort minDate:(NSDate*)minDate maxDate:(NSDate*)maxDate min:(NSNumber*)min max:(NSNumber*)max order:(NSString*)order delegate:(NSObject<StacManDelegate>*)del
Expand All @@ -139,6 +139,6 @@ -(StacManResponse*)getSuggestedEditsOnSite:(NSString*)site ids:(NSArray*)ids fil
order ?: @""
];

return [client enqueue:url ofType:@"suggested_edit" delegate:del];
return [client enqueue:url ofType:@"suggested_edit" delegate:del backoffKey:@"pses"];
}
@end
2 changes: 1 addition & 1 deletion StacMan/StacManPrivilegeMethods.m
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ -(StacManResponse*)getAllOnSite:(NSString*)site filter:(NSString*)filter page:(i
pageSize
];

return [client enqueue:url ofType:@"privilege" delegate:del];
return [client enqueue:url ofType:@"privilege" delegate:del backoffKey:@"privs"];
}
@end
Loading

0 comments on commit 4598575

Please sign in to comment.