raft-key-value-store / labs-fall23-AnurimaVaishnavi-master / assignment2 / src / chandy-lamport / logger.go
logger.go
Raw
package chandy_lamport

import (
	"fmt"
	"log"
)

// =================================
//  Event logger, internal use only
// =================================

type Logger struct {
	// index = time step
	// value = events that occurred at that time step
	events [][]LogEvent
}

type LogEvent struct {
	serverId     string
	// Number of tokens before execution of event
	serverTokens int
	event        interface{}
}

func (event LogEvent) String() string {
	prependWithTokens := false
	switch evt := event.event.(type) {
	case SentMessageEvent:
		switch evt.message.(type) {
		case TokenMessage:
			prependWithTokens = true
		}
	case ReceivedMessageEvent:
		switch evt.message.(type) {
		case TokenMessage:
			prependWithTokens = true
		}
	case StartSnapshot:
		prependWithTokens = true
	case EndSnapshot:
	default:
		log.Fatal("Attempted to log unrecognized event: ", event.event)
	}
	if prependWithTokens {
		return fmt.Sprintf("%v has %v token(s)\n\t%v",
			event.serverId,
			event.serverTokens,
			event.event)
	} else {
		return fmt.Sprintf("%v", event.event)
	}
}

func NewLogger() *Logger {
	return &Logger{make([][]LogEvent, 0)}
}

func (log *Logger) PrettyPrint() {
	for epoch, events := range log.events {
		if len(events) != 0 {
			fmt.Printf("Time %v:\n", epoch)
		}
		for _, event := range events {
			fmt.Printf("\t%v\n", event)
		}
	}
}

func (log *Logger) NewEpoch() {
	log.events = append(log.events, make([]LogEvent, 0))
}

func (logger *Logger) RecordEvent(server *Server, event interface{}) {
	mostRecent := len(logger.events) - 1
	events := logger.events[mostRecent]
	events = append(events, LogEvent{server.Id, server.Tokens, event})
	logger.events[mostRecent] = events
}