loader: use ioutil.TempDir to create a temporary directory
... instead of generating one with math/rand. The problem was that math/rand is deterministic across runs, resulting in a possible race when trying to create the same directory between two processes. Additionally, because I used `os.MkdirAll`, no error was reported when the directory already existed. The solution to this is to use the stdlib function designed for this: ioutil.TempDir.
Этот коммит содержится в:
		
							родитель
							
								
									a21a039ac7
								
							
						
					
					
						коммит
						2194d447e9
					
				
					 1 изменённых файлов: 7 добавлений и 5 удалений
				
			
		| 
						 | 
					@ -10,13 +10,11 @@ import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"math/rand"
 | 
					 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
	"path"
 | 
						"path"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
	"runtime"
 | 
						"runtime"
 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/tinygo-org/tinygo/compileopts"
 | 
						"github.com/tinygo-org/tinygo/compileopts"
 | 
				
			||||||
	"github.com/tinygo-org/tinygo/goenv"
 | 
						"github.com/tinygo-org/tinygo/goenv"
 | 
				
			||||||
| 
						 | 
					@ -50,7 +48,8 @@ func GetCachedGoroot(config *compileopts.Config) (string, error) {
 | 
				
			||||||
	fmt.Fprintln(hash, tinygoroot)
 | 
						fmt.Fprintln(hash, tinygoroot)
 | 
				
			||||||
	gorootsHash := hash.Sum(nil)
 | 
						gorootsHash := hash.Sum(nil)
 | 
				
			||||||
	gorootsHashHex := hex.EncodeToString(gorootsHash[:])
 | 
						gorootsHashHex := hex.EncodeToString(gorootsHash[:])
 | 
				
			||||||
	cachedgoroot := filepath.Join(goenv.Get("GOCACHE"), "goroot-"+version+"-"+gorootsHashHex)
 | 
						cachedgorootName := "goroot-" + version + "-" + gorootsHashHex
 | 
				
			||||||
 | 
						cachedgoroot := filepath.Join(goenv.Get("GOCACHE"), cachedgorootName)
 | 
				
			||||||
	if needsSyscallPackage(config.BuildTags()) {
 | 
						if needsSyscallPackage(config.BuildTags()) {
 | 
				
			||||||
		cachedgoroot += "-syscall"
 | 
							cachedgoroot += "-syscall"
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -58,8 +57,11 @@ func GetCachedGoroot(config *compileopts.Config) (string, error) {
 | 
				
			||||||
	if _, err := os.Stat(cachedgoroot); err == nil {
 | 
						if _, err := os.Stat(cachedgoroot); err == nil {
 | 
				
			||||||
		return cachedgoroot, nil
 | 
							return cachedgoroot, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	tmpgoroot := cachedgoroot + ".tmp" + strconv.Itoa(rand.Int())
 | 
						err = os.MkdirAll(goenv.Get("GOCACHE"), 0777)
 | 
				
			||||||
	err = os.MkdirAll(tmpgoroot, 0777)
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						tmpgoroot, err := ioutil.TempDir(goenv.Get("GOCACHE"), cachedgorootName+".tmp")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", err
 | 
							return "", err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче