Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 1 | package rt |
| 2 | |
| 3 | import ( |
Asim Shankar | 6a65d28 | 2014-06-26 12:12:50 -0700 | [diff] [blame] | 4 | "fmt" |
Cosmos Nicolaou | 9388ae4 | 2014-11-10 10:57:15 -0800 | [diff] [blame] | 5 | "time" |
Asim Shankar | 6a65d28 | 2014-06-26 12:12:50 -0700 | [diff] [blame] | 6 | |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 7 | iipc "v.io/core/veyron/runtimes/google/ipc" |
| 8 | imanager "v.io/core/veyron/runtimes/google/ipc/stream/manager" |
| 9 | "v.io/core/veyron/runtimes/google/ipc/stream/vc" |
| 10 | ivtrace "v.io/core/veyron/runtimes/google/vtrace" |
Cosmos Nicolaou | 416ca97 | 2014-05-28 22:03:06 -0700 | [diff] [blame] | 11 | |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 12 | "v.io/core/veyron2/context" |
| 13 | "v.io/core/veyron2/i18n" |
| 14 | "v.io/core/veyron2/ipc" |
| 15 | "v.io/core/veyron2/ipc/stream" |
| 16 | "v.io/core/veyron2/naming" |
| 17 | "v.io/core/veyron2/options" |
| 18 | "v.io/core/veyron2/verror2" |
| 19 | "v.io/core/veyron2/vtrace" |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 20 | ) |
| 21 | |
| 22 | func (rt *vrt) NewClient(opts ...ipc.ClientOpt) (ipc.Client, error) { |
Bogdan Caprita | fbcfe89 | 2014-09-30 16:50:45 -0700 | [diff] [blame] | 23 | rt.mu.Lock() |
| 24 | sm := rt.sm[0] |
| 25 | rt.mu.Unlock() |
Cosmos Nicolaou | 4e02997 | 2014-06-13 14:53:08 -0700 | [diff] [blame] | 26 | ns := rt.ns |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 27 | var otherOpts []ipc.ClientOpt |
| 28 | for _, opt := range opts { |
| 29 | switch topt := opt.(type) { |
Asim Shankar | cc04421 | 2014-10-15 23:25:26 -0700 | [diff] [blame] | 30 | case options.StreamManager: |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 31 | sm = topt.Manager |
Asim Shankar | cc04421 | 2014-10-15 23:25:26 -0700 | [diff] [blame] | 32 | case options.Namespace: |
Cosmos Nicolaou | 4e02997 | 2014-06-13 14:53:08 -0700 | [diff] [blame] | 33 | ns = topt.Namespace |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 34 | default: |
| 35 | otherOpts = append(otherOpts, opt) |
| 36 | } |
| 37 | } |
Cosmos Nicolaou | 4e8da64 | 2014-11-13 08:32:05 -0800 | [diff] [blame] | 38 | otherOpts = append(otherOpts, vc.LocalPrincipal{rt.principal}, &imanager.DialTimeout{5 * time.Minute}, rt.preferredProtocols) |
Suharsh Sivakumar | 1b6683e | 2014-12-30 13:00:38 -0800 | [diff] [blame] | 39 | return iipc.InternalNewClient(sm, ns, otherOpts...) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 40 | } |
| 41 | |
| 42 | func (rt *vrt) Client() ipc.Client { |
| 43 | return rt.client |
| 44 | } |
| 45 | |
Matt Rosencrantz | 4f8ac60 | 2014-12-29 14:42:48 -0800 | [diff] [blame] | 46 | func (rt *vrt) NewContext() *context.T { |
Matt Rosencrantz | 3395b4e | 2015-01-13 09:41:18 -0800 | [diff] [blame] | 47 | var ctx *context.T |
Mike Burrows | 110e22f | 2014-10-10 10:23:37 -0700 | [diff] [blame] | 48 | ctx = i18n.ContextWithLangID(ctx, rt.lang) |
| 49 | ctx = verror2.ContextWithComponentName(ctx, rt.program) |
Matt Rosencrantz | 5f98d94 | 2015-01-08 13:48:30 -0800 | [diff] [blame] | 50 | ctx = ivtrace.DeprecatedInit(ctx, rt.traceStore) |
| 51 | ctx, _ = vtrace.SetNewTrace(ctx) |
Matt Rosencrantz | 5845bf1 | 2015-01-06 13:05:21 -0800 | [diff] [blame] | 52 | return rt.initRuntimeXContext(ctx) |
Matt Rosencrantz | 9fe6082 | 2014-09-12 10:09:53 -0700 | [diff] [blame] | 53 | } |
| 54 | |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 55 | func (rt *vrt) NewServer(opts ...ipc.ServerOpt) (ipc.Server, error) { |
Asim Shankar | 6a65d28 | 2014-06-26 12:12:50 -0700 | [diff] [blame] | 56 | rt.mu.Lock() |
Bogdan Caprita | fbcfe89 | 2014-09-30 16:50:45 -0700 | [diff] [blame] | 57 | // Create a new RoutingID (and StreamManager) for each server, except |
| 58 | // the first one. The reasoning is for the first server to share the |
| 59 | // RoutingID (and StreamManager) with Clients. |
| 60 | // |
| 61 | // TODO(ashankar/caprita): special-casing the first server is ugly, and |
| 62 | // has diminished practical benefits since the first server in practice |
| 63 | // is the app cycle manager server. If the goal of sharing connections |
| 64 | // between Clients and Servers in the same Runtime is still important, |
| 65 | // we need to think of other ways to achieve it. |
| 66 | sm := rt.sm[0] |
Asim Shankar | 6a65d28 | 2014-06-26 12:12:50 -0700 | [diff] [blame] | 67 | rt.nServers++ |
Bogdan Caprita | fbcfe89 | 2014-09-30 16:50:45 -0700 | [diff] [blame] | 68 | nServers := rt.nServers |
Asim Shankar | 6a65d28 | 2014-06-26 12:12:50 -0700 | [diff] [blame] | 69 | rt.mu.Unlock() |
Bogdan Caprita | fbcfe89 | 2014-09-30 16:50:45 -0700 | [diff] [blame] | 70 | if nServers > 1 { |
| 71 | var err error |
| 72 | sm, err = rt.NewStreamManager() |
| 73 | if err != nil { |
| 74 | return nil, fmt.Errorf("failed to create ipc/stream/Manager: %v", err) |
| 75 | } |
Asim Shankar | 6a65d28 | 2014-06-26 12:12:50 -0700 | [diff] [blame] | 76 | } |
Cosmos Nicolaou | 4e02997 | 2014-06-13 14:53:08 -0700 | [diff] [blame] | 77 | ns := rt.ns |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 78 | var otherOpts []ipc.ServerOpt |
| 79 | for _, opt := range opts { |
| 80 | switch topt := opt.(type) { |
Asim Shankar | cc04421 | 2014-10-15 23:25:26 -0700 | [diff] [blame] | 81 | case options.Namespace: |
Cosmos Nicolaou | 4e02997 | 2014-06-13 14:53:08 -0700 | [diff] [blame] | 82 | ns = topt |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 83 | default: |
| 84 | otherOpts = append(otherOpts, opt) |
| 85 | } |
| 86 | } |
Asim Shankar | 220a015 | 2014-10-30 21:21:09 -0700 | [diff] [blame] | 87 | // Add the option that provides the principal to the server. |
| 88 | otherOpts = append(otherOpts, vc.LocalPrincipal{rt.principal}) |
Cosmos Nicolaou | 8246a8b | 2014-11-01 09:32:36 -0700 | [diff] [blame] | 89 | if rt.reservedDisp != nil { |
Cosmos Nicolaou | 6413c99 | 2014-11-06 11:00:54 -0800 | [diff] [blame] | 90 | ropts := options.ReservedNameDispatcher{rt.reservedDisp} |
Cosmos Nicolaou | 8246a8b | 2014-11-01 09:32:36 -0700 | [diff] [blame] | 91 | otherOpts = append(otherOpts, ropts) |
| 92 | otherOpts = append(otherOpts, rt.reservedOpts...) |
| 93 | } |
Ankur | e49a86a | 2014-11-11 18:52:43 -0800 | [diff] [blame] | 94 | |
Nicolas LaCasse | 55a10f3 | 2014-11-26 13:25:53 -0800 | [diff] [blame] | 95 | // Add the preferred protocols from the runtime if there are any. |
| 96 | if len(rt.preferredProtocols) > 0 { |
| 97 | otherOpts = append(otherOpts, iipc.PreferredServerResolveProtocols(rt.preferredProtocols)) |
| 98 | } |
Asim Shankar | f4864f4 | 2014-11-25 18:53:05 -0800 | [diff] [blame] | 99 | ctx := rt.NewContext() |
Matt Rosencrantz | 5f98d94 | 2015-01-08 13:48:30 -0800 | [diff] [blame] | 100 | return iipc.InternalNewServer(ctx, sm, ns, otherOpts...) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | func (rt *vrt) NewStreamManager(opts ...stream.ManagerOpt) (stream.Manager, error) { |
| 104 | rid, err := naming.NewRoutingID() |
| 105 | if err != nil { |
| 106 | return nil, err |
| 107 | } |
Asim Shankar | 6a65d28 | 2014-06-26 12:12:50 -0700 | [diff] [blame] | 108 | sm := imanager.InternalNew(rid) |
Bogdan Caprita | fbcfe89 | 2014-09-30 16:50:45 -0700 | [diff] [blame] | 109 | rt.mu.Lock() |
| 110 | defer rt.mu.Unlock() |
| 111 | if rt.cleaningUp { |
| 112 | sm.Shutdown() // For whatever it's worth. |
Bogdan Caprita | fbcfe89 | 2014-09-30 16:50:45 -0700 | [diff] [blame] | 113 | return nil, errCleaningUp |
| 114 | } |
| 115 | rt.sm = append(rt.sm, sm) |
Asim Shankar | 6a65d28 | 2014-06-26 12:12:50 -0700 | [diff] [blame] | 116 | return sm, nil |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 117 | } |