// CopyTablets will create the tablets in the destination topo func CopyTablets(fromTS, toTS topo.Server) { cells, err := fromTS.GetKnownCells() if err != nil { log.Fatalf("fromTS.GetKnownCells failed: %v", err) } wg := sync.WaitGroup{} rec := concurrency.AllErrorRecorder{} for _, cell := range cells { wg.Add(1) go func(cell string) { defer wg.Done() tabletAliases, err := fromTS.GetTabletsByCell(cell) if err != nil { rec.RecordError(err) } else { for _, tabletAlias := range tabletAliases { wg.Add(1) go func(tabletAlias topo.TabletAlias) { defer wg.Done() // read the source tablet ti, err := fromTS.GetTablet(tabletAlias) if err != nil { rec.RecordError(err) return } // try to create the destination err = toTS.CreateTablet(ti.Tablet) if err == topo.ErrNodeExists { // update the destination tablet log.Warningf("tablet %v already exists, updating it", tabletAlias) err = toTS.UpdateTabletFields(ti.Alias(), func(t *topo.Tablet) error { *t = *ti.Tablet return nil }) } if err != nil { rec.RecordError(err) return } // create the replication paths // for masters only here if ti.Type == topo.TYPE_MASTER { if err = toTS.CreateReplicationPath(ti.Keyspace, ti.Shard, ti.Alias().String()); err != nil && err != topo.ErrNodeExists { rec.RecordError(err) } } }(tabletAlias) } } }(cell) } wg.Wait() if rec.HasErrors() { log.Fatalf("copyTablets failed: %v", rec.Error()) } }
func CheckReplicationPaths(t *testing.T, ts topo.Server) { if _, err := ts.GetReplicationPaths("test_keyspace", "-10", "/"); err != topo.ErrNoNode { t.Errorf("GetReplicationPaths(bad shard): %v", err) } if err := ts.CreateKeyspace("test_keyspace"); err != nil { t.Errorf("CreateKeyspace: %v", err) } if err := topo.CreateShard(ts, "test_keyspace", "-10"); err != nil { t.Errorf("CreateShard: %v", err) } if paths, err := ts.GetReplicationPaths("test_keyspace", "-10", "/"); err != nil || len(paths) != 0 { t.Errorf("GetReplicationPaths(empty shard): %v, %v", err, paths) } if _, err := ts.GetReplicationPaths("test_keyspace", "-10", "/666"); err != topo.ErrNoNode { t.Errorf("GetReplicationPaths(non-existing path): %v", err) } if err := ts.CreateReplicationPath("test_keyspace", "-10", "/cell-0000000001"); err != nil { t.Errorf("CreateReplicationPath: %v", err) } if err := ts.CreateReplicationPath("test_keyspace", "-10", "/cell-0000000001"); err != topo.ErrNodeExists { t.Errorf("CreateReplicationPath(again): %v", err) } if paths, err := ts.GetReplicationPaths("test_keyspace", "-10", "/"); err != nil || len(paths) != 1 || paths[0].String() != "cell-0000000001" { t.Errorf("GetReplicationPaths(root): %v, %v", err, paths) } if err := ts.CreateReplicationPath("test_keyspace", "-10", "/cell-0000000001/cell-0000000002"); err != nil { t.Errorf("CreateReplicationPath(2): %v", err) } if err := ts.CreateReplicationPath("test_keyspace", "-10", "/cell-0000000001/cell-0000000003"); err != nil { t.Errorf("CreateReplicationPath(3): %v", err) } if paths, err := ts.GetReplicationPaths("test_keyspace", "-10", "/cell-0000000001"); err != nil || len(paths) != 2 || paths[0].String() != "cell-0000000002" || paths[1].String() != "cell-0000000003" { t.Errorf("GetReplicationPaths(master): %v, %v", err, paths) } if err := ts.DeleteReplicationPath("test_keyspace", "-10", "/cell-0000000001"); err != topo.ErrNotEmpty { t.Errorf("DeleteReplicationPath(master with slaves): %v", err) } if err := ts.DeleteReplicationPath("test_keyspace", "-10", "/cell-0000000001/cell-0000000002"); err != nil { t.Errorf("DeleteReplicationPath(slave1): %v", err) } if paths, err := ts.GetReplicationPaths("test_keyspace", "-10", "/cell-0000000001"); err != nil || len(paths) != 1 || paths[0].String() != "cell-0000000003" { t.Errorf("GetReplicationPaths(master): %v, %v", err, paths) } if err := ts.DeleteReplicationPath("test_keyspace", "-10", "/cell-0000000001/cell-0000000003"); err != nil { t.Errorf("DeleteReplicationPath(slave2): %v", err) } if paths, err := ts.GetReplicationPaths("test_keyspace", "-10", "/cell-0000000001"); err != nil || len(paths) != 0 { t.Errorf("GetReplicationPaths(master): %v, %v", err, paths) } if err := ts.DeleteReplicationPath("test_keyspace", "-10", "/cell-0000000001"); err != nil { t.Errorf("DeleteReplicationPath(master): %v", err) } if paths, err := ts.GetReplicationPaths("test_keyspace", "-10", "/"); err != nil || len(paths) != 0 { t.Errorf("GetReplicationPaths(root): %v, %v", err, paths) } }