Skip to content

Commit 9b94c47

Browse files
committed
Put global map access within mutexes to try to address CrunchyData#89
1 parent 2c26ff8 commit 9b94c47

File tree

11 files changed

+202
-186
lines changed

11 files changed

+202
-186
lines changed

assets/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ <h2>Table Layers</h2>
2323
{{ range $key, $value := . }}
2424
{{ if eq $value.Type "table" }}
2525
<li>
26-
<strong class="layer-name">{{ $value.Id }}</strong> (<a href='{{ $value.DetailUrl | replace ".json" ".html"}}'>preview</a> | <a href="{{ $value.DetailUrl }}">json</a>)
26+
<strong class="layer-name">{{ $value.ID }}</strong> (<a href='{{ $value.DetailURL | replace ".json" ".html"}}'>preview</a> | <a href="{{ $value.DetailURL }}">json</a>)
2727
{{ if $value.Description }}<br/><span class="layer-description">{{ $value.Description }}</span> {{ end }}
2828
</li>
2929
{{ end }}
@@ -35,7 +35,7 @@ <h2>Function Layers</h2>
3535
{{ range $key, $value := . }}
3636
{{ if eq $value.Type "function" }}
3737
<li>
38-
<strong class="layer-name">{{ $value.Id }}</strong> (<a href='{{$value.DetailUrl | replace ".json" ".html"}}'>preview</a> | <a href="{{ $value.DetailUrl }}">json</a>)
38+
<strong class="layer-name">{{ $value.ID }}</strong> (<a href='{{$value.DetailURL | replace ".json" ".html"}}'>preview</a> | <a href="{{ $value.DetailURL }}">json</a>)
3939
{{ if $value.Description }}<br/><span class="layer-description">{{ $value.Description }}</span> {{ end }}
4040
</li>
4141
{{ end }}

assets/preview-function.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<html>
22
<head>
33
<meta charset='utf-8' />
4-
<title>pg_tileserv: {{.Id}}</title>
4+
<title>pg_tileserv: {{.ID}}</title>
55
<script src='https://cdnjs.cloudflare.com/ajax/libs/mapbox-gl/1.13.0/mapbox-gl.js'></script>
66
<link href='https://cdnjs.cloudflare.com/ajax/libs/mapbox-gl/1.13.0/mapbox-gl.css' rel='stylesheet' />
77
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
@@ -15,7 +15,7 @@
1515
<body>
1616

1717
<div id="meta">
18-
<h1>{{ .Id }}</h1>
18+
<h1>{{ .ID }}</h1>
1919
{{ if .Description }}
2020
<p>{{ .Description }}</p>
2121
{{ end }}
@@ -44,9 +44,9 @@ <h1>{{ .Id }}</h1>
4444
var map;
4545
var mapcolor = "blue";
4646

