diff options
| author | KatolaZ <katolaz@freaknet.org> | 2017-07-19 06:36:00 +0100 | 
|---|---|---|
| committer | KatolaZ <katolaz@freaknet.org> | 2017-07-19 06:36:00 +0100 | 
| commit | 40c8aae58491b07adb05d348d1ddf86ce5ec2be8 (patch) | |
| tree | 52dae87ff1dc2a65a3fe45be5f18053fb0d62ac1 /scorsh.go | |
| parent | 30e2f9e350197cfda09766ef34112e4e3eb261b9 (diff) | |
Added Licence.  Amended Makefile: scorsh -> scorshd. getting closer.
Diffstat (limited to 'scorsh.go')
| -rw-r--r-- | scorsh.go | 151 | 
1 files changed, 0 insertions, 151 deletions
| diff --git a/scorsh.go b/scorsh.go deleted file mode 100644 index d36b646..0000000 --- a/scorsh.go +++ /dev/null @@ -1,151 +0,0 @@ -package main - -import ( -	"flag" -	"fmt" -	"log" -) - -// manage debugging messages - -const debug debugging = true - -type debugging bool - -func (d debugging) log(format string, args ...interface{}) { -	if d { -		log.Printf(format, args...) -	} -} - -/////////// - -var conf_file = flag.String("c", "./scorsh.cfg", "Configuration file for SCORSH") - -func SCORSHerr(err int) error { - -	var err_str string - -	switch err { -	case SCORSH_ERR_NO_FILE: -		err_str = "Invalid file name" -	case SCORSH_ERR_KEYRING: -		err_str = "Invalid keyring" -	case SCORSH_ERR_NO_REPO: -		err_str = "Invalid repository" -	case SCORSH_ERR_NO_COMMIT: -		err_str = "Invalid commit ID" -	case SCORSH_ERR_SIGNATURE: -		err_str = "Invalid signature" -	default: -		err_str = "Generic Error" -	} -	return fmt.Errorf("%s", err_str) - -} - -func FindMatchingWorkers(master *SCORSHmaster, msg *SCORSHmsg) []*SCORSHworker { - -	var ret []*SCORSHworker - -	for idx, w := range master.Workers { -		if w.Matches(msg.Repo, msg.Branch) { -			debug.log("--- Worker: %s matches %s:%s\n", w.Name, msg.Repo, msg.Branch) -			ret = append(ret, &(master.Workers[idx])) -		} -	} -	return ret -} - -func Master(master *SCORSHmaster) { - -	// master main loop: - -	var matching_workers []*SCORSHworker - -	matching_workers = make([]*SCORSHworker, len(master.Workers)) - -	log.Println("[master] Master started ") -	debug.log("[master] StatusChan: %s\n", master.StatusChan) - -	for { -		debug.log("[master] Receive loop...\n") -		select { -		case push_msg := <-master.Spooler: -			// here we manage the stuff we receive from the spooler -			debug.log("[master] received message: %s\n", push_msg) -			// - lookup the repos map for matching workers -			matching_workers = FindMatchingWorkers(master, &push_msg) -			debug.log("[master] matching workers: \n%s\n", matching_workers) - -			// add the message to WorkingMsg, if it's not a duplicate! -			if _, ok := master.WorkingMsg[push_msg.Id]; ok { -				log.Printf("[master] detected duplicate message %s \n", push_msg.Id) -			} else { -				master.WorkingMsg[push_msg.Id] = 0 -				// - dispatch the message to all the matching workers -				for _, w := range matching_workers { -					debug.log("[master] sending msg to worker: %s\n", w.Name) -					// send the message to the worker -					w.MsgChan <- push_msg -					// increase the counter associated to the message -					master.WorkingMsg[push_msg.Id] += 1 -					debug.log("[master] now WorkingMsg[%s] is: %d\n", push_msg.Id, master.WorkingMsg[push_msg.Id]) -				} -			} -		case done_msg := <-master.StatusChan: -			// Here we manage a status message from a worker -			debug.log("[master] received message from StatusChan: %s\n", done_msg) -			if _, ok := master.WorkingMsg[done_msg.Id]; ok && master.WorkingMsg[done_msg.Id] > 0 { -				master.WorkingMsg[done_msg.Id] -= 1 -				if master.WorkingMsg[done_msg.Id] == 0 { -					delete(master.WorkingMsg, done_msg.Id) -					master.Spooler <- done_msg -				} -			} else { -				log.Printf("[master] received completion event for non-existing message name: %s\n", done_msg.Id) -			} -		} -	} -	debug.log("[master] Exiting the for loop, for some mysterious reason...\n") -} - -func InitMaster() *SCORSHmaster { - -	master := ReadGlobalConfig(*conf_file) - -	master.Repos = make(map[string][]*SCORSHworker) -	master.WorkingMsg = make(map[string]int) -	// This is the channel on which we receive acks from workers -	master.StatusChan = make(chan SCORSHmsg) -	// This is the channel on which we exchange messages with the spooler -	master.Spooler = make(chan SCORSHmsg) - -	debug.log("[InitMaster] StatusChan: %s\n", master.StatusChan) - -	err_workers := StartWorkers(master) -	if err_workers != nil { -		log.Fatal("Error starting workers: ", err_workers) -	} else { -		log.Println("Workers started correctly") -	} -	err_spooler := StartSpooler(master) -	if err_spooler != nil { -		log.Fatal("Error starting spooler: ", err_spooler) -	} -	return master -} - -func main() { - -	var done chan int - -	flag.Parse() - -	master := InitMaster() - -	go Master(master) - -	// wait indefinitely -- we should implement signal handling... -	<-done -} | 
