func main() { mongoSession, err := mgo.Dial("127.0.0.1") if err != nil { panic(err) } defer mongoSession.Close() mongoSession.SetMode(mgo.Monotonic, true) log := zap.NewJSON( zap.Debug, zap.Fields(zap.Int("count", 1)), zap.Output(NewWriter(mongoSession)), ) url := "http://example.local" tryNum := 42 startTime := time.Now() for i := range [logCounts]struct{}{} { log.Info("Failed to fetch URL.", zap.String("url", url), zap.Int("attempt", tryNum), zap.Duration("backoff", time.Since(startTime)), zap.Int("index", i), ) } fmt.Printf("Finished in %v\n", time.Since(startTime)) }
func (zom *zookeeperOffsetManager) FinalizePartition(topic string, partition int32, lastOffset int64, timeout time.Duration, replicaId int, logger zap.Logger) error { zom.l.RLock() tracker := zom.offsets[topic][partition] zom.l.RUnlock() if lastOffset >= 0 { if lastOffset-tracker.highestProcessedOffset > 0 { logger.Info("ZOOKEEPER: Finalizing partition. Waiting before processing remaining messages", zap.Int("replicaId", replicaId), zap.String("topic", topic), zap.Int64("partition", int64(partition)), zap.Int64("lastProcessedOffset", tracker.highestProcessedOffset), zap.Duration("waitingTimeToProcessMoreMessages", timeout/time.Second), zap.Int64("numMessagesToProcess", lastOffset-tracker.highestProcessedOffset), ) if !tracker.waitForOffset(lastOffset, timeout) { return fmt.Errorf("REP %d - TIMEOUT waiting for offset %d. Last committed offset: %d", replicaId, lastOffset, tracker.lastCommittedOffset) } } if err := zom.commitOffset(topic, partition, tracker, logger); err != nil { return fmt.Errorf("REP %d - FAILED to commit offset %d to Zookeeper. Last committed offset: %d", replicaId, tracker.highestProcessedOffset, tracker.lastCommittedOffset) } } zom.l.Lock() delete(zom.offsets[topic], partition) zom.l.Unlock() return nil }