pull/2151/head
Siddharth Rakesh 10 years ago
commit f39e7c0a0f
  1. 7
      Makefile
  2. 2
      src/core/surface/call.c
  3. 32
      src/objective-c/GRPCClient/private/GRPCWrappedCall.h
  4. 180
      src/objective-c/GRPCClient/private/GRPCWrappedCall.m
  5. 15
      templates/Makefile.template
  6. 23
      test/core/security/fetch_oauth2.c
  7. 23
      test/core/security/print_google_default_creds_token.c
  8. 16
      test/cpp/qps/report.cc
  9. 24
      test/cpp/qps/report.h
  10. 2
      tools/run_tests/run_tests.py

@ -2397,7 +2397,12 @@ test_python: static_c
$(Q) tools/run_tests/run_tests.py -lpython -c$(CONFIG)
tools: privatelibs $(BINDIR)/$(CONFIG)/gen_hpack_tables $(BINDIR)/$(CONFIG)/grpc_create_jwt $(BINDIR)/$(CONFIG)/grpc_fetch_oauth2 $(BINDIR)/$(CONFIG)/grpc_print_google_default_creds_token
tools: tools_c tools_cxx
tools_c: privatelibs_c $(BINDIR)/$(CONFIG)/gen_hpack_tables $(BINDIR)/$(CONFIG)/grpc_create_jwt $(BINDIR)/$(CONFIG)/grpc_fetch_oauth2 $(BINDIR)/$(CONFIG)/grpc_print_google_default_creds_token
tools_cxx: privatelibs_cxx
buildbenchmarks: privatelibs $(BINDIR)/$(CONFIG)/low_level_ping_pong_benchmark $(BINDIR)/$(CONFIG)/qps_driver $(BINDIR)/$(CONFIG)/qps_worker

@ -405,6 +405,8 @@ void grpc_call_internal_unref(grpc_call *c, int allow_immediate_deletion) {
static void set_status_code(grpc_call *call, status_source source,
gpr_uint32 status) {
if (call->status[source].is_set) return;
call->status[source].is_set = 1;
call->status[source].code = status;

@ -33,53 +33,51 @@
#import <Foundation/Foundation.h>
#include <grpc/grpc.h>
#import "GRPCChannel.h"
typedef void(^GRPCCompletionHandler)(NSDictionary *);
@protocol GRPCOp <NSObject>
- (void)getOp:(grpc_op *)op;
#import "GRPCChannel.h"
@interface GRPCOperation : NSObject
@property(nonatomic, readonly) grpc_op op;
// Guaranteed to be called when the operation has finished.
- (void)finish;
@end
@interface GRPCOpSendMetadata : NSObject <GRPCOp>
@interface GRPCOpSendMetadata : GRPCOperation
- (instancetype)initWithMetadata:(NSDictionary *)metadata
handler:(void(^)(void))handler NS_DESIGNATED_INITIALIZER;
handler:(void(^)())handler NS_DESIGNATED_INITIALIZER;
@end
@interface GRPCOpSendMessage : NSObject <GRPCOp>
@interface GRPCOpSendMessage : GRPCOperation
- (instancetype)initWithMessage:(NSData *)message
handler:(void(^)(void))handler NS_DESIGNATED_INITIALIZER;
handler:(void(^)())handler NS_DESIGNATED_INITIALIZER;
@end
@interface GRPCOpSendClose : NSObject <GRPCOp>
@interface GRPCOpSendClose : GRPCOperation
- (instancetype)initWithHandler:(void(^)(void))handler NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithHandler:(void(^)())handler NS_DESIGNATED_INITIALIZER;
@end
@interface GRPCOpRecvMetadata : NSObject <GRPCOp>
@interface GRPCOpRecvMetadata : GRPCOperation
- (instancetype)initWithHandler:(void(^)(NSDictionary *))handler NS_DESIGNATED_INITIALIZER;
@end
@interface GRPCOpRecvMessage : NSObject <GRPCOp>
@interface GRPCOpRecvMessage : GRPCOperation
- (instancetype)initWithHandler:(void(^)(grpc_byte_buffer *))handler NS_DESIGNATED_INITIALIZER;
@end
@interface GRPCOpRecvStatus : NSObject <GRPCOp>
@interface GRPCOpRecvStatus : GRPCOperation
- (instancetype)initWithHandler:(void(^)(NSError *, NSDictionary *))handler NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithHandler:(void(^)(NSError *, NSDictionary *))handler
NS_DESIGNATED_INITIALIZER;
@end

@ -41,110 +41,85 @@
#import "NSData+GRPC.h"
#import "NSError+GRPC.h"
@implementation GRPCOpSendMetadata{
void(^_handler)(void);
grpc_metadata *_sendMetadata;
size_t _count;
@implementation GRPCOperation {
@protected
// Most operation subclasses don't set any flags in the grpc_op, and rely on the flag member being
// initialized to zero.
grpc_op _op;
void(^_handler)();
}
- (void)finish {
if (_handler) {
_handler();
}
}
@end
@implementation GRPCOpSendMetadata
- (instancetype)init {
return [self initWithMetadata:nil handler:nil];
}
- (instancetype)initWithMetadata:(NSDictionary *)metadata handler:(void (^)(void))handler {
- (instancetype)initWithMetadata:(NSDictionary *)metadata handler:(void (^)())handler {
if (self = [super init]) {
_sendMetadata = [metadata grpc_metadataArray];
_count = metadata.count;
_op.op = GRPC_OP_SEND_INITIAL_METADATA;
_op.data.send_initial_metadata.count = metadata.count;
_op.data.send_initial_metadata.metadata = metadata.grpc_metadataArray;
_handler = handler;
}
return self;
}
- (void)getOp:(grpc_op *)op {
op->op = GRPC_OP_SEND_INITIAL_METADATA;
op->data.send_initial_metadata.count = _count;
op->data.send_initial_metadata.metadata = _sendMetadata;
}
- (void)finish {
if (_handler) {
_handler();
}
}
- (void)dealloc {
gpr_free(_sendMetadata);
gpr_free(_op.data.send_initial_metadata.metadata);
}
@end
@implementation GRPCOpSendMessage{
void(^_handler)(void);
grpc_byte_buffer *_byteBuffer;
}
@implementation GRPCOpSendMessage
- (instancetype)init {
return [self initWithMessage:nil handler:nil];
}
- (instancetype)initWithMessage:(NSData *)message handler:(void (^)(void))handler {
- (instancetype)initWithMessage:(NSData *)message handler:(void (^)())handler {
if (!message) {
[NSException raise:NSInvalidArgumentException format:@"message cannot be nil"];
}
if (self = [super init]) {
_byteBuffer = [message grpc_byteBuffer];
_op.op = GRPC_OP_SEND_MESSAGE;
_op.data.send_message = message.grpc_byteBuffer;
_handler = handler;
}
return self;
}
- (void)getOp:(grpc_op *)op {
op->op = GRPC_OP_SEND_MESSAGE;
op->data.send_message = _byteBuffer;
}
- (void)finish {
if (_handler) {
_handler();
}
}
- (void)dealloc {
gpr_free(_byteBuffer);
gpr_free(_op.data.send_message);
}
@end
@implementation GRPCOpSendClose{
void(^_handler)(void);
}
@implementation GRPCOpSendClose
- (instancetype)init {
return [self initWithHandler:nil];
}
- (instancetype)initWithHandler:(void (^)(void))handler {
- (instancetype)initWithHandler:(void (^)())handler {
if (self = [super init]) {
_op.op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
_handler = handler;
}
return self;
}
- (void)getOp:(grpc_op *)op {
op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
}
- (void)finish {
if (_handler) {
_handler();
}
}
@end
@implementation GRPCOpRecvMetadata{
void(^_handler)(NSDictionary *);
grpc_metadata_array _recvInitialMetadata;
@implementation GRPCOpRecvMetadata {
grpc_metadata_array _headers;
}
- (instancetype) init {
@ -153,33 +128,27 @@
- (instancetype) initWithHandler:(void (^)(NSDictionary *))handler {
if (self = [super init]) {
_handler = handler;
grpc_metadata_array_init(&_recvInitialMetadata);
_op.op = GRPC_OP_RECV_INITIAL_METADATA;
grpc_metadata_array_init(&_headers);
_op.data.recv_initial_metadata = &_headers;
if (handler) {
_handler = ^{
NSDictionary *metadata = [NSDictionary grpc_dictionaryFromMetadataArray:_headers];
handler(metadata);
};
}
}
return self;
}
- (void)getOp:(grpc_op *)op {
op->op = GRPC_OP_RECV_INITIAL_METADATA;
op->data.recv_initial_metadata = &_recvInitialMetadata;
}
- (void)finish {
NSDictionary *metadata = [NSDictionary grpc_dictionaryFromMetadataArray:_recvInitialMetadata];
if (_handler) {
_handler(metadata);
}
}
- (void)dealloc {
grpc_metadata_array_destroy(&_recvInitialMetadata);
grpc_metadata_array_destroy(&_headers);
}
@end
@implementation GRPCOpRecvMessage{
void(^_handler)(grpc_byte_buffer *);
grpc_byte_buffer *_recvMessage;
grpc_byte_buffer *_receivedMessage;
}
- (instancetype)init {
@ -188,30 +157,24 @@
- (instancetype)initWithHandler:(void (^)(grpc_byte_buffer *))handler {
if (self = [super init]) {
_handler = handler;
_op.op = GRPC_OP_RECV_MESSAGE;
_op.data.recv_message = &_receivedMessage;
if (handler) {
_handler = ^{
handler(_receivedMessage);
};
}
}
return self;
}
- (void)getOp:(grpc_op *)op {
op->op = GRPC_OP_RECV_MESSAGE;
op->data.recv_message = &_recvMessage;
}
- (void)finish {
if (_handler) {
_handler(_recvMessage);
}
}
@end
@implementation GRPCOpRecvStatus{
void(^_handler)(NSError *, NSDictionary *);
grpc_status_code _statusCode;
char *_details;
size_t _detailsCapacity;
grpc_metadata_array _metadata;
grpc_metadata_array _trailers;
}
- (instancetype) init {
@ -220,30 +183,25 @@
- (instancetype) initWithHandler:(void (^)(NSError *, NSDictionary *))handler {
if (self = [super init]) {
_handler = handler;
grpc_metadata_array_init(&_metadata);
_op.op = GRPC_OP_RECV_STATUS_ON_CLIENT;
_op.data.recv_status_on_client.status = &_statusCode;
_op.data.recv_status_on_client.status_details = &_details;
_op.data.recv_status_on_client.status_details_capacity = &_detailsCapacity;
grpc_metadata_array_init(&_trailers);
_op.data.recv_status_on_client.trailing_metadata = &_trailers;
if (handler) {
_handler = ^{
NSError *error = [NSError grpc_errorFromStatusCode:_statusCode details:_details];
NSDictionary *trailers = [NSDictionary grpc_dictionaryFromMetadataArray:_trailers];
handler(error, trailers);
};
}
}
return self;
}
- (void)getOp:(grpc_op *)op {
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
op->data.recv_status_on_client.status = &_statusCode;
op->data.recv_status_on_client.status_details = &_details;
op->data.recv_status_on_client.status_details_capacity = &_detailsCapacity;
op->data.recv_status_on_client.trailing_metadata = &_metadata;
}
- (void)finish {
if (_handler) {
NSError *error = [NSError grpc_errorFromStatusCode:_statusCode details:_details];
NSDictionary *trailers = [NSDictionary grpc_dictionaryFromMetadataArray:_metadata];
_handler(error, trailers);
}
}
- (void)dealloc {
grpc_metadata_array_destroy(&_metadata);
grpc_metadata_array_destroy(&_trailers);
gpr_free(_details);
}
@ -293,8 +251,8 @@
size_t nops = operations.count;
grpc_op *ops_array = gpr_malloc(nops * sizeof(grpc_op));
size_t i = 0;
for (id op in operations) {
[op getOp:&ops_array[i++]];
for (GRPCOperation *operation in operations) {
ops_array[i++] = operation.op;
}
grpc_call_error error = grpc_call_start_batch(_call, ops_array, nops,
(__bridge_retained void *)(^(bool success){
@ -305,14 +263,16 @@
return;
}
}
for (id<GRPCOp> operation in operations) {
for (GRPCOperation *operation in operations) {
[operation finish];
}
}));
gpr_free(ops_array);
if (error != GRPC_CALL_OK) {
[NSException raise:NSInternalInconsistencyException
format:@"A precondition for calling grpc_call_start_batch wasn't met"];
format:@"A precondition for calling grpc_call_start_batch wasn't met. Error %i",
error];
}
}

@ -812,9 +812,20 @@ test_python: static_c
$(Q) tools/run_tests/run_tests.py -lpython -c$(CONFIG)
tools: privatelibs\
tools: tools_c tools_cxx
tools_c: privatelibs_c\
% for tgt in targets:
% if tgt.build == 'tool' and not tgt.language=='c++':
$(BINDIR)/$(CONFIG)/${tgt.name}\
% endif
% endfor
tools_cxx: privatelibs_cxx\
% for tgt in targets:
% if tgt.build == 'tool':
% if tgt.build == 'tool' and tgt.language=='c++':
$(BINDIR)/$(CONFIG)/${tgt.name}\
% endif
% endfor

@ -46,8 +46,7 @@
#include "src/core/support/file.h"
typedef struct {
gpr_cv cv;
gpr_mu mu;
grpc_pollset pollset;
int is_done;
} synchronizer;
@ -69,10 +68,10 @@ static void on_oauth2_response(void *user_data,
printf("Got token: %s.\n", token);
gpr_free(token);
}
gpr_mu_lock(&sync->mu);
gpr_mu_lock(GRPC_POLLSET_MU(&sync->pollset));
sync->is_done = 1;
gpr_mu_unlock(&sync->mu);
gpr_cv_signal(&sync->cv);
grpc_pollset_kick(&sync->pollset);
gpr_mu_unlock(GRPC_POLLSET_MU(&sync->pollset));
}
static grpc_credentials *create_service_account_creds(
@ -176,18 +175,16 @@ int main(int argc, char **argv) {
}
GPR_ASSERT(creds != NULL);
gpr_mu_init(&sync.mu);
gpr_cv_init(&sync.cv);
grpc_pollset_init(&sync.pollset);
sync.is_done = 0;
grpc_credentials_get_request_metadata(creds, "", on_oauth2_response, &sync);
grpc_credentials_get_request_metadata(creds, &sync.pollset, "", on_oauth2_response, &sync);
gpr_mu_lock(&sync.mu);
while (!sync.is_done) gpr_cv_wait(&sync.cv, &sync.mu, gpr_inf_future);
gpr_mu_unlock(&sync.mu);
gpr_mu_lock(GRPC_POLLSET_MU(&sync.pollset));
while (!sync.is_done) grpc_pollset_work(&sync.pollset, gpr_inf_future);
gpr_mu_unlock(GRPC_POLLSET_MU(&sync.pollset));
gpr_mu_destroy(&sync.mu);
gpr_cv_destroy(&sync.cv);
grpc_pollset_destroy(&sync.pollset);
grpc_credentials_release(creds);
gpr_cmdline_destroy(cl);
grpc_shutdown();

@ -44,8 +44,7 @@
#include <grpc/support/sync.h>
typedef struct {
gpr_cv cv;
gpr_mu mu;
grpc_pollset pollset;
int is_done;
} synchronizer;
@ -61,10 +60,10 @@ static void on_metadata_response(void *user_data,
printf("\nGot token: %s\n\n",
(const char *)GPR_SLICE_START_PTR(md_elems[0].value));
}
gpr_mu_lock(&sync->mu);
gpr_mu_lock(GRPC_POLLSET_MU(&sync->pollset));
sync->is_done = 1;
gpr_mu_unlock(&sync->mu);
gpr_cv_signal(&sync->cv);
grpc_pollset_kick(&sync->pollset);
gpr_mu_unlock(GRPC_POLLSET_MU(&sync->pollset));
}
int main(int argc, char **argv) {
@ -86,18 +85,16 @@ int main(int argc, char **argv) {
goto end;
}
gpr_mu_init(&sync.mu);
gpr_cv_init(&sync.cv);
grpc_pollset_init(&sync.pollset);
sync.is_done = 0;
grpc_credentials_get_request_metadata(creds, "", on_metadata_response, &sync);
grpc_credentials_get_request_metadata(creds, &sync.pollset, "", on_metadata_response, &sync);
gpr_mu_lock(&sync.mu);
while (!sync.is_done) gpr_cv_wait(&sync.cv, &sync.mu, gpr_inf_future);
gpr_mu_unlock(&sync.mu);
gpr_mu_lock(GRPC_POLLSET_MU(&sync.pollset));
while (!sync.is_done) grpc_pollset_work(&sync.pollset, gpr_inf_future);
gpr_mu_unlock(GRPC_POLLSET_MU(&sync.pollset));
gpr_mu_destroy(&sync.mu);
gpr_cv_destroy(&sync.cv);
grpc_pollset_destroy(&sync.pollset);
grpc_credentials_release(creds);
end:

@ -43,39 +43,39 @@ void CompositeReporter::add(std::unique_ptr<Reporter> reporter) {
reporters_.emplace_back(std::move(reporter));
}
void CompositeReporter::ReportQPS(const ScenarioResult& result) const {
void CompositeReporter::ReportQPS(const ScenarioResult& result) {
for (size_t i = 0; i < reporters_.size(); ++i) {
reporters_[i]->ReportQPS(result);
}
}
void CompositeReporter::ReportQPSPerCore(const ScenarioResult& result) const {
void CompositeReporter::ReportQPSPerCore(const ScenarioResult& result) {
for (size_t i = 0; i < reporters_.size(); ++i) {
reporters_[i]->ReportQPSPerCore(result);
}
}
void CompositeReporter::ReportLatency(const ScenarioResult& result) const {
void CompositeReporter::ReportLatency(const ScenarioResult& result) {
for (size_t i = 0; i < reporters_.size(); ++i) {
reporters_[i]->ReportLatency(result);
}
}
void CompositeReporter::ReportTimes(const ScenarioResult& result) const {
void CompositeReporter::ReportTimes(const ScenarioResult& result) {
for (size_t i = 0; i < reporters_.size(); ++i) {
reporters_[i]->ReportTimes(result);
}
}
void GprLogReporter::ReportQPS(const ScenarioResult& result) const {
void GprLogReporter::ReportQPS(const ScenarioResult& result) {
gpr_log(GPR_INFO, "QPS: %.1f",
result.latencies.Count() /
average(result.client_resources,
[](ResourceUsage u) { return u.wall_time; }));
}
void GprLogReporter::ReportQPSPerCore(const ScenarioResult& result) const {
void GprLogReporter::ReportQPSPerCore(const ScenarioResult& result) {
auto qps =
result.latencies.Count() /
average(result.client_resources,
@ -85,7 +85,7 @@ void GprLogReporter::ReportQPSPerCore(const ScenarioResult& result) const {
qps / result.server_config.threads());
}
void GprLogReporter::ReportLatency(const ScenarioResult& result) const {
void GprLogReporter::ReportLatency(const ScenarioResult& result) {
gpr_log(GPR_INFO,
"Latencies (50/90/95/99/99.9%%-ile): %.1f/%.1f/%.1f/%.1f/%.1f us",
result.latencies.Percentile(50) / 1000,
@ -95,7 +95,7 @@ void GprLogReporter::ReportLatency(const ScenarioResult& result) const {
result.latencies.Percentile(99.9) / 1000);
}
void GprLogReporter::ReportTimes(const ScenarioResult& result) const {
void GprLogReporter::ReportTimes(const ScenarioResult& result) {
gpr_log(GPR_INFO, "Server system time: %.2f%%",
100.0 * sum(result.server_resources,
[](ResourceUsage u) { return u.system_time; }) /

@ -60,16 +60,16 @@ class Reporter {
string name() const { return name_; }
/** Reports QPS for the given \a result. */
virtual void ReportQPS(const ScenarioResult& result) const = 0;
virtual void ReportQPS(const ScenarioResult& result) = 0;
/** Reports QPS per core as (YYY/server core). */
virtual void ReportQPSPerCore(const ScenarioResult& result) const = 0;
virtual void ReportQPSPerCore(const ScenarioResult& result) = 0;
/** Reports latencies for the 50, 90, 95, 99 and 99.9 percentiles, in ms. */
virtual void ReportLatency(const ScenarioResult& result) const = 0;
virtual void ReportLatency(const ScenarioResult& result) = 0;
/** Reports system and user time for client and server systems. */
virtual void ReportTimes(const ScenarioResult& result) const = 0;
virtual void ReportTimes(const ScenarioResult& result) = 0;
private:
const string name_;
@ -83,10 +83,10 @@ class CompositeReporter : public Reporter {
/** Adds a \a reporter to the composite. */
void add(std::unique_ptr<Reporter> reporter);
void ReportQPS(const ScenarioResult& result) const GRPC_OVERRIDE;
void ReportQPSPerCore(const ScenarioResult& result) const GRPC_OVERRIDE;
void ReportLatency(const ScenarioResult& result) const GRPC_OVERRIDE;
void ReportTimes(const ScenarioResult& result) const GRPC_OVERRIDE;
void ReportQPS(const ScenarioResult& result) GRPC_OVERRIDE;
void ReportQPSPerCore(const ScenarioResult& result) GRPC_OVERRIDE;
void ReportLatency(const ScenarioResult& result) GRPC_OVERRIDE;
void ReportTimes(const ScenarioResult& result) GRPC_OVERRIDE;
private:
std::vector<std::unique_ptr<Reporter> > reporters_;
@ -98,10 +98,10 @@ class GprLogReporter : public Reporter {
GprLogReporter(const string& name) : Reporter(name) {}
private:
void ReportQPS(const ScenarioResult& result) const GRPC_OVERRIDE;
void ReportQPSPerCore(const ScenarioResult& result) const GRPC_OVERRIDE;
void ReportLatency(const ScenarioResult& result) const GRPC_OVERRIDE;
void ReportTimes(const ScenarioResult& result) const GRPC_OVERRIDE;
void ReportQPS(const ScenarioResult& result) GRPC_OVERRIDE;
void ReportQPSPerCore(const ScenarioResult& result) GRPC_OVERRIDE;
void ReportLatency(const ScenarioResult& result) GRPC_OVERRIDE;
void ReportTimes(const ScenarioResult& result) GRPC_OVERRIDE;
};
/** Reporter for performance database tool */

@ -133,7 +133,7 @@ class CLanguage(object):
return sorted(out)
def make_targets(self):
return ['buildtests_%s' % self.make_target]
return ['buildtests_%s' % self.make_target, 'tools_%s' % self.make_target]
def build_steps(self):
return []

Loading…
Cancel
Save