mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 01:32:25 -05:00 
			
		
		
		
	feat: initial tracing support (#1623)
This commit is contained in:
		
					parent
					
						
							
								878ed48de3
							
						
					
				
			
			
				commit
				
					
						6392e00653
					
				
			
		
					 472 changed files with 102600 additions and 12 deletions
				
			
		
							
								
								
									
										27
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/BUILD.bazel
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/BUILD.bazel
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | |||
| load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") | ||||
| 
 | ||||
| package(default_visibility = ["//visibility:public"]) | ||||
| 
 | ||||
| go_library( | ||||
|     name = "utilities", | ||||
|     srcs = [ | ||||
|         "doc.go", | ||||
|         "pattern.go", | ||||
|         "readerfactory.go", | ||||
|         "trie.go", | ||||
|     ], | ||||
|     importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/utilities", | ||||
| ) | ||||
| 
 | ||||
| go_test( | ||||
|     name = "utilities_test", | ||||
|     size = "small", | ||||
|     srcs = ["trie_test.go"], | ||||
|     deps = [":utilities"], | ||||
| ) | ||||
| 
 | ||||
| alias( | ||||
|     name = "go_default_library", | ||||
|     actual = ":utilities", | ||||
|     visibility = ["//visibility:public"], | ||||
| ) | ||||
							
								
								
									
										2
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/doc.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/doc.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | |||
| // Package utilities provides members for internal use in grpc-gateway. | ||||
| package utilities | ||||
							
								
								
									
										22
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/pattern.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/pattern.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | |||
| package utilities | ||||
| 
 | ||||
| // An OpCode is a opcode of compiled path patterns. | ||||
| type OpCode int | ||||
| 
 | ||||
| // These constants are the valid values of OpCode. | ||||
| const ( | ||||
| 	// OpNop does nothing | ||||
| 	OpNop = OpCode(iota) | ||||
| 	// OpPush pushes a component to stack | ||||
| 	OpPush | ||||
| 	// OpLitPush pushes a component to stack if it matches to the literal | ||||
| 	OpLitPush | ||||
| 	// OpPushM concatenates the remaining components and pushes it to stack | ||||
| 	OpPushM | ||||
| 	// OpConcatN pops N items from stack, concatenates them and pushes it back to stack | ||||
| 	OpConcatN | ||||
| 	// OpCapture pops an item and binds it to the variable | ||||
| 	OpCapture | ||||
| 	// OpEnd is the least positive invalid opcode. | ||||
| 	OpEnd | ||||
| ) | ||||
							
								
								
									
										20
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/readerfactory.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/readerfactory.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| package utilities | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| ) | ||||
| 
 | ||||
| // IOReaderFactory takes in an io.Reader and returns a function that will allow you to create a new reader that begins | ||||
| // at the start of the stream | ||||
| func IOReaderFactory(r io.Reader) (func() io.Reader, error) { | ||||
| 	b, err := ioutil.ReadAll(r) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return func() io.Reader { | ||||
| 		return bytes.NewReader(b) | ||||
| 	}, nil | ||||
| } | ||||
							
								
								
									
										174
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/trie.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								vendor/github.com/grpc-ecosystem/grpc-gateway/v2/utilities/trie.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,174 @@ | |||
| package utilities | ||||
| 
 | ||||
| import ( | ||||
| 	"sort" | ||||
| ) | ||||
| 
 | ||||
| // DoubleArray is a Double Array implementation of trie on sequences of strings. | ||||
| type DoubleArray struct { | ||||
| 	// Encoding keeps an encoding from string to int | ||||
| 	Encoding map[string]int | ||||
| 	// Base is the base array of Double Array | ||||
| 	Base []int | ||||
| 	// Check is the check array of Double Array | ||||
| 	Check []int | ||||
| } | ||||
| 
 | ||||
