mirror of
https://github.com/foomo/contentserver.git
synced 2025-10-16 12:25:44 +00:00
preparing repo persistence for fast startups and more fault tolerance
This commit is contained in:
parent
d697f09b25
commit
9b72f7d846
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,6 +1,6 @@
|
|||||||
.*
|
.*
|
||||||
*~
|
*~
|
||||||
|
/bin/*
|
||||||
/main
|
/main
|
||||||
/*.sublime-*
|
/*.sublime-*
|
||||||
/buildOnLinux.sh
|
|
||||||
!.git*
|
!.git*
|
||||||
|
|||||||
11
Makefile
Normal file
11
Makefile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
SHELL := /bin/bash
|
||||||
|
|
||||||
|
options:
|
||||||
|
echo "you can clean | test | build | run"
|
||||||
|
clean:
|
||||||
|
rm -f bin/contentserver
|
||||||
|
build:
|
||||||
|
make clean
|
||||||
|
go build -o bin/contentserver
|
||||||
|
test:
|
||||||
|
go test -v github.com/foomo/contentserver/server/repo
|
||||||
0
bin/.gitkeep
Normal file
0
bin/.gitkeep
Normal file
@ -10,8 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
PROTOCOL_TCP = "tcp"
|
PROTOCOL_TCP = "tcp"
|
||||||
PROTOCOL_HTTP = "http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ExitCode int
|
type ExitCode int
|
||||||
@ -25,6 +24,7 @@ var contentServer string
|
|||||||
|
|
||||||
var protocol = flag.String("protocol", PROTOCOL_TCP, "what protocol to server for")
|
var protocol = flag.String("protocol", PROTOCOL_TCP, "what protocol to server for")
|
||||||
var address = flag.String("address", "127.0.0.1:8081", "address to bind host:port")
|
var address = flag.String("address", "127.0.0.1:8081", "address to bind host:port")
|
||||||
|
var varDir = flag.String("vardir", "127.0.0.1:8081", "where to put my data")
|
||||||
var logLevelOptions = []string{
|
var logLevelOptions = []string{
|
||||||
log.LOG_LEVEL_NAME_ERROR,
|
log.LOG_LEVEL_NAME_ERROR,
|
||||||
log.LOG_LEVEL_NAME_RECORD,
|
log.LOG_LEVEL_NAME_RECORD,
|
||||||
@ -52,11 +52,7 @@ func main() {
|
|||||||
log.SetLogLevel(log.GetLogLevelByName(*logLevel))
|
log.SetLogLevel(log.GetLogLevelByName(*logLevel))
|
||||||
switch *protocol {
|
switch *protocol {
|
||||||
case PROTOCOL_TCP:
|
case PROTOCOL_TCP:
|
||||||
server.RunSocketServer(flag.Arg(0), *address)
|
server.RunSocketServer(flag.Arg(0), *address, *varDir)
|
||||||
break
|
|
||||||
case PROTOCOL_HTTP:
|
|
||||||
//server.Run(":8080", "http://test.bestbytes/foomo/modules/Foomo.Page.Content/services/content.php")
|
|
||||||
fmt.Println("http server does not work yet - use tcp instead")
|
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
exitUsage(EXIT_CODE_INSUFFICIENT_ARGS)
|
exitUsage(EXIT_CODE_INSUFFICIENT_ARGS)
|
||||||
39
server/repo/history.go
Normal file
39
server/repo/history.go
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package repo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"path"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const historyRepoJSONPrefix = "contentserver-repo-"
|
||||||
|
const historyRepoJSONSuffix = ".json"
|
||||||
|
|
||||||
|
type history struct {
|
||||||
|
varDir string
|
||||||
|
}
|
||||||
|
|
||||||
|
func newHistory(varDir string) *history {
|
||||||
|
return &history{
|
||||||
|
varDir: varDir,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *history) add(jsonBytes []byte) error {
|
||||||
|
// historic file name
|
||||||
|
filename := path.Join(h.varDir, historyRepoJSONPrefix+time.Now().Format(time.RFC3339Nano)+historyRepoJSONSuffix)
|
||||||
|
err := ioutil.WriteFile(filename, jsonBytes, 0644)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// current filename
|
||||||
|
return ioutil.WriteFile(h.getCurrentFilename(), jsonBytes, 0644)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *history) getCurrentFilename() string {
|
||||||
|
return historyRepoJSONPrefix + "current" + historyRepoJSONSuffix
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *history) getCurrent() (jsonBytes []byte, err error) {
|
||||||
|
return ioutil.ReadFile(h.getCurrentFilename())
|
||||||
|
}
|
||||||
226
server/repo/loader.go
Normal file
226
server/repo/loader.go
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
package repo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"github.com/foomo/contentserver/server/log"
|
||||||
|
"github.com/foomo/contentserver/server/repo/content"
|
||||||
|
"github.com/foomo/contentserver/server/responses"
|
||||||
|
"github.com/foomo/contentserver/server/utils"
|
||||||
|
"time"
|
||||||
|
//golog "log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (repo *Repo) updateRoutine() {
|
||||||
|
repo.updateChannel = make(chan *RepoDimension)
|
||||||
|
repo.updateDoneChannel = make(chan error)
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case newDimension := <-repo.updateChannel:
|
||||||
|
repo.updateDoneChannel <- repo.updateDimension(newDimension.Dimension, newDimension.Node)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) UpdateDimension(dimension string, node *content.RepoNode) error {
|
||||||
|
repo.updateChannel <- &RepoDimension{
|
||||||
|
Dimension: dimension,
|
||||||
|
Node: node,
|
||||||
|
}
|
||||||
|
return <-repo.updateDoneChannel
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) updateDimension(dimension string, newNode *content.RepoNode) error {
|
||||||
|
newNode.WireParents()
|
||||||
|
newDirectory := make(map[string]*content.RepoNode)
|
||||||
|
newURIDirectory := make(map[string]*content.RepoNode)
|
||||||
|
|
||||||
|
err := builDirectory(newNode, newDirectory, newURIDirectory)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = wireAliases(newDirectory)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
repo.Directory[dimension] = &Dimension{
|
||||||
|
Node: newNode,
|
||||||
|
Directory: newDirectory,
|
||||||
|
URIDirectory: newURIDirectory,
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func builDirectory(dirNode *content.RepoNode, directory map[string]*content.RepoNode, uRIDirectory map[string]*content.RepoNode) error {
|
||||||
|
log.Debug("repo.buildDirectory: " + dirNode.Id)
|
||||||
|
existingNode, ok := directory[dirNode.Id]
|
||||||
|
if ok {
|
||||||
|
return errors.New("duplicate node with id:" + existingNode.Id)
|
||||||
|
}
|
||||||
|
directory[dirNode.Id] = dirNode
|
||||||
|
//todo handle duplicate uris
|
||||||
|
if _, thereIsAnExistingUriNode := uRIDirectory[dirNode.URI]; thereIsAnExistingUriNode {
|
||||||
|
return errors.New("duplicate node with uri: " + dirNode.URI)
|
||||||
|
}
|
||||||
|
uRIDirectory[dirNode.URI] = dirNode
|
||||||
|
for _, childNode := range dirNode.Nodes {
|
||||||
|
err := builDirectory(childNode, directory, uRIDirectory)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func wireAliases(directory map[string]*content.RepoNode) error {
|
||||||
|
for _, repoNode := range directory {
|
||||||
|
if len(repoNode.LinkId) > 0 {
|
||||||
|
if destinationNode, ok := directory[repoNode.LinkId]; ok {
|
||||||
|
repoNode.URI = destinationNode.URI
|
||||||
|
} else {
|
||||||
|
return errors.New("that link id points nowhere " + repoNode.LinkId + " from " + repoNode.Id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadNodesFromJSON(jsonBytes []byte) (nodes map[string]*content.RepoNode, err error) {
|
||||||
|
nodes = make(map[string]*content.RepoNode)
|
||||||
|
err = json.Unmarshal(jsonBytes, &nodes)
|
||||||
|
return nodes, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) Update() (updateResponse *responses.Update) {
|
||||||
|
floatSeconds := func(nanoSeconds int64) float64 {
|
||||||
|
return float64(nanoSeconds / 1000000)
|
||||||
|
}
|
||||||
|
startTime := time.Now().UnixNano()
|
||||||
|
updateRepotime, updateErr := repo.update()
|
||||||
|
updateResponse = responses.NewUpdate()
|
||||||
|
updateResponse.Stats.RepoRuntime = floatSeconds(updateRepotime)
|
||||||
|
if updateErr != nil {
|
||||||
|
// let us try to restore the world from a file
|
||||||
|
log.Error("could not update repository:" + updateErr.Error())
|
||||||
|
restoreErr := repo.tryToRestoreCurrent()
|
||||||
|
if restoreErr == nil {
|
||||||
|
log.Error("failed to restore preceding repo version")
|
||||||
|
} else {
|
||||||
|
log.Record("restored current repo from local history")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// add some stats
|
||||||
|
for dimension, _ := range repo.Directory {
|
||||||
|
updateResponse.Stats.NumberOfNodes += len(repo.Directory[dimension].Directory)
|
||||||
|
updateResponse.Stats.NumberOfURIs += len(repo.Directory[dimension].URIDirectory)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
updateResponse.Stats.OwnRuntime = floatSeconds(startTime-time.Now().UnixNano()) - updateResponse.Stats.RepoRuntime
|
||||||
|
return updateResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) tryToRestoreCurrent() error {
|
||||||
|
currentJsonBytes, err := repo.history.getCurrent()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return repo.loadJSONBytes(currentJsonBytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) update() (repoRuntime int64, err error) {
|
||||||
|
startTimeRepo := time.Now().UnixNano()
|
||||||
|
jsonBytes, err := utils.Get(repo.server)
|
||||||
|
repoRuntime = time.Now().UnixNano() - startTimeRepo
|
||||||
|
if err != nil {
|
||||||
|
// we have no json to load - the repo server did not reply
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
nodes, err := loadNodesFromJSON(jsonBytes)
|
||||||
|
if err != nil {
|
||||||
|
// could not load nodes from json
|
||||||
|
return repoRuntime, err
|
||||||
|
}
|
||||||
|
err = repo.loadNodes(nodes)
|
||||||
|
if err != nil {
|
||||||
|
// repo failed to load nodes
|
||||||
|
return repoRuntime, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return repoRuntime, nil
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
log.Debug("loaded nodes for dimension " + dimension)
|
||||||
|
_, dimensionOk := repo.Directory[dimension]
|
||||||
|
if dimensionOk {
|
||||||
|
updateResponse.Stats.NumberOfNodes += len(repo.Directory[dimension].Directory)
|
||||||
|
updateResponse.Stats.NumberOfURIs += len(repo.Directory[dimension].URIDirectory)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
jsonBytes
|
||||||
|
newNodes := loadNodesFromJSON(jsonBytes)
|
||||||
|
|
||||||
|
data, err := utils.GetRepo(repo.server, newNodes)
|
||||||
|
updateResponse.Stats.RepoRuntime =
|
||||||
|
startTimeOwn := time.Now()
|
||||||
|
if err == nil {
|
||||||
|
}
|
||||||
|
updateResponse.Success = (err != nil)
|
||||||
|
|
||||||
|
doneHandler := func() *responses.Update {
|
||||||
|
updateResponse.Stats.OwnRuntime = time.Now().Sub(startTimeOwn).Seconds()
|
||||||
|
return updateResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
if updateResponse.Success {
|
||||||
|
log.Debug("going to load dimensions from" + utils.ToJSON(newNodes))
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateErrorHandler(err error, updateResponse *responses.Update) *responses.Update {
|
||||||
|
log.Error(fmt.Sprintf("update error: %", err))
|
||||||
|
if updateResponse == nil {
|
||||||
|
updateResponse = responses.NewUpdate()
|
||||||
|
}
|
||||||
|
updateResponse.Success = false
|
||||||
|
updateResponse.ErrorMessage = fmt.Sprintf("%", err)
|
||||||
|
updateResponse.Stats.NumberOfNodes = -1
|
||||||
|
updateResponse.Stats.NumberOfURIs = -1
|
||||||
|
return updateResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) loadJSONBytes(jsonBytes []byte) error {
|
||||||
|
nodes, err := loadNodesFromJSON(jsonBytes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = repo.loadNodes(nodes)
|
||||||
|
if err == nil {
|
||||||
|
historyErr := repo.history.add(jsonBytes)
|
||||||
|
if historyErr != nil {
|
||||||
|
log.Warning("could not add valid json to history:" + historyErr.Error())
|
||||||
|
} else {
|
||||||
|
log.Record("added valid json to history")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) loadNodes(newNodes map[string]*content.RepoNode) error {
|
||||||
|
for dimension, newNode := range newNodes {
|
||||||
|
log.Debug("loading nodes for dimension " + dimension)
|
||||||
|
loadErr := repo.UpdateDimension(dimension, newNode)
|
||||||
|
if loadErr != nil {
|
||||||
|
log.Debug(" failed to load " + dimension + ": " + loadErr.Error())
|
||||||
|
return loadErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// we need to throw away orphaned nodes
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@ -1,16 +1,15 @@
|
|||||||
package repo
|
package repo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
// "errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/foomo/contentserver/server/log"
|
"github.com/foomo/contentserver/server/log"
|
||||||
"github.com/foomo/contentserver/server/repo/content"
|
"github.com/foomo/contentserver/server/repo/content"
|
||||||
"github.com/foomo/contentserver/server/requests"
|
"github.com/foomo/contentserver/server/requests"
|
||||||
"github.com/foomo/contentserver/server/responses"
|
//"github.com/foomo/contentserver/server/responses"
|
||||||
"github.com/foomo/contentserver/server/utils"
|
//"github.com/foomo/contentserver/server/utils"
|
||||||
golog "log"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
//"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Dimension struct {
|
type Dimension struct {
|
||||||
@ -29,55 +28,25 @@ type Repo struct {
|
|||||||
Directory map[string]*Dimension
|
Directory map[string]*Dimension
|
||||||
updateChannel chan *RepoDimension
|
updateChannel chan *RepoDimension
|
||||||
updateDoneChannel chan error
|
updateDoneChannel chan error
|
||||||
|
history *history
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRepo(server string) *Repo {
|
func NewRepo(server string, varDir string) *Repo {
|
||||||
log.Notice("creating new repo for " + server)
|
log.Notice("creating new repo for " + server)
|
||||||
repo := new(Repo)
|
repo := new(Repo)
|
||||||
repo.Directory = make(map[string]*Dimension)
|
repo.Directory = make(map[string]*Dimension)
|
||||||
repo.server = server
|
repo.server = server
|
||||||
repo.updateChannel = make(chan *RepoDimension)
|
repo.history = newHistory(varDir)
|
||||||
repo.updateDoneChannel = make(chan error)
|
go repo.updateRoutine()
|
||||||
go func() {
|
restoreErr := repo.tryToRestoreCurrent()
|
||||||
for {
|
if restoreErr == nil {
|
||||||
select {
|
log.Record("could not restore previous repo content:" + restoreErr.Error())
|
||||||
case newDimension := <-repo.updateChannel:
|
} else {
|
||||||
repo.updateDoneChannel <- repo.load(newDimension.Dimension, newDimension.Node)
|
log.Record("restored previous repo content")
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}()
|
|
||||||
return repo
|
return repo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *Repo) Load(dimension string, node *content.RepoNode) error {
|
|
||||||
repo.updateChannel <- &RepoDimension{
|
|
||||||
Dimension: dimension,
|
|
||||||
Node: node,
|
|
||||||
}
|
|
||||||
return <-repo.updateDoneChannel
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *Repo) load(dimension string, newNode *content.RepoNode) error {
|
|
||||||
newNode.WireParents()
|
|
||||||
newDirectory := make(map[string]*content.RepoNode)
|
|
||||||
newURIDirectory := make(map[string]*content.RepoNode)
|
|
||||||
|
|
||||||
err := builDirectory(newNode, newDirectory, newURIDirectory)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
err = wireAliases(newDirectory)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
repo.Directory[dimension] = &Dimension{
|
|
||||||
Node: newNode,
|
|
||||||
Directory: newDirectory,
|
|
||||||
URIDirectory: newURIDirectory,
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *Repo) ResolveContent(dimensions []string, URI string) (resolved bool, resolvedURI string, resolvedDimension string, repoNode *content.RepoNode) {
|
func (repo *Repo) ResolveContent(dimensions []string, URI string) (resolved bool, resolvedURI string, resolvedDimension string, repoNode *content.RepoNode) {
|
||||||
parts := strings.Split(URI, content.PATH_SEPARATOR)
|
parts := strings.Split(URI, content.PATH_SEPARATOR)
|
||||||
resolved = false
|
resolved = false
|
||||||
@ -214,74 +183,3 @@ func (repo *Repo) GetRepo() map[string]*content.RepoNode {
|
|||||||
func uriKeyForState(state string, uri string) string {
|
func uriKeyForState(state string, uri string) string {
|
||||||
return state + "-" + uri
|
return state + "-" + uri
|
||||||
}
|
}
|
||||||
|
|
||||||
func builDirectory(dirNode *content.RepoNode, directory map[string]*content.RepoNode, uRIDirectory map[string]*content.RepoNode) error {
|
|
||||||
log.Debug("repo.buildDirectory: " + dirNode.Id)
|
|
||||||
existingNode, ok := directory[dirNode.Id]
|
|
||||||
if ok {
|
|
||||||
return errors.New("duplicate node with id:" + existingNode.Id)
|
|
||||||
}
|
|
||||||
directory[dirNode.Id] = dirNode
|
|
||||||
//todo handle duplicate uris
|
|
||||||
if _, thereIsAnExistingUriNode := uRIDirectory[dirNode.URI]; thereIsAnExistingUriNode {
|
|
||||||
return errors.New("duplicate node with uri: " + dirNode.URI)
|
|
||||||
}
|
|
||||||
uRIDirectory[dirNode.URI] = dirNode
|
|
||||||
for _, childNode := range dirNode.Nodes {
|
|
||||||
err := builDirectory(childNode, directory, uRIDirectory)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func wireAliases(directory map[string]*content.RepoNode) error {
|
|
||||||
for _, repoNode := range directory {
|
|
||||||
if len(repoNode.LinkId) > 0 {
|
|
||||||
if destinationNode, ok := directory[repoNode.LinkId]; ok {
|
|
||||||
repoNode.URI = destinationNode.URI
|
|
||||||
} else {
|
|
||||||
return errors.New("that link id points nowhere " + repoNode.LinkId + " from " + repoNode.Id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *Repo) Update() *responses.Update {
|
|
||||||
updateResponse := responses.NewUpdate()
|
|
||||||
newNodes := make(map[string]*content.RepoNode) //content.NewRepoNode()
|
|
||||||
startTimeRepo := time.Now()
|
|
||||||
ok, err := utils.GetRepo(repo.server, newNodes)
|
|
||||||
updateResponse.Stats.RepoRuntime = time.Now().Sub(startTimeRepo).Seconds()
|
|
||||||
startTimeOwn := time.Now()
|
|
||||||
updateResponse.Success = ok
|
|
||||||
if ok {
|
|
||||||
log.Debug("going to load dimensions from" + utils.ToJSON(newNodes))
|
|
||||||
for dimension, newNode := range newNodes {
|
|
||||||
log.Debug("loading nodes for dimension " + dimension)
|
|
||||||
loadErr := repo.Load(dimension, newNode)
|
|
||||||
if loadErr != nil {
|
|
||||||
golog.Println(loadErr)
|
|
||||||
panic(loadErr)
|
|
||||||
}
|
|
||||||
log.Debug("loaded nodes for dimension " + dimension)
|
|
||||||
_, dimensionOk := repo.Directory[dimension]
|
|
||||||
if dimensionOk {
|
|
||||||
updateResponse.Stats.NumberOfNodes += len(repo.Directory[dimension].Directory)
|
|
||||||
updateResponse.Stats.NumberOfURIs += len(repo.Directory[dimension].URIDirectory)
|
|
||||||
} else {
|
|
||||||
log.Debug("where is dimension " + dimension)
|
|
||||||
golog.Println(repo.Directory)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.Error(fmt.Sprintf("update error: %", err))
|
|
||||||
updateResponse.ErrorMessage = fmt.Sprintf("%", err)
|
|
||||||
updateResponse.Stats.NumberOfNodes = -1
|
|
||||||
updateResponse.Stats.NumberOfURIs = -1
|
|
||||||
}
|
|
||||||
updateResponse.Stats.OwnRuntime = time.Now().Sub(startTimeOwn).Seconds()
|
|
||||||
return updateResponse
|
|
||||||
}
|
|
||||||
|
|||||||
@ -154,9 +154,9 @@ func handleConnection(conn net.Conn) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunSocketServer(server string, address string) {
|
func RunSocketServer(server string, address string, varDir string) {
|
||||||
log.Record("building repo with content from " + server)
|
log.Record("building repo with content from " + server)
|
||||||
contentRepo = repo.NewRepo(server)
|
contentRepo = repo.NewRepo(server, varDir)
|
||||||
contentRepo.Update()
|
contentRepo.Update()
|
||||||
ln, err := net.Listen("tcp", address)
|
ln, err := net.Listen("tcp", address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/foomo/contentserver/server/repo/content"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
@ -47,56 +46,16 @@ func PopulateRequest(r *http.Request, obj interface{}) {
|
|||||||
json.Unmarshal(extractJsonFromRequest(r), obj)
|
json.Unmarshal(extractJsonFromRequest(r), obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetRepo(URL string, obj map[string]*content.RepoNode) (ok bool, err error) {
|
func Get(URL string) (data []byte, err error) {
|
||||||
// add proper error handling
|
|
||||||
response, err := http.Get(URL)
|
response, err := http.Get(URL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return data, err
|
||||||
} else {
|
} else {
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
if response.StatusCode != http.StatusOK {
|
if response.StatusCode != http.StatusOK {
|
||||||
return false, errors.New(fmt.Sprintf("Bad HTTP Response: %v", response.Status))
|
return data, errors.New(fmt.Sprintf("Bad HTTP Response: %v", response.Status))
|
||||||
} else {
|
} else {
|
||||||
contents, err := ioutil.ReadAll(response.Body)
|
return ioutil.ReadAll(response.Body)
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
} else {
|
|
||||||
fmt.Printf("json string %s", string(contents))
|
|
||||||
jsonErr := json.Unmarshal(contents, &obj)
|
|
||||||
if jsonErr != nil {
|
|
||||||
panic(jsonErr)
|
|
||||||
return false, jsonErr
|
|
||||||
} else {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Get(URL string, obj interface{}) (ok bool, err error) {
|
|
||||||
// add proper error handling
|
|
||||||
response, err := http.Get(URL)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
} else {
|
|
||||||
defer response.Body.Close()
|
|
||||||
if response.StatusCode != http.StatusOK {
|
|
||||||
return false, errors.New(fmt.Sprintf("Bad HTTP Response: %v", response.Status))
|
|
||||||
} else {
|
|
||||||
contents, err := ioutil.ReadAll(response.Body)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
} else {
|
|
||||||
fmt.Printf("json string %s", string(contents))
|
|
||||||
jsonErr := json.Unmarshal(contents, &obj)
|
|
||||||
if jsonErr != nil {
|
|
||||||
panic(jsonErr)
|
|
||||||
return false, jsonErr
|
|
||||||
} else {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user