mongodb world 2016: implementing async networking in mongodb 3.2

50
Implementing Async Networking in MongoDB Samantha Ritter MongoDB Engineer

Upload: mongodb

Post on 13-Apr-2017

430 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Implementing Async Networking in MongoDB

Samantha Ritter MongoDB Engineer

Page 2: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Why?

Page 3: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

mongosapp

shards

Page 4: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

connect auth send recv done

Page 5: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

mongosapp

shards

Page 6: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

connect auth send recv done

Page 7: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Execution engine

Page 8: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Standalone ASIOhttp://think-async.com/

Page 9: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

connect auth send recv done

Page 10: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

{work queue

B: send

B: recv

D: auth

A: send

F: done

Page 11: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

C++11 lambdas

Page 12: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Constructs a closure: an unnamed function object capable of capturing variables in scope.

Page 13: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

auto lambda = [capture list](params) { // body };

lambda(); // runs body

Page 14: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

send

Page 15: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

// the “send” task void send_task(NetworkOp* op) { // pass a lambda to async_send async_send(op->socket, op->command, [op](error_code err) { if (err) { return done(op); } receive_task(op); }); }

Page 16: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

connect

auth

recv

send

done

mongos

Page 17: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Network Errors

Page 18: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

connect

auth

recv

send

done

mongos

XNetworkError!

Page 19: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Network errors are fine: they are on the primary path of execution

Page 20: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

The primary path controlsoperation lifetime

Page 21: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

// the “send” task void send_task(NetworkOp* op) { // pass a lambda to async_send async_send(op->socket, op->command, [op](error_code err) { if (err) { return done(op); } receive_task(op); }); }

Page 22: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

{work queue

B: send

B: recv

D: auth

A: send

F: done

B: recv

XNetworkError!

clean up B

Page 23: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Cancellations

Page 24: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

connect

auth

recv

send

done

mongos

recv !Warning!

cancel job

Page 25: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

// the “send” task void send_task(NetworkOp* op) { // pass a lambda to async_send async_send(op->socket, op->command, [op](error_code err) { if (err) { return done(op); } receive_task(op); }); }

Page 26: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Cancellations are NOT fine: they are on the secondary path of execution

Page 27: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

On the secondary path we can’t make assumptions about lifetime

Page 28: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Only the primary path can end an operation

Rule of ownership:

Page 29: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

// Basic “network operation” class class NetworkOp { bool cancelled; };

// Primary path if (op->cancelled) { done(op); }

// Secondary path cancel(NetworkOp *op) { op->cancelled = true; }

Page 30: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

// the “send” task void send_task(NetworkOp* op) { // pass a lambda to async_send async_send(op->socket, op->command, [op](error_code err) { if (err || op->cancelled) return done(op); receive_task(op); }); }

Page 31: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

connect

auth

recv

send

done

mongos

Please cancel yourself

Ok!

Page 32: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

connect

auth

send

mongos

recvdonePoof!

Please cancel your…

?!@!&?

Page 33: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

// Secondary path cancel(NetworkOp *op) { // op could be a null pointer! op->cancelled = true; }

Page 34: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Operation access is protected

Rule of cooperation:

Page 35: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

// “network operation” class class NetworkOp { bool cancelled; };

// "access control" object class SafeOp { mutex lock; NetworkOp* op; };

Page 36: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

shared_ptr

Page 37: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

// Primary path done(shared_ptr<SafeOp> safe) { // lock before cleanup safe->lock.lock(); // cleanup safe->op = nullptr;

safe->lock.unlock(); }

Page 38: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

// Secondary path cancel(shared_ptr<SafeOp> safe) { // once we lock, can’t change under us safe->lock.lock(); if (safe->op) { safe->op->cancelled = true; } safe->lock.unlock(); }

Page 39: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

connect

auth

send

mongos

recvdonePoof!

Please cancel your…

JK!!

Page 40: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Why?

Page 41: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Threading is better

Page 42: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Engineering Process

Page 43: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

1. Iterate!

Page 44: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

2. Use language features where possible

Page 45: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

3. Use external libraries where appropriate

Page 46: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2
Page 47: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

@SamWhoCodes

Page 48: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

mongodb.com/careers

Page 49: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2

Thanks!

Page 50: MongoDB World 2016: Implementing Async Networking in MongoDB 3.2