init: 基础部署文件(项目可参考)
This commit is contained in:
		
						commit
						141bd031d4
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | .idea | ||||||
							
								
								
									
										5
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								go.mod
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | module git.hongxiaowei.com/xiaowei/service | ||||||
|  | 
 | ||||||
|  | go 1.17 | ||||||
|  | 
 | ||||||
|  | require go.uber.org/automaxprocs v1.4.0 | ||||||
							
								
								
									
										16
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								go.sum
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= | ||||||
|  | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||||
|  | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||||
|  | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||||
|  | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||||
|  | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
|  | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
|  | github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= | ||||||
|  | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||||
|  | go.uber.org/automaxprocs v1.4.0 h1:CpDZl6aOlLhReez+8S3eEotD7Jx0Os++lemPlMULQP0= | ||||||
|  | go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= | ||||||
|  | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= | ||||||
|  | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
							
								
								
									
										31
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"go.uber.org/automaxprocs/maxprocs" | ||||||
|  | 	"log" | ||||||
|  | 	"os" | ||||||
|  | 	"os/signal" | ||||||
|  | 	"runtime" | ||||||
|  | 	"syscall" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var build = "develop" | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  | 
 | ||||||
|  | 	// Set the correct number of threads for the service
 | ||||||
|  | 	// based on what is available either by the machine or quoras.
 | ||||||
