/* Queue is used to append client messages when the node is a leader. NOTE: The lock is not held in this method as we do not touch commitIndex or waitingReaders */ func (clog *CommitLog) Queue(term int64, modelMsgs model.Messages) (IDs []int64, err error) { //clog.node_log("Queueing messages: %v\n", msgs) //modelMsgs := model.MessagesFromClientData(msgs) if modelMsgs.GetCount() == 0 { clog.node_log("No messages found from client for Queue.") return nil, errors.New("No messages found to be Queued.") } err = modelMsgs.SetMessageTerm(term) if err != nil { clog.node_log("Error setting terms for messages: %v\n", err) return nil, err } // Stick them on the end of the log lastIndex, err := clog.log.AppendMessages(modelMsgs) if err != nil { clog.node_log("Error writing message to log in Queue: %v\n", err) return nil, err } else if clog.syncPolicy == WRITE_SYNC { err = clog.log.Sync() if err != nil { clog.node_log("Error syncing written message to log in Queue: %v\n", err) return nil, err } } //time.Sleep(time.Millisecond * 500) numMessages := modelMsgs.GetCount() results := make([]int64, numMessages) // If log has one message, and two are added: lastIndex (3) - len (modelMsgs (2)) + 1 = 2 index := lastIndex - int64(numMessages) + 1 for i := 0; i < numMessages; i++ { results[i] = index index++ } return results, nil }