Browse Source

lib/api, lib/db: Add file debug endpoint (#7095)

Simon Frei 5 years ago
parent
commit
1d3b9876f6
2 changed files with 37 additions and 0 deletions
  1. 25 0
      lib/api/api.go
  2. 12 0
      lib/db/set.go

+ 25 - 0
lib/api/api.go

@@ -324,6 +324,7 @@ func (s *service) serve(ctx context.Context) {
 	debugMux.HandleFunc("/rest/debug/cpuprof", s.getCPUProf) // duration
 	debugMux.HandleFunc("/rest/debug/heapprof", s.getHeapProf)
 	debugMux.HandleFunc("/rest/debug/support", s.getSupportBundle)
+	debugMux.HandleFunc("/rest/debug/file", s.getDebugFile)
 	restMux.Handler(http.MethodGet, "/rest/debug/*method", s.whenDebugging(debugMux))
 
 	// A handler that disables caching
@@ -847,6 +848,30 @@ func (s *service) getDBFile(w http.ResponseWriter, r *http.Request) {
 	})
 }
 
+func (s *service) getDebugFile(w http.ResponseWriter, r *http.Request) {
+	qs := r.URL.Query()
+	folder := qs.Get("folder")
+	file := qs.Get("file")
+
+	snap, err := s.model.DBSnapshot(folder)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusNotFound)
+		return
+	}
+
+	lf, _ := snap.Get(protocol.LocalDeviceID, file)
+	gf, _ := snap.GetGlobal(file)
+	av := snap.Availability(file)
+	vl := snap.DebugGlobalVersions(file)
+
+	sendJSON(w, map[string]interface{}{
+		"global":         jsonFileInfo(gf),
+		"local":          jsonFileInfo(lf),
+		"availability":   av,
+		"globalVersions": vl.String(),
+	})
+}
+
 func (s *service) postSystemRestart(w http.ResponseWriter, r *http.Request) {
 	s.flushResponse(`{"ok": "restarting"}`, w)
 	go s.contr.Restart()

+ 12 - 0
lib/db/set.go

@@ -290,6 +290,18 @@ func (s *Snapshot) Availability(file string) []protocol.DeviceID {
 	return av
 }
 
+func (s *Snapshot) DebugGlobalVersions(file string) VersionList {
+	opStr := fmt.Sprintf("%s DebugGlobalVersions(%v)", s.folder, file)
+	l.Debugf(opStr)
+	vl, err := s.t.getGlobalVersions(nil, []byte(s.folder), []byte(osutil.NormalizedFilename(file)))
+	if backend.IsClosed(err) {
+		return VersionList{}
+	} else if err != nil {
+		s.fatalError(err, opStr)
+	}
+	return vl
+}
+
 func (s *Snapshot) Sequence(device protocol.DeviceID) int64 {
 	return s.meta.Counts(device, 0).Sequence
 }