/
adminReindex.go
91 lines (76 loc) · 2.08 KB
/
adminReindex.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package main
import (
"fmt"
"net/http"
. "github.com/Deleplace/programming-idioms/idioms"
"context"
"google.golang.org/appengine/datastore"
"google.golang.org/appengine/log"
)
func adminReindexAjax(w http.ResponseWriter, r *http.Request) error {
ctx := r.Context()
err := dao.deleteCache(ctx)
if err != nil {
log.Warningf(ctx, "Problem deleting cache: %v", err.Error())
}
err = dao.unindexAll(ctx)
if err != nil {
log.Warningf(ctx, "Problem deleting cache: %v", err.Error())
}
err = reindexDelayer.Call(ctx, "")
if err != nil {
return err
}
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, Response{"message": "Reindexing launched in delayed tasks"})
return nil
}
// Number of idioms being process by each single delayed task
const reindexBatchSize = 5
var reindexDelayer callable
func init() {
reindexDelayer = delayFunc("reindex-idioms", func(ctx context.Context, cursorStr string) error {
q := datastore.NewQuery("Idiom")
if cursorStr != "" {
log.Infof(ctx, "Starting at cursor %v", cursorStr)
cursor, err := datastore.DecodeCursor(cursorStr)
if err != nil {
return err
}
q = q.Start(cursor)
}
iterator := q.Run(ctx)
reindexedIDs := make([]int, 0, reindexBatchSize)
defer func() {
log.Infof(ctx, "Reindexed idioms %v", reindexedIDs)
}()
for i := 0; i < reindexBatchSize; i++ {
var idiom Idiom
key, err := iterator.Next(&idiom)
if err == datastore.Done {
log.Infof(ctx, "Reindexing completed.")
return nil
} else if err != nil {
// ouch :(
return err
}
err = indexIdiomFullText(ctx, &idiom, key)
if err != nil {
log.Errorf(ctx, "Reindexing full text idiom %d : %v", idiom.Id, err)
}
err = indexIdiomCheatsheets(ctx, &idiom)
if err != nil {
log.Errorf(ctx, "Reindexing cheatsheet of idiom %d : %v", idiom.Id, err)
}
reindexedIDs = append(reindexedIDs, idiom.Id)
}
cursor, err := iterator.Cursor()
if err != nil {
// ouch :(
return err
}
log.Infof(ctx, "Stopping at cursor %v", cursor.String())
reindexDelayer.Call(ctx, cursor.String())
return nil
})
}