| // NewDoubleArray builds a DoubleArray from a set of sequences of strings. | ||||
| func NewDoubleArray(seqs [][]string) *DoubleArray { | ||||
| 	da := &DoubleArray{Encoding: make(map[string]int)} | ||||
| 	if len(seqs) == 0 { | ||||
| 		return da | ||||
| 	} | ||||
| 
 | ||||
| 	encoded := registerTokens(da, seqs) | ||||
| 	sort.Sort(byLex(encoded)) | ||||
| 
 | ||||
| 	root := node{row: -1, col: -1, left: 0, right: len(encoded)} | ||||
| 	addSeqs(da, encoded, 0, root) | ||||
| 
 | ||||
| 	for i := len(da.Base); i > 0; i-- { | ||||
| 		if da.Check[i-1] != 0 { | ||||
| 			da.Base = da.Base[:i] | ||||
| 			da.Check = da.Check[:i] | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return da | ||||
| } | ||||
| 
 | ||||
| func registerTokens(da *DoubleArray, seqs [][]string) [][]int { | ||||
| 	var result [][]int | ||||
| 	for _, seq := range seqs { | ||||
| 		var encoded []int | ||||
| 		for _, token := range seq { | ||||
| 			if _, ok := da.Encoding[token]; !ok { | ||||
| 				da.Encoding[token] = len(da.Encoding) | ||||
| 			} | ||||
| 			encoded = append(encoded, da.Encoding[token]) | ||||
| 		} | ||||
| 		result = append(result, encoded) | ||||
| 	} | ||||
| 	for i := range result { | ||||
| 		result[i] = append(result[i], len(da.Encoding)) | ||||
| 	} | ||||
| 	return result | ||||
| } | ||||
| 
 | ||||
| type node struct { | ||||
| 	row, col    int | ||||
| 	left, right int | ||||
| } | ||||
| 
 | ||||
| func (n node) value(seqs [][]int) int { | ||||
| 	return seqs[n.row][n.col] | ||||
| } | ||||
| 
 | ||||
| func (n node) children(seqs [][]int) []*node { | ||||
| 	var result []*node | ||||
| 	lastVal := int(-1) | ||||
| 	last := new(node) | ||||
| 	for i := n.left; i < n.right; i++ { | ||||
| 		if lastVal == seqs[i][n.col+1] { | ||||
| 			continue | ||||
| 		} | ||||
| 		last.right = i | ||||
| 		last = &node{ | ||||
| 			row:  i, | ||||
| 			col:  n.col + 1, | ||||
| 			left: i, | ||||
| 		} | ||||
| 		result = append(result, last) | ||||
| 	} | ||||
| 	last.right = n.right | ||||
| 	return result | ||||
| } | ||||
| 
 | ||||
| func addSeqs(da *DoubleArray, seqs [][]int, pos int, n node) { | ||||
| 	ensureSize(da, pos) | ||||
| 
 | ||||
| 	children := n.children(seqs) | ||||
| 	var i int | ||||
| 	for i = 1; ; i++ { | ||||
| 		ok := func() bool { | ||||
| 			for _, child := range children { | ||||
| 				code := child.value(seqs) | ||||
| 				j := i + code | ||||
| 				ensureSize(da, j) | ||||
| 				if da.Check[j] != 0 { | ||||
| 					return false | ||||
| 				} | ||||
| 			} | ||||
| 			return true | ||||
| 		}() | ||||
| 		if ok { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	da.Base[pos] = i | ||||
| 	for _, child := range children { | ||||
| 		code := child.value(seqs) | ||||
| 		j := i + code | ||||
| 		da.Check[j] = pos + 1 | ||||
| 	} | ||||
| 	terminator := len(da.Encoding) | ||||
| 	for _, child := range children { | ||||
| 		code := child.value(seqs) | ||||
| 		if code == terminator { | ||||
| 			continue | ||||
| 		} | ||||
| 		j := i + code | ||||
| 		addSeqs(da, seqs, j, *child) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func ensureSize(da *DoubleArray, i int) { | ||||
| 	for i >= len(da.Base) { | ||||
| 		da.Base = append(da.Base, make([]int, len(da.Base)+1)...) | ||||
| 		da.Check = append(da.Check, make([]int, len(da.Check)+1)...) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| type byLex [][]int | ||||
| 
 | ||||
| func (l byLex) Len() int      { return len(l) } | ||||
| func (l byLex) Swap(i, j int) { l[i], l[j] = l[j], l[i] } | ||||
| func (l byLex) Less(i, j int) bool { | ||||
| 	si := l[i] | ||||
| 	sj := l[j] | ||||
| 	var k int | ||||
| 	for k = 0; k < len(si) && k < len(sj); k++ { | ||||
| 		if si[k] < sj[k] { | ||||
| 			return true | ||||
| 		} | ||||
| 		if si[k] > sj[k] { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 	return k < len(sj) | ||||
| } | ||||
| 
 | ||||
| // HasCommonPrefix determines if any sequence in the DoubleArray is a prefix of the given sequence. | ||||
| func (da *DoubleArray) HasCommonPrefix(seq []string) bool { | ||||
| 	if len(da.Base) == 0 { | ||||
| 		return false | ||||
| 	} | ||||
| 
 | ||||
| 	var i int | ||||
| 	for _, t := range seq { | ||||
| 		code, ok := da.Encoding[t] | ||||
| 		if !ok { | ||||
| 			break | ||||
| 		} | ||||
| 		j := da.Base[i] + code | ||||
| 		if len(da.Check) <= j || da.Check[j] != i+1 { | ||||
| 			break | ||||
| 		} | ||||
| 		i = j | ||||
| 	} | ||||
| 	j := da.Base[i] + len(da.Encoding) | ||||
| 	if len(da.Check) <= j || da.Check[j] != i+1 { | ||||
| 		return false | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue