// proxyMessages forwards a set of pubsub messages to the endpoint proxy. func (a *application) proxyMessages(ctx context.Context, msgs []*pubsub.Message) error { log.Fields{ "size": len(msgs), }.Debugf(ctx, "Sending messages to Proxy.") // TODO: Batch messages together into larger pushes. // TODO: Validate messages. err := parallel.FanOutIn(func(c chan<- func() error) { for idx, msg := range msgs { msg := msg c <- func() error { ctx := log.SetFields(ctx, log.Fields{ "size": len(msg.Data), "messageID": msg.ID, }) err := a.proxySingleMessage(ctx, msg) // If we hit a transient error, set the message's element to nil, // causing it to not be ACKed. if err != nil { transient := luciErrors.IsTransient(err) log.Fields{ log.ErrorKey: err, "transient": transient, }.Errorf(ctx, "Error when pushing message.") if transient { msgs[idx] = nil } } return err } } }) merr, _ := err.(luciErrors.MultiError) log.Fields{ "errorStatus": err, "count": len(msgs), "errorCount": len(merr), }.Infof(ctx, "Sent messages to endpoint.") return err }
func commitToReal(s *txnBufState) error { toPut, toPutKeys, toDel := s.effect() return parallel.FanOutIn(func(ch chan<- func() error) { if len(toPut) > 0 { ch <- func() error { mErr := errors.NewLazyMultiError(len(toPut)) i := 0 err := s.parentDS.PutMulti(toPutKeys, toPut, func(_ *datastore.Key, err error) error { mErr.Assign(i, err) i++ return nil }) if err == nil { err = mErr.Get() } return err } } if len(toDel) > 0 { ch <- func() error { mErr := errors.NewLazyMultiError(len(toDel)) i := 0 err := s.parentDS.DeleteMulti(toDel, func(err error) error { mErr.Assign(i, err) i++ return nil }) if err == nil { err = mErr.Get() } return err } } }) }