/
null.go
160 lines (137 loc) · 3.4 KB
/
null.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// SPDX-License-Identifier: MIT
package sbot
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
"go.cryptoscope.co/luigi"
refs "go.mindeco.de/ssb-refs"
"go.cryptoscope.co/ssb/internal/storedrefs"
"go.cryptoscope.co/ssb/multilogs"
"go.cryptoscope.co/ssb/repo"
)
// NullFeed overwrites all the entries from ref in repo with zeros
func (s *Sbot) NullFeed(ref refs.FeedRef) error {
ctx := context.Background()
feedAddr := storedrefs.Feed(ref)
userSeqs, err := s.Users.Get(feedAddr)
if err != nil {
return fmt.Errorf("NullFeed: failed to open log for feed argument: %w", err)
}
src, err := userSeqs.Query()
if err != nil {
return fmt.Errorf("NullFeed: failed create user seqs query: %w", err)
}
for {
v, err := src.Next(ctx)
if err != nil {
if luigi.IsEOS(err) {
break
}
return err
}
seq, ok := v.(int64)
if !ok {
return fmt.Errorf("NullFeed: not a sequence from userlog query")
}
err = s.ReceiveLog.Null(seq)
if err != nil {
return err
}
}
err = s.Users.Delete(feedAddr)
if err != nil {
return fmt.Errorf("NullFeed: error while deleting feed from userFeeds index: %w", err)
}
err = s.GraphBuilder.DeleteAuthor(ref)
if err != nil {
return fmt.Errorf("NullFeed: error while deleting feed from graph index: %w", err)
}
// delete my ebt state
// TODO: just remove that single feed
sfn, err := s.ebtState.StateFileName(s.KeyPair.ID())
if err != nil {
return fmt.Errorf("NullFeed: error while deleting ebt state file: %w", err)
}
os.Remove(sfn)
if !s.disableNetwork {
s.verifyRouter.CloseSink(ref)
}
return nil
}
// Drop indicies deletes the following folders of the indexes.
// TODO: check that sbot isn't running?
func DropIndicies(r repo.Interface) error {
// drop indicies
var mlogs = []string{
multilogs.IndexNameFeeds,
// multilogs.IndexNameTypes,
multilogs.IndexNamePrivates,
}
for _, i := range mlogs {
dbPath := r.GetPath(repo.PrefixMultiLog, i)
err := os.RemoveAll(dbPath)
if err != nil {
err = fmt.Errorf("mkdir error for %q: %w", dbPath, err)
return err
}
}
// TODO: shared mlog
// var badger = []string{
// indexes.FolderNameContacts,
// }
// for _, i := range badger {
// dbPath := r.GetPath(repo.PrefixIndex, i)
// err := os.RemoveAll(dbPath)
// if err != nil {
// err = fmt.Errorf("mkdir error for %q: %w", dbPath, err)
// return err
// }
// }
log.Println("removed index folders")
return nil
}
func RebuildIndicies(path string) error {
fi, err := os.Stat(path)
if err != nil {
err = fmt.Errorf("RebuildIndicies: failed to open sbot: %w", err)
return err
}
if !fi.IsDir() {
return fmt.Errorf("RebuildIndicies: repo path is not a directory")
}
// rebuilding indexes
sbot, err := New(
DisableNetworkNode(),
WithRepoPath(path),
DisableLiveIndexMode(),
)
if err != nil {
err = fmt.Errorf("failed to open sbot: %w", err)
return err
}
// TODO: not sure if I should hook this signal here..
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
sbot.Shutdown()
time.Sleep(5 * time.Second)
err := sbot.Close()
log.Println("sbot closed:", err)
time.Sleep(5 * time.Second)
os.Exit(0)
}()
start := time.Now()
log.Println("started sbot for re-indexing")
err = sbot.Close()
log.Println("re-indexing took:", time.Since(start))
if err != nil {
return fmt.Errorf("RebuildIndicies: failed to close sbot: %w", err)
}
return nil
}