pgraph, lang: funcs: dage: Add an awkward graphviz interface

This refactors the code to make it not depend on the specific engine.
This commit is contained in:
James Shubin
2024-01-22 13:58:00 -05:00
parent 20c8a856a2
commit 66b826a8e1
3 changed files with 24 additions and 7 deletions

View File

@@ -1451,10 +1451,10 @@ func (obj *Engine) Stats() string {
return obj.stats.String()
}
// Graphviz writes out the diagram of a graph to be used for visualization and
// debugging. You must not modify the graph (eg: during Lock) when calling this
// method.
func (obj *Engine) Graphviz(dir string) error {
// ExecGraphviz writes out the diagram of a graph to be used for visualization
// and debugging. You must not modify the graph (eg: during Lock) when calling
// this method.
func (obj *Engine) ExecGraphviz(dir string) error {
// XXX: would this deadlock if we added this?
//obj.graphMutex.Lock() // XXX: should this be a RLock?
//defer obj.graphMutex.Unlock() // XXX: should this be an RUnlock?

View File

@@ -498,12 +498,12 @@ func (obj *graphTxn) commit() error {
// XXX: running this on each commit has a huge performance hit.
// XXX: we could write out the .dot files and run graphviz afterwards
if engine, ok := obj.GraphAPI.(*Engine); ok && GraphvizDebug {
if g, ok := obj.GraphAPI.(pgraph.Graphvizable); ok && GraphvizDebug {
//d := time.Now().Unix()
//if err := engine.graph.ExecGraphviz(fmt.Sprintf("/tmp/txn-graphviz-%d.dot", d)); err != nil {
//if err := g.ExecGraphviz(fmt.Sprintf("/tmp/txn-graphviz-%d.dot", d)); err != nil {
// panic("no graphviz")
//}
if err := engine.Graphviz(""); err != nil {
if err := g.ExecGraphviz(""); err != nil {
panic(err) // XXX: improve me
}

View File

@@ -40,6 +40,23 @@ const (
ptrLabelsSize = 10
)
// Graphvizable is a simple interface to handle the common signature for this
// useful graphviz exec method that is used in debugging. Expect that this
// signature might change if the authors find a different variant more useful.
type Graphvizable interface {
// ExecGraphviz runs graphviz and stores the result at this absolute
// path. It (awkwardly) can be used by someone expecting either a
// filename, or a directory. The filename scenario should be used if you
// are expecting a single .dot output file. The directory scenario
// should be used if you are expecting a series of .dot graphs.
// Directories must end with a trailing slash. A filename passed will
// get this location overwritten if there is something already there. If
// the string is empty, it might create a file in a temporary directory
// somewhere.
ExecGraphviz(filename string) error
}
// Graphviz adds some visualization features for pgraph.
type Graphviz struct {
// Name is the display name of the graph. If specified it overrides an