MCPcopy
hub / github.com/dgraph-io/dgraph / processWithBackupRequest

Function processWithBackupRequest

worker/task.go:60–118  ·  view source on GitHub ↗

TODO: Cross-server cancellation as described in Jeff Dean's talk.

(
	ctx context.Context,
	gid uint32,
	f func(context.Context, pb.WorkerClient) (interface{}, error))

Source from the content-addressed store, hash-verified

58
59// TODO: Cross-server cancellation as described in Jeff Dean's talk.
60func processWithBackupRequest(
61 ctx context.Context,
62 gid uint32,
63 f func(context.Context, pb.WorkerClient) (interface{}, error)) (interface{}, error) {
64 addrs := groups().AnyTwoServers(gid)
65 if len(addrs) == 0 {
66 return nil, errors.New("No network connection")
67 }
68 if len(addrs) == 1 {
69 reply, err := invokeNetworkRequest(ctx, addrs[0], f)
70 return reply, err
71 }
72 type taskresult struct {
73 reply interface{}
74 err error
75 }
76
77 chResults := make(chan taskresult, len(addrs))
78 ctx0, cancel := context.WithCancel(ctx)
79 defer cancel()
80
81 go func() {
82 reply, err := invokeNetworkRequest(ctx0, addrs[0], f)
83 chResults <- taskresult{reply, err}
84 }()
85
86 timer := time.NewTimer(backupRequestGracePeriod)
87
88 select {
89 case <-ctx.Done():
90 return nil, ctx.Err()
91 case <-timer.C:
92 go func() {
93 reply, err := invokeNetworkRequest(ctx0, addrs[1], f)
94 chResults <- taskresult{reply, err}
95 }()
96 select {
97 case <-ctx.Done():
98 return nil, ctx.Err()
99 case result := <-chResults:
100 if result.err != nil {
101 select {
102 case <-ctx.Done():
103 return nil, ctx.Err()
104 case result := <-chResults:
105 return result.reply, result.err
106 }
107 } else {
108 return result.reply, nil
109 }
110 }
111 case result := <-chResults:
112 if result.err != nil {
113 cancel() // Might as well cleanup resources ASAP
114 return invokeNetworkRequest(ctx, addrs[1], f)
115 }
116 return result.reply, nil
117 }

Callers 2

SortOverNetworkFunction · 0.85
ProcessTaskOverNetworkFunction · 0.85

Calls 4

groupsFunction · 0.85
invokeNetworkRequestFunction · 0.85
AnyTwoServersMethod · 0.80
DoneMethod · 0.45

Tested by

no test coverage detected