avoid herding effect by double checking

This commit is contained in:
Chris Lu 2014-03-16 13:50:20 -07:00
parent 1c044280d6
commit 1040761ab6

View file

@ -193,7 +193,7 @@ func writeFiles(idChan chan int, fileIdLineChan chan string, s *stats) {
func readFiles(fileIdLineChan chan string, s *stats) { func readFiles(fileIdLineChan chan string, s *stats) {
serverLimitChan := make(map[string]chan bool) serverLimitChan := make(map[string]chan bool)
masterLimitChan := make(chan bool, 7) masterLimitChan := make(chan bool, 1)
for { for {
if fid, ok := <-fileIdLineChan; ok { if fid, ok := <-fileIdLineChan; ok {
if len(fid) == 0 { if len(fid) == 0 {
@ -210,12 +210,14 @@ func readFiles(fileIdLineChan chan string, s *stats) {
start := time.Now() start := time.Now()
if server, ok := b.vid2server[vid]; !ok { if server, ok := b.vid2server[vid]; !ok {
masterLimitChan <- true masterLimitChan <- true
if _, now_ok := b.vid2server[vid]; !now_ok {
if ret, err := operation.Lookup(*b.server, vid); err == nil { if ret, err := operation.Lookup(*b.server, vid); err == nil {
if len(ret.Locations) > 0 { if len(ret.Locations) > 0 {
server = ret.Locations[0].PublicUrl server = ret.Locations[0].PublicUrl
b.vid2server[vid] = server b.vid2server[vid] = server
} }
} }
}
<-masterLimitChan <-masterLimitChan
} }
if server, ok := b.vid2server[vid]; ok { if server, ok := b.vid2server[vid]; ok {