Ejemplo n.º 1
0
// Test
func main() {
	flag.Parse()

	if *version {
		fmt.Println(oplog.VERSION)
		return
	}

	if *debug {
		log.SetLevel(log.DebugLevel)
	}

	log.Infof("Starting oplog %s", oplog.VERSION)

	ol, err := oplog.New(*mongoURL, *cappedCollectionSize)
	if err != nil {
		log.Fatal(err)
	}
	ol.ObjectURL = *objectURL

	log.Infof("Listening on %s (UDP/TCP)", *listenAddr)

	udpd := oplog.NewUDPDaemon(*listenAddr, ol)
	go func() {
		log.Fatal(udpd.Run(*maxQueuedEvents))
	}()

	ssed := oplog.NewSSEDaemon(*listenAddr, ol)
	ssed.Password = *password
	log.Fatal(ssed.Run())
}
Ejemplo n.º 2
0
func ExampleOpLog_Append() {
	ol, err := oplog.New("mongodb://localhost/oplog", 1048576)
	if err != nil {
		log.Fatal(err)
	}
	op := oplog.NewOperation("insert", time.Now(), "123", "user", nil)
	ol.Append(op)
}
Ejemplo n.º 3
0
func ExampleOpLog_Ingest() {
	ol, err := oplog.New("mongodb://localhost/oplog", 1048576)
	if err != nil {
		log.Fatal(err)
	}
	ops := make(chan *oplog.Operation)
	done := make(chan bool, 1)
	go ol.Ingest(ops, nil)
	// Insert a large number of operations
	for i := 0; i < 1000; i++ {
		ops <- oplog.NewOperation("insert", time.Now(), strconv.FormatInt(int64(i), 10), "user", nil)
	}
	done <- true
}
Ejemplo n.º 4
0
func ExampleOpLog_Tail() {
	ol, err := oplog.New("mongodb://localhost/oplog", 1048576)
	if err != nil {
		log.Fatal(err)
	}
	ops := make(chan oplog.GenericEvent)
	stop := make(chan bool)
	// Tail all future events with no filters
	go ol.Tail(nil, oplog.Filter{}, ops, stop)
	// Read 100 events
	for i := 0; i < 100; i++ {
		op := <-ops
		op.WriteTo(os.Stdout)
	}
	// Stop the tail
	stop <- true
}
Ejemplo n.º 5
0
func main() {
	flag.Usage = func() {
		fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
		flag.PrintDefaults()
		fmt.Print("  <dump file>\n")
	}
	flag.Parse()
	if flag.NArg() != 1 {
		flag.Usage()
		os.Exit(2)
	}
	file := flag.Arg(0)

	if *debug {
		log.SetLevel(log.DebugLevel)
	}

	ol, err := oplog.New(*mongoURL, *cappedCollectionSize)
	if err != nil {
		log.Fatal(err)
	}

	createMap := make(oplog.OperationDataMap)
	updateMap := make(oplog.OperationDataMap)
	deleteMap := make(oplog.OperationDataMap)

	var fh *os.File
	if file == "-" {
		fh = os.Stdin
	} else {
		fh, err = os.Open(file)
		if err != nil {
			log.Fatalf("SYNC cannot open dump file: %s", err)
		}
		defer fh.Close()
	}

	log.Debugf("SYNC loading dump")
	obd := oplog.OperationData{}
	scanner := bufio.NewScanner(fh)
	line := 0
	for scanner.Scan() {
		line++
		if err := json.Unmarshal(scanner.Bytes(), &obd); err != nil {
			log.Fatalf("SYNC dump unmarshaling error at line %d: %s", line, err)
		}
		if err := obd.Validate(); err != nil {
			log.Fatalf("SYNC invalid operation at line %d: %s", line, err)
		}
		createMap[obd.GetId()] = obd
	}
	if err := scanner.Err(); err != nil {
		log.Fatalf("SYNC dump reading error: %s", err)
	}

	total := len(createMap)

	// Scan the oplog db and generate the diff
	log.Debugf("SYNC generating the diff")
	if err := ol.Diff(createMap, updateMap, deleteMap); err != nil {
		log.Fatalf("SYNC diff error: %s", err)
	}

	totalCreate := len(createMap)
	totalUpdate := len(updateMap)
	totalDelete := len(deleteMap)
	log.Infof("SYNC create: %d, update: %d, delete: %d, untouched: %d",
		totalCreate, totalUpdate, totalDelete, total-totalCreate-totalDelete-totalDelete)

	if *dryRun {
		return
	}

	// Generate events to fix the delta
	log.Debugf("SYNC sending the delta events")
	db := ol.DB()
	defer db.Session.Close()
	op := &oplog.Operation{Event: "create"}
	genEvents := func(opMap oplog.OperationDataMap) {
		for _, obd := range opMap {
			op.Data = &obd
			ol.Append(op, db)
		}
	}
	log.Debugf("SYNC generating %d create events", totalCreate)
	genEvents(createMap)
	log.Debugf("SYNC generating %d update events", totalUpdate)
	op.Event = "update"
	genEvents(updateMap)
	log.Debugf("SYNC generating %d delete events", totalDelete)
	op.Event = "delete"
	genEvents(deleteMap)

	log.Debugf("SYNC done")
}