47-
$.getJSON("{{ .Id }}.json", function(layer) {
47+
$.getJSON("{{ .ID }}.json", function(layer) {
4848
// A little info for explorers
49-
console.log("{{ .Id }}.json");
49+
console.log("{{ .ID }}.json");
5050
console.log(layer);
5151

5252
layer["arguments"].forEach(function (item, i) {

assets/preview-table.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<html>
22
<head>
33
<meta charset='utf-8' />
4-
<title>pg_tileserv: {{.Id}}</title>
4+
<title>pg_tileserv: {{.ID}}</title>
55
<script src='https://cdnjs.cloudflare.com/ajax/libs/mapbox-gl/1.13.0/mapbox-gl.js'></script>
66
<link href='https://cdnjs.cloudflare.com/ajax/libs/mapbox-gl/1.13.0/mapbox-gl.css' rel='stylesheet' />
77
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
@@ -16,7 +16,7 @@
1616
<body>
1717

1818
<div id="meta">
19-
<h1>{{ .Id }}</h1>
19+
<h1>{{ .ID }}</h1>
2020
{{ if .Description }}
2121
<p>{{ .Description }}</p>
2222
{{ end }}
@@ -32,9 +32,9 @@ <h1>{{ .Id }}</h1>
3232
var map;
3333
var mapcolor = "blue";
3434

35-
$.getJSON("{{ .Id }}.json", function(layer) {
35+
$.getJSON("{{ .ID }}.json", function(layer) {
3636
// A little info for explorers
37-
console.log("{{ .Id }}.json");
37+
console.log("{{ .ID }}.json");
3838
console.log(layer);
3939

4040
var mapConfig = {

db.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
log "github.com/sirupsen/logrus"
2323
)
2424

25-
func DbConnect() (*pgxpool.Pool, error) {
25+
func dbConnect() (*pgxpool.Pool, error) {
2626
if globalDb == nil {
2727
var err error
2828
var config *pgxpool.Config
@@ -67,8 +67,8 @@ func DbConnect() (*pgxpool.Pool, error) {
6767
return globalDb, nil
6868
}
6969

70-
func LoadVersions() error {
71-
db, err := DbConnect()
70+
func loadVersions() error {
71+
db, err := dbConnect()
7272
if err != nil {
7373
return err
7474
}
@@ -105,13 +105,13 @@ func LoadVersions() error {
105105
return nil
106106
}
107107

108-
func DBTileRequest(ctx context.Context, tr *TileRequest) ([]byte, error) {
109-
db, err := DbConnect()
108+
func dBTileRequest(ctx context.Context, tr *TileRequest) ([]byte, error) {
109+
db, err := dbConnect()
110110
if err != nil {
111111
log.Error(err)
112112
return nil, err
113113
}
114-
row := db.QueryRow(ctx, tr.Sql, tr.Args...)
114+
row := db.QueryRow(ctx, tr.SQL, tr.Args...)
115115
var mvtTile []byte
116116
err = row.Scan(&mvtTile)
117117
if err != nil {
@@ -123,13 +123,13 @@ func DBTileRequest(ctx context.Context, tr *TileRequest) ([]byte, error) {
123123
if pgconn.Timeout(err) {
124124
return nil, tileAppError{
125125
SrcErr: err,
126-
Message: fmt.Sprintf("Timeout: deadline exceeded on %s/%s", tr.LayerId, tr.Tile.String()),
126+
Message: fmt.Sprintf("Timeout: deadline exceeded on %s/%s", tr.LayerID, tr.Tile.String()),
127127
}
128128
}
129129

130130
return nil, tileAppError{
131131
SrcErr: err,
132-
Message: fmt.Sprintf("SQL error on %s/%s", tr.LayerId, tr.Tile.String()),
132+
Message: fmt.Sprintf("SQL error on %s/%s", tr.LayerID, tr.Tile.String()),
133133
}
134134

135135
}

layer.go

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,21 @@ import (
77
"net/http"
88
)
99

10-
type layerType int
10+
// LayerType is the table/function type of a layer
11+
type LayerType int
1112

1213
const (
13-
layerTypeTable = 1
14-
layerTypeFunction = 2
14+
// LayerTypeTable is a table layer
15+
LayerTypeTable = 1
16+
// LayerTypeFunction is a function layer
17+
LayerTypeFunction = 2
1518
)
1619

17-
func (lt layerType) String() string {
20+
func (lt LayerType) String() string {
1821
switch lt {
19-
case layerTypeTable:
22+
case LayerTypeTable:
2023
return "table"
21-
case layerTypeFunction:
24+
case LayerTypeFunction:
2225
return "function"
2326
default:
2427
return "unknown"
@@ -30,80 +33,77 @@ func (lt layerType) String() string {
3033
// a TileRequest containing SQL to produce tiles
3134
// given an input tile
3235
type Layer interface {
33-
GetType() layerType
34-
GetId() string
36+
GetType() LayerType
37+
GetID() string
3538
GetDescription() string
3639
GetName() string
3740
GetSchema() string
3841
GetTileRequest(tile Tile, r *http.Request) TileRequest
39-
WriteLayerJson(w http.ResponseWriter, req *http.Request) error
42+
WriteLayerJSON(w http.ResponseWriter, req *http.Request) error
4043
}
4144

4245
type TileRequest struct {
43-
LayerId string
46+
LayerID string
4447
Tile Tile
45-
Sql string
48+
SQL string
4649
Args []interface{}
4750
}
4851

49-
// A global array of Layer where the state is held for performance
50-
// Refreshed when LoadLayerTableList is called
51-
// Key is of the form: schemaname.tablename
52-
var globalLayers map[string]Layer
53-
54-
func GetLayer(lyrId string) (Layer, error) {
55-
if lyr, ok := globalLayers[lyrId]; ok {
52+
func getLayer(lyrID string) (Layer, error) {
53+
lyr, ok := globalLayers[lyrID]
54+
if ok {
5655
return lyr, nil
57-
} else {
58-
return lyr, errors.New(fmt.Sprintf("Unable to get layer '%s'", lyrId))
5956
}
57+
return lyr, errors.New(fmt.Sprintf("Unable to get layer '%s'", lyrID))
6058
}
6159

62-
func LoadLayers() error {
60+
func loadLayers() error {
6361
_, errBnd := getServerBounds()
6462
if errBnd != nil {
6563
return errBnd
6664
}
67-
tableLayers, errTl := GetTableLayers()
65+
tableLayers, errTl := getTableLayers()
6866
if errTl != nil {
6967
return errTl
7068
}
71-
functionLayers, errFl := GetFunctionLayers()
69+
functionLayers, errFl := getFunctionLayers()
7270
if errFl != nil {
7371
return errFl
7472
}
7573
// Empty the global layer map
74+
globalLayersMutex.Lock()
7675
globalLayers = make(map[string]Layer)
7776
for _, lyr := range tableLayers {
78-
globalLayers[lyr.GetId()] = lyr
77+
globalLayers[lyr.GetID()] = lyr
7978
}
8079
for _, lyr := range functionLayers {
81-
globalLayers[lyr.GetId()] = lyr
80+
globalLayers[lyr.GetID()] = lyr
8281
}
82+
globalLayersMutex.Unlock()
8383

8484
return nil
8585
}
8686

87-
type LayerJson struct {
87+
type layerJSON struct {
8888
Type string `json:"type"`
89-
Id string `json:"id"`
89+
ID string `json:"id"`
9090
Name string `json:"name"`
9191
Schema string `json:"schema"`
9292
Description string `json:"description"`
93-
DetailUrl string `json:"detailurl"`
93+
DetailURL string `json:"detailurl"`
9494
}
9595

96-
func GetJsonLayers(r *http.Request) map[string]LayerJson {
97-
json := make(map[string]LayerJson)
96+
func getJSONLayers(r *http.Request) map[string]layerJSON {
97+
json := make(map[string]layerJSON)
9898
urlBase := serverURLBase(r)
9999
for k, v := range globalLayers {
100-
json[k] = LayerJson{
100+
json[k] = layerJSON{
101101
Type: v.GetType().String(),
102-
Id: v.GetId(),
102+
ID: v.GetID(),
103103
Name: v.GetName(),
104104
Schema: v.GetSchema(),
105105
Description: v.GetDescription(),
106-
DetailUrl: fmt.Sprintf("%s/%s.json", urlBase, v.GetId()),
106+
DetailURL: fmt.Sprintf("%s/%s.json", urlBase, v.GetID()),
107107
}
108108
}
109109
return json

0 commit comments

Comments
 (0)