|
58 | 58 | errRpnBadEmplace = errors.New("proxy: rpn: emplace: bad args") |
59 | 59 | errRpnBadCC = errors.New("proxy: rpn: bad country code") |
60 | 60 | errRpnIDsMismatch = errors.New("proxy: rpn: provider x proxy mismatch") |
| 61 | + errRpnMainProxyMissing = errors.New("proxy: rpn: cannot fork; main proxy missing") |
61 | 62 | errRpnMainProxyStopped = errors.New("proxy: rpn: cannot fork; main proxy stopped") |
62 | 63 | errRpnNotForked = errors.New("proxy: rpn: not forked") |
63 | 64 | ) |
@@ -304,13 +305,16 @@ func (r *rpnp) Fork(cc string) (x.Proxy, error) { |
304 | 305 | func (r *rpnp) fork(cc string) (x.Proxy, error) { |
305 | 306 | // do not hold lock while calling into pxr as it can callback via Emplace. |
306 | 307 | main, err := r.requireProxy() |
307 | | - if err != nil { |
308 | | - return nil, err |
| 308 | + if err != nil || main == nil { |
| 309 | + return nil, core.OneErr(err, errRpnMainProxyMissing) |
309 | 310 | } |
310 | 311 | acc := r.RpnAcc |
311 | 312 |
|
312 | 313 | mainpid := idstr(main) |
313 | | - if len(mainpid) <= 0 || main.Status() == END { |
| 314 | + if len(mainpid) <= 0 { |
| 315 | + return nil, errMissingProxyID |
| 316 | + } |
| 317 | + if main.Status() == END { |
314 | 318 | // TODO: PurgeAll? |
315 | 319 | return nil, errRpnMainProxyStopped |
316 | 320 | } |
@@ -348,35 +352,41 @@ func (r *rpnp) fork(cc string) (x.Proxy, error) { |
348 | 352 | return kid, err |
349 | 353 | } |
350 | 354 |
|
351 | | -func (r *rpnp) forkMain() { |
| 355 | +func (r *rpnp) forkMain() error { |
352 | 356 | main, err := r.requireProxy() |
353 | | - if err != nil { |
354 | | - return |
| 357 | + if err != nil || main == nil { |
| 358 | + return log.EE("proxy: rpn: forkMain: main missing; err? %v", err) |
355 | 359 | } |
356 | 360 |
|
357 | 361 | mainpid := idstr(main) |
358 | 362 |
|
359 | 363 | _, err = r.fork(mainpid) // re-adds main proxy (via Emplace) |
360 | 364 |
|
361 | 365 | logei(err)("proxy: rpn: forkMain: %s; err? %v", mainpid, err) |
| 366 | + return err |
362 | 367 | } |
363 | 368 |
|
364 | | -func (r *rpnp) forkAll() { |
| 369 | +func (r *rpnp) forkAll() error { |
365 | 370 | provider := r.RpnAcc.ProviderID() |
366 | 371 | kids := r.flattenKids() |
367 | 372 | log.I("proxy: rpn: forkAll: %s[%v]", provider, kids) |
368 | 373 |
|
369 | | - r.forkMain() |
| 374 | + errs := make([]error, 0) // may contain nil errors |
| 375 | + |
| 376 | + e := r.forkMain() |
| 377 | + |
| 378 | + errs = append(errs, e) |
370 | 379 |
|
371 | 380 | for _, cc := range kids { |
372 | | - _, err := r.fork(cc) |
373 | | - loged(err)("proxy: rpn: forkAll: forked %s[%s]; err? %v", provider, cc, err) |
| 381 | + _, e := r.fork(cc) |
| 382 | + loged(e)("proxy: rpn: forkAll: forked %s[%s]; err? %v", provider, cc, e) |
| 383 | + errs = append(errs, e) |
374 | 384 | } |
| 385 | + return core.JoinErr(errs...) |
375 | 386 | } |
376 | 387 |
|
377 | 388 | func (r *rpnp) Redo() (err error) { |
378 | | - r.forkAll() |
379 | | - return nil |
| 389 | + return r.forkAll() |
380 | 390 | } |
381 | 391 |
|
382 | 392 | func (r *rpnp) PingAll() (csvpids string, err error) { |
@@ -540,7 +550,7 @@ func (r *rpnp) flattenKids() (ccs []string) { |
540 | 550 | func (r *rpnp) Update(rotate bool) (newState []byte, err error) { |
541 | 551 | newState, err = r.RpnAcc.Update(rotate) |
542 | 552 | if err == nil { |
543 | | - core.Gx("rpn.fork."+r.ProviderID(), r.forkAll) |
| 553 | + core.Gxe("rpn.fork."+r.ProviderID(), r.forkAll) |
544 | 554 | } |
545 | 555 | return |
546 | 556 | } |
0 commit comments