|  | 	if _, err := maxprocs.Set(); err != nil { | ||||||
|  | 		log.Println(err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	g := runtime.GOMAXPROCS(0) | ||||||
|  | 	log.Printf("starting service build[%s] CPU[%d]", build, g) | ||||||
|  | 	defer log.Println("service ended") | ||||||
|  | 
 | ||||||
|  | 	shutdown := make(chan os.Signal, 1) | ||||||
|  | 	signal.Notify(shutdown, syscall.SIGINT, syscall.SIGTERM) | ||||||
|  | 	<-shutdown | ||||||
|  | 
 | ||||||
|  | 	log.Println("stopping service") | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | |||||||
|  | SHELL := /bin/bash | ||||||
|  | 
 | ||||||
|  | run: | ||||||
|  | 	go run main.go | ||||||
|  | 
 | ||||||
|  | build: | ||||||
|  | 	go build -ldflags "-X main.build=local" | ||||||
|  | 
 | ||||||
|  | # =========================================================
 | ||||||
|  | # Building containers
 | ||||||
|  | 
 | ||||||
|  | VERSION :=1.0 | ||||||
|  | 
 | ||||||
|  | all: service | ||||||
|  | 
 | ||||||
|  | service: | ||||||
|  | 	docker build \
 | ||||||
|  |     -f zarf/docker/Dockerfile \
 | ||||||
|  |     -t service-amd64:$(VERSION) \
 | ||||||
|  |     --build-arg BUILD_REF=$(VERSION) \
 | ||||||
|  |     --build-arg BUILD_DATA=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
 | ||||||
|  |     . | ||||||
|  | 
 | ||||||
|  | # =========================================================
 | ||||||
|  | # Running from within k8s/kind
 | ||||||
|  | 
 | ||||||
|  | KIND_CLUSTER := xiaowei-starter-cluster | ||||||
|  | 
 | ||||||
|  | kind-up: | ||||||
|  | 	kind create cluster \
 | ||||||
|  | 		--image kindest/node:v1.21.1 \
 | ||||||
|  | 		--name $(KIND_CLUSTER) \
 | ||||||
|  | 		--config zarf/k8s/kind/kind-config.yaml | ||||||
|  | 	kubectl config set-context --current --namespace service-system | ||||||
|  | 
 | ||||||
|  | kind-down: | ||||||
|  | 	kind delete cluster --name $(KIND_CLUSTER) | ||||||
|  | 
 | ||||||
|  | kind-status: | ||||||
|  | 	kubectl get nodes -o wide | ||||||
|  | 	kubectl get svc -o wide | ||||||
|  | 	kubectl get pods -o wide | ||||||
|  | 
 | ||||||
|  | kind-load: | ||||||
|  | 	kind load docker-image service-amd64:$(VERSION) --name $(KIND_CLUSTER) | ||||||
|  | 
 | ||||||
|  | kind-apply: | ||||||
|  | 	kustomize build zarf/k8s/kind/service-pod|kubectl apply -f - | ||||||
|  | 
 | ||||||
|  | kind-logs: | ||||||
|  | 	kubectl logs -f -l app=service --all-containers=true | ||||||
|  | 
 | ||||||
|  | kind-restart: | ||||||
|  | 	kubectl rollout restart deployment service-pod | ||||||
|  | 
 | ||||||
|  | kind-update: all kind-load kind-restart | ||||||
|  | 
 | ||||||
|  | kind-update-apply: all kind-load kind-apply | ||||||
|  | 
 | ||||||
|  | kind-describe: | ||||||
|  | 	kubectl describe node | ||||||
|  | 	kubectl describe svc | ||||||
|  | 	kubectl describe deployment service-pod | ||||||
|  | 
 | ||||||
|  | # =========================================================
 | ||||||
|  | # Modules support
 | ||||||
|  | 
 | ||||||
|  | tidy: | ||||||
|  | 	go mod tidy | ||||||
|  | 	go mod vendor | ||||||
							
								
								
									
										14
									
								
								vendor/go.uber.org/automaxprocs/.codecov.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/go.uber.org/automaxprocs/.codecov.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | coverage: | ||||||
|  |   range: 80..100 | ||||||
|  |   round: down | ||||||
|  |   precision: 2 | ||||||
|  | 
 | ||||||
|  |   status: | ||||||
|  |     project:                   # measuring the overall project coverage | ||||||
|  |       default:                 # context, you can create multiple ones with custom titles | ||||||
|  |         enabled: yes           # must be yes|true to enable this status | ||||||
|  |         target: 90%            # specify the target coverage for each commit status | ||||||
|  |                                #   option: "auto" (must increase from parent commit or pull request base) | ||||||
|  |                                #   option: "X%" a static target percentage to hit | ||||||
|  |         if_not_found: success  # if parent is not found report status as success, error, or failure | ||||||
|  |         if_ci_failed: error    # if ci fails report status as success, error, or failure | ||||||
							
								
								
									
										33
									
								
								vendor/go.uber.org/automaxprocs/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/go.uber.org/automaxprocs/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | # Compiled Object files, Static and Dynamic libs (Shared Objects) | ||||||
|  | *.o | ||||||
|  | *.a | ||||||
|  | *.so | ||||||
|  | 
 | ||||||
|  | # Folders | ||||||
|  | _obj | ||||||
|  | _test | ||||||
|  | vendor | ||||||
|  | 
 | ||||||
|  | # Architecture specific extensions/prefixes | ||||||
|  | *.[568vq] | ||||||
|  | [568vq].out | ||||||
|  | 
 | ||||||
|  | *.cgo1.go | ||||||
|  | *.cgo2.c | ||||||
|  | _cgo_defun.c | ||||||
|  | _cgo_gotypes.go | ||||||
|  | _cgo_export.* | ||||||
|  | 
 | ||||||
|  | _testmain.go | ||||||
|  | 
 | ||||||
|  | *.exe | ||||||
|  | *.test | ||||||
|  | *.prof | ||||||
|  | *.pprof | ||||||
|  | *.out | ||||||
|  | *.log | ||||||
|  | coverage.txt | ||||||
|  | 
 | ||||||
|  | /bin | ||||||
|  | cover.out | ||||||
|  | cover.html | ||||||
							
								
								
									
										24
									
								
								vendor/go.uber.org/automaxprocs/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								vendor/go.uber.org/automaxprocs/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | language: go | ||||||
|  | sudo: false | ||||||
|  | go_import_path: go.uber.org/automaxprocs | ||||||
|  | 
 | ||||||
|  | env: | ||||||
|  |   global: | ||||||
|  |     - GO111MODULE=on | ||||||
|  | 
 | ||||||
|  | matrix: | ||||||
|  |   include: | ||||||
|  |     - go: oldstable | ||||||
|  |     - go: stable | ||||||
|  |       env: LINT=1 | ||||||
|  | 
 | ||||||
|  | install: | ||||||
|  |   - make install | ||||||
|  | 
 | ||||||
|  | script: | ||||||
|  |   - test -z "$LINT" || make lint | ||||||
|  |   - make test | ||||||
|  | 
 | ||||||
|  | after_success: | ||||||
|  |   - make cover | ||||||
|  |   - bash <(curl -s https://codecov.io/bash) | ||||||
							
								
								
									
										26
									
								
								vendor/go.uber.org/automaxprocs/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/go.uber.org/automaxprocs/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | # Changelog | ||||||
|  | 
 | ||||||
|  | ## v1.4.0 (2021-02-01) | ||||||
|  | 
 | ||||||
|  | - Support colons in cgroup names. | ||||||
|  | - Remove linters from runtime dependencies. | ||||||
|  | 
 | ||||||
|  | ## v1.3.0 (2020-01-23) | ||||||
|  | 
 | ||||||
|  | - Migrate to Go modules. | ||||||
|  | 
 | ||||||
|  | ## v1.2.0 (2018-02-22) | ||||||
|  | 
 | ||||||
|  | - Fixed quota clamping to always round down rather than up; Rather than | ||||||
|  |   guaranteeing constant throttling at saturation, instead assume that the | ||||||
|  |   fractional CPU was added as a hedge for factors outside of Go's scheduler. | ||||||
|  | 
 | ||||||
|  | ## v1.1.0 (2017-11-10) | ||||||
|  | 
 | ||||||
|  | - Log the new value of `GOMAXPROCS` rather than the current value. | ||||||
|  | - Make logs more explicit about whether `GOMAXPROCS` was modified or not. | ||||||
|  | - Allow customization of the minimum `GOMAXPROCS`, and modify default from 2 to 1. | ||||||
|  | 
 | ||||||
|  | ## v1.0.0 (2017-08-09) | ||||||
|  | 
 | ||||||
|  | - Initial release. | ||||||
							
								
								
									
										75
									
								
								vendor/go.uber.org/automaxprocs/CODE_OF_CONDUCT.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								vendor/go.uber.org/automaxprocs/CODE_OF_CONDUCT.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | |||||||
|  | # Contributor Covenant Code of Conduct | ||||||
|  | 
 | ||||||
|  | ## Our Pledge | ||||||
|  | 
 | ||||||
|  | In the interest of fostering an open and welcoming environment, we as | ||||||
|  | contributors and maintainers pledge to making participation in our project and | ||||||
|  | our community a harassment-free experience for everyone, regardless of age, | ||||||
|  | body size, disability, ethnicity, gender identity and expression, level of | ||||||
|  | experience, nationality, personal appearance, race, religion, or sexual | ||||||
|  | identity and orientation. | ||||||
|  | 
 | ||||||
|  | ## Our Standards | ||||||
|  | 
 | ||||||
|  | Examples of behavior that contributes to creating a positive environment | ||||||
|  | include: | ||||||
|  | 
 | ||||||
|  | * Using welcoming and inclusive language | ||||||
|  | * Being respectful of differing viewpoints and experiences | ||||||
|  | * Gracefully accepting constructive criticism | ||||||
|  | * Focusing on what is best for the community | ||||||
|  | * Showing empathy towards other community members | ||||||
|  | 
 | ||||||
|  | Examples of unacceptable behavior by participants include: | ||||||
|  | 
 | ||||||
|  | * The use of sexualized language or imagery and unwelcome sexual attention or | ||||||
|  |   advances | ||||||
|  | * Trolling, insulting/derogatory comments, and personal or political attacks | ||||||
|  | * Public or private harassment | ||||||
|  | * Publishing others' private information, such as a physical or electronic | ||||||
|  |   address, without explicit permission | ||||||
|  | * Other conduct which could reasonably be considered inappropriate in a | ||||||
|  |   professional setting | ||||||
|  | 
 | ||||||
|  | ## Our Responsibilities | ||||||
|  | 
 | ||||||
|  | Project maintainers are responsible for clarifying the standards of acceptable | ||||||
|  | behavior and are expected to take appropriate and fair corrective action in | ||||||
|  | response to any instances of unacceptable behavior. | ||||||
|  | 
 | ||||||
|  | Project maintainers have the right and responsibility to remove, edit, or | ||||||
|  | reject comments, commits, code, wiki edits, issues, and other contributions | ||||||
|  | that are not aligned to this Code of Conduct, or to ban temporarily or | ||||||
|  | permanently any contributor for other behaviors that they deem inappropriate, | ||||||
|  | threatening, offensive, or harmful. | ||||||
|  | 
 | ||||||
|  | ## Scope | ||||||
|  | 
 | ||||||
|  | This Code of Conduct applies both within project spaces and in public spaces | ||||||
|  | when an individual is representing the project or its community. Examples of | ||||||
|  | representing a project or community include using an official project e-mail | ||||||
|  | address, posting via an official social media account, or acting as an | ||||||
|  | appointed representative at an online or offline event. Representation of a | ||||||
|  | project may be further defined and clarified by project maintainers. | ||||||
|  | 
 | ||||||
|  | ## Enforcement | ||||||
|  | 
 | ||||||
|  | Instances of abusive, harassing, or otherwise unacceptable behavior may be | ||||||
|  | reported by contacting the project team at oss-conduct@uber.com. The project | ||||||
|  | team will review and investigate all complaints, and will respond in a way | ||||||
|  | that it deems appropriate to the circumstances. The project team is obligated | ||||||
|  | to maintain confidentiality with regard to the reporter of an incident. | ||||||
|  | Further details of specific enforcement policies may be posted separately. | ||||||
|  | 
 | ||||||
|  | Project maintainers who do not follow or enforce the Code of Conduct in good | ||||||
|  | faith may face temporary or permanent repercussions as determined by other | ||||||
|  | members of the project's leadership. | ||||||
|  | 
 | ||||||
|  | ## Attribution | ||||||
|  | 
 | ||||||
|  | This Code of Conduct is adapted from the [Contributor Covenant][homepage], | ||||||
|  | version 1.4, available at | ||||||
|  | [http://contributor-covenant.org/version/1/4][version]. | ||||||
|  | 
 | ||||||
|  | [homepage]: http://contributor-covenant.org | ||||||
|  | [version]: http://contributor-covenant.org/version/1/4/ | ||||||
							
								
								
									
										81
									
								
								vendor/go.uber.org/automaxprocs/CONTRIBUTING.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								vendor/go.uber.org/automaxprocs/CONTRIBUTING.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,81 @@ | |||||||
|  | # Contributing | ||||||
|  | 
 | ||||||
|  | We'd love your help improving this package! | ||||||
|  | 
 | ||||||
|  | If you'd like to add new exported APIs, please [open an issue][open-issue] | ||||||
|  | describing your proposal — discussing API changes ahead of time makes | ||||||
|  | pull request review much smoother. In your issue, pull request, and any other | ||||||
|  | communications, please remember to treat your fellow contributors with | ||||||
|  | respect! We take our [code of conduct](CODE_OF_CONDUCT.md) seriously. | ||||||
|  | 
 | ||||||
|  | Note that you'll need to sign [Uber's Contributor License Agreement][cla] | ||||||
|  | before we can accept any of your contributions. If necessary, a bot will remind | ||||||
|  | you to accept the CLA when you open your pull request. | ||||||
|  | 
 | ||||||
|  | ## Setup | ||||||
|  | 
 | ||||||
|  | [Fork][fork], then clone the repository: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | mkdir -p $GOPATH/src/go.uber.org | ||||||
|  | cd $GOPATH/src/go.uber.org | ||||||
|  | git clone git@github.com:your_github_username/automaxprocs.git | ||||||
|  | cd automaxprocs | ||||||
|  | git remote add upstream https://github.com/uber-go/automaxprocs.git | ||||||
|  | git fetch upstream | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Install the test dependencies: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | make dependencies | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Make sure that the tests and the linters pass: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | make test | ||||||
|  | make lint | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | If you're not using the minor version of Go specified in the Makefile's | ||||||
|  | `LINTABLE_MINOR_VERSIONS` variable, `make lint` doesn't do anything. This is | ||||||
|  | fine, but it means that you'll only discover lint failures after you open your | ||||||
|  | pull request. | ||||||
|  | 
 | ||||||
|  | ## Making Changes | ||||||
|  | 
 | ||||||
|  | Start by creating a new branch for your changes: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | cd $GOPATH/src/go.uber.org/automaxprocs | ||||||
|  | git checkout master | ||||||
|  | git fetch upstream | ||||||
|  | git rebase upstream/master | ||||||
|  | git checkout -b cool_new_feature | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Make your changes, then ensure that `make lint` and `make test` still pass. If | ||||||
|  | you're satisfied with your changes, push them to your fork. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | git push origin cool_new_feature | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Then use the GitHub UI to open a pull request. | ||||||
|  | 
 | ||||||
|  | At this point, you're waiting on us to review your changes. We *try* to respond | ||||||
|  | to issues and pull requests within a few business days, and we may suggest some | ||||||
|  | improvements or alternatives. Once your changes are approved, one of the | ||||||
|  | project maintainers will merge them. | ||||||
|  | 
 | ||||||
|  | We're much more likely to approve your changes if you: | ||||||
|  | 
 | ||||||
|  | * Add tests for new functionality. | ||||||
|  | * Write a [good commit message][commit-message]. | ||||||
|  | * Maintain backward compatibility. | ||||||
|  | 
 | ||||||
|  | [fork]: https://github.com/uber-go/automaxprocs/fork | ||||||
|  | [open-issue]: https://github.com/uber-go/automaxprocs/issues/new | ||||||
|  | [cla]: https://cla-assistant.io/uber-go/automaxprocs | ||||||
|  | [commit-message]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html | ||||||
							
								
								
									
										19
									
								
								vendor/go.uber.org/automaxprocs/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/go.uber.org/automaxprocs/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | Copyright (c) 2017 Uber Technologies, Inc. | ||||||
|  | 
 | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | in the Software without restriction, including without limitation the rights | ||||||
|  | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  | copies of the Software, and to permit persons to whom the Software is | ||||||
|  | furnished to do so, subject to the following conditions: | ||||||
|  | 
 | ||||||
|  | The above copyright notice and this permission notice shall be included in | ||||||
|  | all copies or substantial portions of the Software. | ||||||
|  | 
 | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  | THE SOFTWARE. | ||||||
							
								
								
									
										46
									
								
								vendor/go.uber.org/automaxprocs/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								vendor/go.uber.org/automaxprocs/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | |||||||
|  | export GOBIN ?= $(shell pwd)/bin | ||||||
|  | 
 | ||||||
|  | GO_FILES := $(shell \
 | ||||||
|  | 	find . '(' -path '*/.*' -o -path './vendor' ')' -prune \
 | ||||||
|  | 	-o -name '*.go' -print | cut -b3-) | ||||||
|  | 
 | ||||||
|  | GOLINT = $(GOBIN)/golint | ||||||
|  | STATICCHECK = $(GOBIN)/staticcheck | ||||||
|  | 
 | ||||||
|  | .PHONY: build | ||||||
|  | build: | ||||||
|  | 	go build ./... | ||||||
|  | 
 | ||||||
|  | .PHONY: install | ||||||
|  | install: | ||||||
|  | 	go mod download | ||||||
|  | 
 | ||||||
|  | .PHONY: test | ||||||
|  | test: | ||||||
|  | 	go test -race ./... | ||||||
|  | 
 | ||||||
|  | .PHONY: cover | ||||||
|  | cover: | ||||||
|  | 	go test -coverprofile=cover.out -covermode=atomic -coverpkg=./... ./... | ||||||
|  | 	go tool cover -html=cover.out -o cover.html | ||||||
|  | 
 | ||||||
|  | $(GOLINT): tools/go.mod | ||||||
|  | 	cd tools && go install golang.org/x/lint/golint | ||||||
|  | 
 | ||||||
|  | $(STATICCHECK): tools/go.mod | ||||||
|  | 	cd tools && go install honnef.co/go/tools/cmd/staticcheck | ||||||
|  | 
 | ||||||
|  | .PHONY: lint | ||||||
|  | lint: $(GOLINT) $(STATICCHECK) | ||||||
|  | 	@rm -rf lint.log | ||||||
|  | 	@echo "Checking gofmt" | ||||||
|  | 	@gofmt -d -s $(GO_FILES) 2>&1 | tee lint.log | ||||||
|  | 	@echo "Checking go vet" | ||||||
|  | 	@go vet ./... 2>&1 | tee -a lint.log | ||||||
|  | 	@echo "Checking golint" | ||||||
|  | 	@$(GOLINT) ./... | tee -a lint.log | ||||||
|  | 	@echo "Checking staticcheck" | ||||||
|  | 	@$(STATICCHECK) ./... 2>&1 |  tee -a lint.log | ||||||
|  | 	@echo "Checking for license headers..." | ||||||
|  | 	@./.build/check_license.sh | tee -a lint.log | ||||||
|  | 	@[ ! -s lint.log ] | ||||||
							
								
								
									
										46
									
								
								vendor/go.uber.org/automaxprocs/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								vendor/go.uber.org/automaxprocs/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | |||||||
|  | # automaxprocs [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] | ||||||
|  | 
 | ||||||
|  | Automatically set `GOMAXPROCS` to match Linux container CPU quota. | ||||||
|  | 
 | ||||||
|  | ## Installation | ||||||
|  | 
 | ||||||
|  | `go get -u go.uber.org/automaxprocs` | ||||||
|  | 
 | ||||||
|  | ## Quick Start | ||||||
|  | 
 | ||||||
|  | ```go | ||||||
|  | import _ "go.uber.org/automaxprocs" | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  |   // Your application logic here. | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Development Status: Stable | ||||||
|  | 
 | ||||||
|  | All APIs are finalized, and no breaking changes will be made in the 1.x series | ||||||
|  | of releases. Users of semver-aware dependency management systems should pin | ||||||
|  | automaxprocs to `^1`. | ||||||
|  | 
 | ||||||
|  | ## Contributing | ||||||
|  | 
 | ||||||
|  | We encourage and support an active, healthy community of contributors — | ||||||
|  | including you! Details are in the [contribution guide](CONTRIBUTING.md) and | ||||||
|  | the [code of conduct](CODE_OF_CONDUCT.md). The automaxprocs maintainers keep | ||||||
|  | an eye on issues and pull requests, but you can also report any negative | ||||||
|  | conduct to oss-conduct@uber.com. That email list is a private, safe space; | ||||||
|  | even the automaxprocs maintainers don't have access, so don't hesitate to hold | ||||||
|  | us to a high standard. | ||||||
|  | 
 | ||||||
|  | <hr> | ||||||
|  | 
 | ||||||
|  | Released under the [MIT License](LICENSE). | ||||||
|  | 
 | ||||||
|  | [doc-img]: https://godoc.org/go.uber.org/automaxprocs?status.svg | ||||||
|  | [doc]: https://godoc.org/go.uber.org/automaxprocs | ||||||
|  | [ci-img]: https://travis-ci.com/uber-go/automaxprocs.svg?branch=master | ||||||
|  | [ci]: https://travis-ci.com/uber-go/automaxprocs | ||||||
|  | [cov-img]: https://codecov.io/gh/uber-go/automaxprocs/branch/master/graph/badge.svg | ||||||
|  | [cov]: https://codecov.io/gh/uber-go/automaxprocs | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
							
								
								
									
										33
									
								
								vendor/go.uber.org/automaxprocs/automaxprocs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/go.uber.org/automaxprocs/automaxprocs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | // Package automaxprocs automatically sets GOMAXPROCS to match the Linux
 | ||||||
|  | // container CPU quota, if any.
 | ||||||
|  | package automaxprocs // import "go.uber.org/automaxprocs"
 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"log" | ||||||
|  | 
 | ||||||
|  | 	"go.uber.org/automaxprocs/maxprocs" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	maxprocs.Set(maxprocs.Logger(log.Printf)) | ||||||
|  | } | ||||||
							
								
								
									
										7
									
								
								vendor/go.uber.org/automaxprocs/glide.yaml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								vendor/go.uber.org/automaxprocs/glide.yaml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | package: go.uber.org/automaxprocs | ||||||
|  | import: [] | ||||||
|  | testImport: | ||||||
|  | - package: github.com/stretchr/testify | ||||||
|  |   version: ^1.1.4 | ||||||
|  |   subpackages: | ||||||
|  |   - assert | ||||||
							
								
								
									
										78
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/cgroup.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/cgroup.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | // +build linux
 | ||||||
|  | 
 | ||||||
|  | package cgroups | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bufio" | ||||||
|  | 	"io" | ||||||
|  | 	"os" | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"strconv" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // CGroup represents the data structure for a Linux control group.
 | ||||||
|  | type CGroup struct { | ||||||
|  | 	path string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewCGroup returns a new *CGroup from a given path.
 | ||||||
|  | func NewCGroup(path string) *CGroup { | ||||||
|  | 	return &CGroup{path: path} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Path returns the path of the CGroup*.
 | ||||||
|  | func (cg *CGroup) Path() string { | ||||||
|  | 	return cg.path | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ParamPath returns the path of the given cgroup param under itself.
 | ||||||
|  | func (cg *CGroup) ParamPath(param string) string { | ||||||
|  | 	return filepath.Join(cg.path, param) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // readFirstLine reads the first line from a cgroup param file.
 | ||||||
|  | func (cg *CGroup) readFirstLine(param string) (string, error) { | ||||||
|  | 	paramFile, err := os.Open(cg.ParamPath(param)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	defer paramFile.Close() | ||||||
|  | 
 | ||||||
|  | 	scanner := bufio.NewScanner(paramFile) | ||||||
|  | 	if scanner.Scan() { | ||||||
|  | 		return scanner.Text(), nil | ||||||
|  | 	} | ||||||
|  | 	if err := scanner.Err(); err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	return "", io.ErrUnexpectedEOF | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // readInt parses the first line from a cgroup param file as int.
 | ||||||
|  | func (cg *CGroup) readInt(param string) (int, error) { | ||||||
|  | 	text, err := cg.readFirstLine(param) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	return strconv.Atoi(text) | ||||||
|  | } | ||||||
							
								
								
									
										117
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/cgroups.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/cgroups.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,117 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | // +build linux
 | ||||||
|  | 
 | ||||||
|  | package cgroups | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// _cgroupFSType is the Linux CGroup file system type used in
 | ||||||
|  | 	// `/proc/$PID/mountinfo`.
 | ||||||
|  | 	_cgroupFSType = "cgroup" | ||||||
|  | 	// _cgroupSubsysCPU is the CPU CGroup subsystem.
 | ||||||
|  | 	_cgroupSubsysCPU = "cpu" | ||||||
|  | 	// _cgroupSubsysCPUAcct is the CPU accounting CGroup subsystem.
 | ||||||
|  | 	_cgroupSubsysCPUAcct = "cpuacct" | ||||||
|  | 	// _cgroupSubsysCPUSet is the CPUSet CGroup subsystem.
 | ||||||
|  | 	_cgroupSubsysCPUSet = "cpuset" | ||||||
|  | 	// _cgroupSubsysMemory is the Memory CGroup subsystem.
 | ||||||
|  | 	_cgroupSubsysMemory = "memory" | ||||||
|  | 
 | ||||||
|  | 	// _cgroupCPUCFSQuotaUsParam is the file name for the CGroup CFS quota
 | ||||||
|  | 	// parameter.
 | ||||||
|  | 	_cgroupCPUCFSQuotaUsParam = "cpu.cfs_quota_us" | ||||||
|  | 	// _cgroupCPUCFSPeriodUsParam is the file name for the CGroup CFS period
 | ||||||
|  | 	// parameter.
 | ||||||
|  | 	_cgroupCPUCFSPeriodUsParam = "cpu.cfs_period_us" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	_procPathCGroup    = "/proc/self/cgroup" | ||||||
|  | 	_procPathMountInfo = "/proc/self/mountinfo" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // CGroups is a map that associates each CGroup with its subsystem name.
 | ||||||
|  | type CGroups map[string]*CGroup | ||||||
|  | 
 | ||||||
|  | // NewCGroups returns a new *CGroups from given `mountinfo` and `cgroup` files
 | ||||||
|  | // under for some process under `/proc` file system (see also proc(5) for more
 | ||||||
|  | // information).
 | ||||||
|  | func NewCGroups(procPathMountInfo, procPathCGroup string) (CGroups, error) { | ||||||
|  | 	cgroupSubsystems, err := parseCGroupSubsystems(procPathCGroup) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	cgroups := make(CGroups) | ||||||
|  | 	newMountPoint := func(mp *MountPoint) error { | ||||||
|  | 		if mp.FSType != _cgroupFSType { | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for _, opt := range mp.SuperOptions { | ||||||
|  | 			subsys, exists := cgroupSubsystems[opt] | ||||||
|  | 			if !exists { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			cgroupPath, err := mp.Translate(subsys.Name) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			cgroups[opt] = NewCGroup(cgroupPath) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := parseMountInfo(procPathMountInfo, newMountPoint); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return cgroups, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewCGroupsForCurrentProcess returns a new *CGroups instance for the current
 | ||||||
|  | // process.
 | ||||||
|  | func NewCGroupsForCurrentProcess() (CGroups, error) { | ||||||
|  | 	return NewCGroups(_procPathMountInfo, _procPathCGroup) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // CPUQuota returns the CPU quota applied with the CPU cgroup controller.
 | ||||||
|  | // It is a result of `cpu.cfs_quota_us / cpu.cfs_period_us`. If the value of
 | ||||||
|  | // `cpu.cfs_quota_us` was not set (-1), the method returns `(-1, nil)`.
 | ||||||
|  | func (cg CGroups) CPUQuota() (float64, bool, error) { | ||||||
|  | 	cpuCGroup, exists := cg[_cgroupSubsysCPU] | ||||||
|  | 	if !exists { | ||||||
|  | 		return -1, false, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	cfsQuotaUs, err := cpuCGroup.readInt(_cgroupCPUCFSQuotaUsParam) | ||||||
|  | 	if defined := cfsQuotaUs > 0; err != nil || !defined { | ||||||
|  | 		return -1, defined, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	cfsPeriodUs, err := cpuCGroup.readInt(_cgroupCPUCFSPeriodUsParam) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return -1, false, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return float64(cfsQuotaUs) / float64(cfsPeriodUs), true, nil | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | // Package cgroups provides utilities to access Linux control group (CGroups)
 | ||||||
|  | // parameters (CPU quota, for example) for a given process.
 | ||||||
|  | package cgroups | ||||||
							
								
								
									
										51
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | // +build linux
 | ||||||
|  | 
 | ||||||
|  | package cgroups | ||||||
|  | 
 | ||||||
|  | import "fmt" | ||||||
|  | 
 | ||||||
|  | type cgroupSubsysFormatInvalidError struct { | ||||||
|  | 	line string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type mountPointFormatInvalidError struct { | ||||||
|  | 	line string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type pathNotExposedFromMountPointError struct { | ||||||
|  | 	mountPoint string | ||||||
|  | 	root       string | ||||||
|  | 	path       string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (err cgroupSubsysFormatInvalidError) Error() string { | ||||||
|  | 	return fmt.Sprintf("invalid format for CGroupSubsys: %q", err.line) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (err mountPointFormatInvalidError) Error() string { | ||||||
|  | 	return fmt.Sprintf("invalid format for MountPoint: %q", err.line) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (err pathNotExposedFromMountPointError) Error() string { | ||||||
|  | 	return fmt.Sprintf("path %q is not a descendant of mount point root %q and cannot be exposed from %q", err.path, err.root, err.mountPoint) | ||||||
|  | } | ||||||
							
								
								
									
										166
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/mountpoint.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/mountpoint.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,166 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | // +build linux
 | ||||||
|  | 
 | ||||||
|  | package cgroups | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bufio" | ||||||
|  | 	"os" | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	_mountInfoSep               = " " | ||||||
|  | 	_mountInfoOptsSep           = "," | ||||||
|  | 	_mountInfoOptionalFieldsSep = "-" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	_miFieldIDMountID = iota | ||||||
|  | 	_miFieldIDParentID | ||||||
|  | 	_miFieldIDDeviceID | ||||||
|  | 	_miFieldIDRoot | ||||||
|  | 	_miFieldIDMountPoint | ||||||
|  | 	_miFieldIDOptions | ||||||
|  | 	_miFieldIDOptionalFields | ||||||
|  | 
 | ||||||
|  | 	_miFieldCountFirstHalf | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	_miFieldOffsetFSType = iota | ||||||
|  | 	_miFieldOffsetMountSource | ||||||
|  | 	_miFieldOffsetSuperOptions | ||||||
|  | 
 | ||||||
|  | 	_miFieldCountSecondHalf | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const _miFieldCountMin = _miFieldCountFirstHalf + _miFieldCountSecondHalf | ||||||
|  | 
 | ||||||
|  | // MountPoint is the data structure for the mount points in
 | ||||||
|  | // `/proc/$PID/mountinfo`. See also proc(5) for more information.
 | ||||||
|  | type MountPoint struct { | ||||||
|  | 	MountID        int | ||||||
|  | 	ParentID       int | ||||||
|  | 	DeviceID       string | ||||||
|  | 	Root           string | ||||||
|  | 	MountPoint     string | ||||||
|  | 	Options        []string | ||||||
|  | 	OptionalFields []string | ||||||
|  | 	FSType         string | ||||||
|  | 	MountSource    string | ||||||
|  | 	SuperOptions   []string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewMountPointFromLine parses a line read from `/proc/$PID/mountinfo` and
 | ||||||
|  | // returns a new *MountPoint.
 | ||||||
|  | func NewMountPointFromLine(line string) (*MountPoint, error) { | ||||||
|  | 	fields := strings.Split(line, _mountInfoSep) | ||||||
|  | 
 | ||||||
|  | 	if len(fields) < _miFieldCountMin { | ||||||
|  | 		return nil, mountPointFormatInvalidError{line} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	mountID, err := strconv.Atoi(fields[_miFieldIDMountID]) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	parentID, err := strconv.Atoi(fields[_miFieldIDParentID]) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for i, field := range fields[_miFieldIDOptionalFields:] { | ||||||
|  | 		if field == _mountInfoOptionalFieldsSep { | ||||||
|  | 			fsTypeStart := _miFieldIDOptionalFields + i + 1 | ||||||
|  | 
 | ||||||
|  | 			if len(fields) != fsTypeStart+_miFieldCountSecondHalf { | ||||||
|  | 				return nil, mountPointFormatInvalidError{line} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			miFieldIDFSType := _miFieldOffsetFSType + fsTypeStart | ||||||
|  | 			miFieldIDMountSource := _miFieldOffsetMountSource + fsTypeStart | ||||||
|  | 			miFieldIDSuperOptions := _miFieldOffsetSuperOptions + fsTypeStart | ||||||
|  | 
 | ||||||
|  | 			return &MountPoint{ | ||||||
|  | 				MountID:        mountID, | ||||||
|  | 				ParentID:       parentID, | ||||||
|  | 				DeviceID:       fields[_miFieldIDDeviceID], | ||||||
|  | 				Root:           fields[_miFieldIDRoot], | ||||||
|  | 				MountPoint:     fields[_miFieldIDMountPoint], | ||||||
|  | 				Options:        strings.Split(fields[_miFieldIDOptions], _mountInfoOptsSep), | ||||||
|  | 				OptionalFields: fields[_miFieldIDOptionalFields:(fsTypeStart - 1)], | ||||||
|  | 				FSType:         fields[miFieldIDFSType], | ||||||
|  | 				MountSource:    fields[miFieldIDMountSource], | ||||||
|  | 				SuperOptions:   strings.Split(fields[miFieldIDSuperOptions], _mountInfoOptsSep), | ||||||
|  | 			}, nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil, mountPointFormatInvalidError{line} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Translate converts an absolute path inside the *MountPoint's file system to
 | ||||||
|  | // the host file system path in the mount namespace the *MountPoint belongs to.
 | ||||||
|  | func (mp *MountPoint) Translate(absPath string) (string, error) { | ||||||
|  | 	relPath, err := filepath.Rel(mp.Root, absPath) | ||||||
|  | 
 | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	if relPath == ".." || strings.HasPrefix(relPath, "../") { | ||||||
|  | 		return "", pathNotExposedFromMountPointError{ | ||||||
|  | 			mountPoint: mp.MountPoint, | ||||||
|  | 			root:       mp.Root, | ||||||
|  | 			path:       absPath, | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return filepath.Join(mp.MountPoint, relPath), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // parseMountInfo parses procPathMountInfo (usually at `/proc/$PID/mountinfo`)
 | ||||||
|  | // and yields parsed *MountPoint into newMountPoint.
 | ||||||
|  | func parseMountInfo(procPathMountInfo string, newMountPoint func(*MountPoint) error) error { | ||||||
|  | 	mountInfoFile, err := os.Open(procPathMountInfo) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	defer mountInfoFile.Close() | ||||||
|  | 
 | ||||||
|  | 	scanner := bufio.NewScanner(mountInfoFile) | ||||||
|  | 
 | ||||||
|  | 	for scanner.Scan() { | ||||||
|  | 		mountPoint, err := NewMountPointFromLine(scanner.Text()) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		if err := newMountPoint(mountPoint); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return scanner.Err() | ||||||
|  | } | ||||||
							
								
								
									
										102
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/subsys.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								vendor/go.uber.org/automaxprocs/internal/cgroups/subsys.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,102 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | // +build linux
 | ||||||
|  | 
 | ||||||
|  | package cgroups | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bufio" | ||||||
|  | 	"os" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	_cgroupSep       = ":" | ||||||
|  | 	_cgroupSubsysSep = "," | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	_csFieldIDID = iota | ||||||
|  | 	_csFieldIDSubsystems | ||||||
|  | 	_csFieldIDName | ||||||
|  | 	_csFieldCount | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // CGroupSubsys represents the data structure for entities in
 | ||||||
|  | // `/proc/$PID/cgroup`. See also proc(5) for more information.
 | ||||||
|  | type CGroupSubsys struct { | ||||||
|  | 	ID         int | ||||||
|  | 	Subsystems []string | ||||||
|  | 	Name       string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewCGroupSubsysFromLine returns a new *CGroupSubsys by parsing a string in
 | ||||||
|  | // the format of `/proc/$PID/cgroup`
 | ||||||
|  | func NewCGroupSubsysFromLine(line string) (*CGroupSubsys, error) { | ||||||
|  | 	fields := strings.SplitN(line, _cgroupSep, _csFieldCount) | ||||||
|  | 
 | ||||||
|  | 	if len(fields) != _csFieldCount { | ||||||
|  | 		return nil, cgroupSubsysFormatInvalidError{line} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	id, err := strconv.Atoi(fields[_csFieldIDID]) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	cgroup := &CGroupSubsys{ | ||||||
|  | 		ID:         id, | ||||||
|  | 		Subsystems: strings.Split(fields[_csFieldIDSubsystems], _cgroupSubsysSep), | ||||||
|  | 		Name:       fields[_csFieldIDName], | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return cgroup, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // parseCGroupSubsystems parses procPathCGroup (usually at `/proc/$PID/cgroup`)
 | ||||||
|  | // and returns a new map[string]*CGroupSubsys.
 | ||||||
|  | func parseCGroupSubsystems(procPathCGroup string) (map[string]*CGroupSubsys, error) { | ||||||
|  | 	cgroupFile, err := os.Open(procPathCGroup) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	defer cgroupFile.Close() | ||||||
|  | 
 | ||||||
|  | 	scanner := bufio.NewScanner(cgroupFile) | ||||||
|  | 	subsystems := make(map[string]*CGroupSubsys) | ||||||
|  | 
 | ||||||
|  | 	for scanner.Scan() { | ||||||
|  | 		cgroup, err := NewCGroupSubsysFromLine(scanner.Text()) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		for _, subsys := range cgroup.Subsystems { | ||||||
|  | 			subsystems[subsys] = cgroup | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := scanner.Err(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return subsystems, nil | ||||||
|  | } | ||||||
							
								
								
									
										49
									
								
								vendor/go.uber.org/automaxprocs/internal/runtime/cpu_quota_linux.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/go.uber.org/automaxprocs/internal/runtime/cpu_quota_linux.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | // +build linux
 | ||||||
|  | 
 | ||||||
|  | package runtime | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"math" | ||||||
|  | 
 | ||||||
|  | 	cg "go.uber.org/automaxprocs/internal/cgroups" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // CPUQuotaToGOMAXPROCS converts the CPU quota applied to the calling process
 | ||||||
|  | // to a valid GOMAXPROCS value.
 | ||||||
|  | func CPUQuotaToGOMAXPROCS(minValue int) (int, CPUQuotaStatus, error) { | ||||||
|  | 	cgroups, err := cg.NewCGroupsForCurrentProcess() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return -1, CPUQuotaUndefined, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	quota, defined, err := cgroups.CPUQuota() | ||||||
|  | 	if !defined || err != nil { | ||||||
|  | 		return -1, CPUQuotaUndefined, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	maxProcs := int(math.Floor(quota)) | ||||||
|  | 	if minValue > 0 && maxProcs < minValue { | ||||||
|  | 		return minValue, CPUQuotaMinUsed, nil | ||||||
|  | 	} | ||||||
|  | 	return maxProcs, CPUQuotaUsed, nil | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								vendor/go.uber.org/automaxprocs/internal/runtime/cpu_quota_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								vendor/go.uber.org/automaxprocs/internal/runtime/cpu_quota_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | // +build !linux
 | ||||||
|  | 
 | ||||||
|  | package runtime | ||||||
|  | 
 | ||||||
|  | // CPUQuotaToGOMAXPROCS converts the CPU quota applied to the calling process
 | ||||||
|  | // to a valid GOMAXPROCS value. This is Linux-specific and not supported in the
 | ||||||
|  | // current OS.
 | ||||||
|  | func CPUQuotaToGOMAXPROCS(_ int) (int, CPUQuotaStatus, error) { | ||||||
|  | 	return -1, CPUQuotaUndefined, nil | ||||||
|  | } | ||||||
							
								
								
									
										33
									
								
								vendor/go.uber.org/automaxprocs/internal/runtime/runtime.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/go.uber.org/automaxprocs/internal/runtime/runtime.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | package runtime | ||||||
|  | 
 | ||||||
|  | // CPUQuotaStatus presents the status of how CPU quota is used
 | ||||||
|  | type CPUQuotaStatus int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// CPUQuotaUndefined is returned when CPU quota is undefined
 | ||||||
|  | 	CPUQuotaUndefined CPUQuotaStatus = iota | ||||||
|  | 	// CPUQuotaUsed is returned when a valid CPU quota can be used
 | ||||||
|  | 	CPUQuotaUsed | ||||||
|  | 	// CPUQuotaMinUsed is return when CPU quota is smaller than the min value
 | ||||||
|  | 	CPUQuotaMinUsed | ||||||
|  | ) | ||||||
							
								
								
									
										130
									
								
								vendor/go.uber.org/automaxprocs/maxprocs/maxprocs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								vendor/go.uber.org/automaxprocs/maxprocs/maxprocs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,130 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | // Package maxprocs lets Go programs easily configure runtime.GOMAXPROCS to
 | ||||||
|  | // match the configured Linux CPU quota. Unlike the top-level automaxprocs
 | ||||||
|  | // package, it lets the caller configure logging and handle errors.
 | ||||||
|  | package maxprocs // import "go.uber.org/automaxprocs/maxprocs"
 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"os" | ||||||
|  | 	"runtime" | ||||||
|  | 
 | ||||||
|  | 	iruntime "go.uber.org/automaxprocs/internal/runtime" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const _maxProcsKey = "GOMAXPROCS" | ||||||
|  | 
 | ||||||
|  | func currentMaxProcs() int { | ||||||
|  | 	return runtime.GOMAXPROCS(0) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type config struct { | ||||||
|  | 	printf        func(string, ...interface{}) | ||||||
|  | 	procs         func(int) (int, iruntime.CPUQuotaStatus, error) | ||||||
|  | 	minGOMAXPROCS int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *config) log(fmt string, args ...interface{}) { | ||||||
|  | 	if c.printf != nil { | ||||||
|  | 		c.printf(fmt, args...) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // An Option alters the behavior of Set.
 | ||||||
|  | type Option interface { | ||||||
|  | 	apply(*config) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Logger uses the supplied printf implementation for log output. By default,
 | ||||||
|  | // Set doesn't log anything.
 | ||||||
|  | func Logger(printf func(string, ...interface{})) Option { | ||||||
|  | 	return optionFunc(func(cfg *config) { | ||||||
|  | 		cfg.printf = printf | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Min sets the minimum GOMAXPROCS value that will be used.
 | ||||||
|  | // Any value below 1 is ignored.
 | ||||||
|  | func Min(n int) Option { | ||||||
|  | 	return optionFunc(func(cfg *config) { | ||||||
|  | 		if n >= 1 { | ||||||
|  | 			cfg.minGOMAXPROCS = n | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type optionFunc func(*config) | ||||||
|  | 
 | ||||||
|  | func (of optionFunc) apply(cfg *config) { of(cfg) } | ||||||
|  | 
 | ||||||
|  | // Set GOMAXPROCS to match the Linux container CPU quota (if any), returning
 | ||||||
|  | // any error encountered and an undo function.
 | ||||||
|  | //
 | ||||||
|  | // Set is a no-op on non-Linux systems and in Linux environments without a
 | ||||||
|  | // configured CPU quota.
 | ||||||
|  | func Set(opts ...Option) (func(), error) { | ||||||
|  | 	cfg := &config{ | ||||||
|  | 		procs:         iruntime.CPUQuotaToGOMAXPROCS, | ||||||
|  | 		minGOMAXPROCS: 1, | ||||||
|  | 	} | ||||||
|  | 	for _, o := range opts { | ||||||
|  | 		o.apply(cfg) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	undoNoop := func() { | ||||||
|  | 		cfg.log("maxprocs: No GOMAXPROCS change to reset") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Honor the GOMAXPROCS environment variable if present. Otherwise, amend
 | ||||||
|  | 	// `runtime.GOMAXPROCS()` with the current process' CPU quota if the OS is
 | ||||||
|  | 	// Linux, and guarantee a minimum value of 1. The minimum guaranteed value
 | ||||||
|  | 	// can be overriden using `maxprocs.Min()`.
 | ||||||
|  | 	if max, exists := os.LookupEnv(_maxProcsKey); exists { | ||||||
|  | 		cfg.log("maxprocs: Honoring GOMAXPROCS=%q as set in environment", max) | ||||||
|  | 		return undoNoop, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	maxProcs, status, err := cfg.procs(cfg.minGOMAXPROCS) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return undoNoop, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if status == iruntime.CPUQuotaUndefined { | ||||||
|  | 		cfg.log("maxprocs: Leaving GOMAXPROCS=%v: CPU quota undefined", currentMaxProcs()) | ||||||
|  | 		return undoNoop, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	prev := currentMaxProcs() | ||||||
|  | 	undo := func() { | ||||||
|  | 		cfg.log("maxprocs: Resetting GOMAXPROCS to %v", prev) | ||||||
|  | 		runtime.GOMAXPROCS(prev) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	switch status { | ||||||
|  | 	case iruntime.CPUQuotaMinUsed: | ||||||
|  | 		cfg.log("maxprocs: Updating GOMAXPROCS=%v: using minimum allowed GOMAXPROCS", maxProcs) | ||||||
|  | 	case iruntime.CPUQuotaUsed: | ||||||
|  | 		cfg.log("maxprocs: Updating GOMAXPROCS=%v: determined from CPU quota", maxProcs) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	runtime.GOMAXPROCS(maxProcs) | ||||||
|  | 	return undo, nil | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								vendor/go.uber.org/automaxprocs/maxprocs/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								vendor/go.uber.org/automaxprocs/maxprocs/version.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | // Copyright (c) 2017 Uber Technologies, Inc.
 | ||||||
|  | //
 | ||||||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | ||||||
|  | // of this software and associated documentation files (the "Software"), to deal
 | ||||||
|  | // in the Software without restriction, including without limitation the rights
 | ||||||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | ||||||
|  | // copies of the Software, and to permit persons to whom the Software is
 | ||||||
|  | // furnished to do so, subject to the following conditions:
 | ||||||
|  | //
 | ||||||
|  | // The above copyright notice and this permission notice shall be included in
 | ||||||
|  | // all copies or substantial portions of the Software.
 | ||||||
|  | //
 | ||||||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | ||||||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | ||||||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | ||||||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | ||||||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | ||||||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
|  | // THE SOFTWARE.
 | ||||||
|  | 
 | ||||||
|  | package maxprocs | ||||||
|  | 
 | ||||||
|  | // Version is the current package version.
 | ||||||
|  | const Version = "1.4.0" | ||||||
							
								
								
									
										6
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | # go.uber.org/automaxprocs v1.4.0 | ||||||
|  | ## explicit; go 1.13 | ||||||
|  | go.uber.org/automaxprocs | ||||||
|  | go.uber.org/automaxprocs/internal/cgroups | ||||||
|  | go.uber.org/automaxprocs/internal/runtime | ||||||
|  | go.uber.org/automaxprocs/maxprocs | ||||||
							
								
								
									
										29
									
								
								zarf/docker/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								zarf/docker/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | # Build the Go Binary | ||||||
|  | FROM golang:1.17 as build_sales-api | ||||||
|  | ENV CGO_ENABLE 0 | ||||||
|  | ENV GOPROXY https://goproxy.io,direct | ||||||
|  | ARG BUILD_REF | ||||||
|  | 
 | ||||||
|  | # Copy the source code into the container | ||||||
|  | COPY . /service | ||||||
|  | 
 | ||||||
|  | # Build the service binary | ||||||
|  | WORKDIR /service | ||||||
|  | RUN go build -ldflags "-X main.build=${BUILD_REF}" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # todo 设置时区 | ||||||
|  | # Run the Go Binary in Alpine | ||||||
|  | FROM alpine:3.14 | ||||||
|  | ARG BUILD_DATE | ||||||
|  | ARG BUILD_REF | ||||||
|  | COPY --from=build_sales-api /service/service /service/service | ||||||
|  | WORKDIR /service | ||||||
|  | CMD ["./service"] | ||||||
|  | 
 | ||||||
|  | LABEL org.opencontainers.image.created="${BUILD_DATE}" \ | ||||||
|  |       org.opencontainers.image.title="service" \ | ||||||
|  |       org.opencontainers.image.author="xiaoweihong" \ | ||||||
|  |       org.opencontainers.image.source="git.hongxiaowei.com/xiaowei/service" \ | ||||||
|  |       org.opencontainers.image.revision="${BUILD_REF}" \ | ||||||
|  |       org.opencontainers.image.vendor="Xiao Wei" | ||||||
							
								
								
									
										26
									
								
								zarf/k8s/base/service-pod/base-service.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								zarf/k8s/base/service-pod/base-service.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | apiVersion: v1 | ||||||
|  | kind: Namespace | ||||||
|  | metadata: | ||||||
|  |   name: service-system | ||||||
|  | --- | ||||||
|  | apiVersion: apps/v1 | ||||||
|  | kind: Deployment | ||||||
|  | metadata: | ||||||
|  |   name: service-pod | ||||||
|  |   namespace: service-system | ||||||
|  | spec: | ||||||
|  |   replicas: 1 | ||||||
|  |   selector: | ||||||
|  |     matchLabels: | ||||||
|  |       app: service | ||||||
|  |   strategy: | ||||||
|  |     type: Recreate | ||||||
|  |   template: | ||||||
|  |     metadata: | ||||||
|  |       labels: | ||||||
|  |         app: service | ||||||
|  |     spec: | ||||||
|  |       hostNetwork: true | ||||||
|  |       containers: | ||||||
|  |         - name: service-api | ||||||
|  |           image: service-amd64:1.0 | ||||||
							
								
								
									
										4
									
								
								zarf/k8s/base/service-pod/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								zarf/k8s/base/service-pod/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | |||||||
|  | apiVersion: kustomize.config.k8s.io/v1beta1 | ||||||
|  | kind: Kustomization | ||||||
|  | resources: | ||||||
|  |   - ./base-service.yaml | ||||||
							
								
								
									
										2
									
								
								zarf/k8s/kind/kind-config.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								zarf/k8s/kind/kind-config.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | kind: Cluster | ||||||
|  | apiVersion: kind.x-k8s.io/v1alpha4 | ||||||
							
								
								
									
										25
									
								
								zarf/k8s/kind/service-pod/kind-servicepatch.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								zarf/k8s/kind/service-pod/kind-servicepatch.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | apiVersion: apps/v1 | ||||||
|  | kind: Deployment | ||||||
|  | metadata: | ||||||
|  |   name: service-pod | ||||||
|  |   namespace: service-system | ||||||
|  | spec: | ||||||
|  |   replicas: 1 | ||||||
|  |   strategy: | ||||||
|  |     type: Recreate | ||||||
|  |   selector: | ||||||
|  |     matchLabels: | ||||||
|  |       app: service | ||||||
|  |   template: | ||||||
|  |     metadata: | ||||||
|  |       labels: | ||||||
|  |         app: service | ||||||
|  |     spec: | ||||||
|  |       containers: | ||||||
|  |         # service container configuration | ||||||
|  |         - name: service-api | ||||||
|  |           resources: | ||||||
|  |             limits: | ||||||
|  |               cpu: "1000m" # Up to 2 full cores | ||||||
|  |             requests: | ||||||
|  |               cpu: "10m" # Use 1 full cores | ||||||
							
								
								
									
										6
									
								
								zarf/k8s/kind/service-pod/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								zarf/k8s/kind/service-pod/kustomization.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | apiVersion: kustomize.config.k8s.io/v1beta1 | ||||||
|  | kind: Kustomization | ||||||
|  | resources: | ||||||
|  |   - ../../base/service-pod/ | ||||||
|  | patchesStrategicMerge: | ||||||
|  |   - kind-servicepatch.yaml | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user