func interactiveSplitDiff(wr *wrangler.Wrangler, w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { httpError(w, "cannot parse form: %s", err) return } keyspace := r.FormValue("keyspace") shard := r.FormValue("shard") if keyspace == "" || shard == "" { // display the list of possible shards to chose from result := make(map[string]interface{}) shards, err := shardsWithSources(wr) if err != nil { result["Error"] = err.Error() } else { result["Shards"] = shards } executeTemplate(w, splitDiffTemplate, result) return } // start the diff job wrk := worker.NewSplitDiffWorker(wr, *cell, keyspace, shard) if _, err := setAndStartWorker(wrk); err != nil { httpError(w, "cannot set worker: %s", err) return } http.Redirect(w, r, servenv.StatusURLPath(), http.StatusTemporaryRedirect) }
func interactiveSplitClone(wr *wrangler.Wrangler, w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { httpError(w, "cannot parse form: %s", err) return } keyspace := r.FormValue("keyspace") shard := r.FormValue("shard") if keyspace == "" || shard == "" { // display the list of possible splits to choose from // (just find all the overlapping guys) result := make(map[string]interface{}) choices, err := keyspacesWithOverlappingShards(wr) if err != nil { result["Error"] = err.Error() } else { result["Choices"] = choices } executeTemplate(w, splitCloneTemplate, result) return } sourceReaderCountStr := r.FormValue("sourceReaderCount") if sourceReaderCountStr == "" { // display the input form result := make(map[string]interface{}) result["Keyspace"] = keyspace result["Shard"] = shard result["DefaultSourceReaderCount"] = fmt.Sprintf("%v", defaultSourceReaderCount) result["DefaultDestinationPackCount"] = fmt.Sprintf("%v", defaultDestinationPackCount) result["DefaultMinTableSizeForSplit"] = fmt.Sprintf("%v", defaultMinTableSizeForSplit) result["DefaultDestinationWriterCount"] = fmt.Sprintf("%v", defaultDestinationWriterCount) executeTemplate(w, splitCloneTemplate2, result) return } // get other parameters destinationPackCountStr := r.FormValue("destinationPackCount") excludeTables := r.FormValue("excludeTables") excludeTableArray := strings.Split(excludeTables, ",") strategy := r.FormValue("strategy") sourceReaderCount, err := strconv.ParseInt(sourceReaderCountStr, 0, 64) if err != nil { httpError(w, "cannot parse sourceReaderCount: %s", err) return } destinationPackCount, err := strconv.ParseInt(destinationPackCountStr, 0, 64) if err != nil { httpError(w, "cannot parse destinationPackCount: %s", err) return } minTableSizeForSplitStr := r.FormValue("minTableSizeForSplit") minTableSizeForSplit, err := strconv.ParseInt(minTableSizeForSplitStr, 0, 64) if err != nil { httpError(w, "cannot parse minTableSizeForSplit: %s", err) return } destinationWriterCountStr := r.FormValue("destinationWriterCount") destinationWriterCount, err := strconv.ParseInt(destinationWriterCountStr, 0, 64) if err != nil { httpError(w, "cannot parse destinationWriterCount: %s", err) return } // start the clone job wrk, err := worker.NewSplitCloneWorker(wr, *cell, keyspace, shard, excludeTableArray, strategy, int(sourceReaderCount), int(destinationPackCount), uint64(minTableSizeForSplit), int(destinationWriterCount)) if err != nil { httpError(w, "cannot create worker: %v", err) return } if _, err := setAndStartWorker(wrk); err != nil { httpError(w, "cannot set worker: %s", err) return } http.Redirect(w, r, servenv.StatusURLPath(), http.StatusTemporaryRedirect) }