Skip to content

数组越界BUG #4

@buguang01

Description

@buguang01
func (m *Master) AdjustSize(newSize int) {
	if int64(newSize) > m.maxNum {
		newSize = int(m.maxNum)
	}

	m.Lock()
	defer m.Unlock()

	if diff := newSize - int(m.ingNum); diff > 0 {
		for i := 0; i < diff; i++ {
			m.workers[m.ingNum] = newWorker()
			atomic.AddInt64(&m.ingNum, 1)
		}
	} else if diff < 0 {
		atomic.StoreInt64(&m.ingNum, int64(newSize))
		if cursor := atomic.LoadInt64(&m.cursor); cursor > int64(newSize) {
			atomic.StoreInt64(&m.cursor, int64(newSize))
		}
		for _, w := range m.workers[newSize:] {
			if w == nil {
				break
			}
			w.shutdown()
		}
		m.workers = m.workers[0:newSize]
	}
}

func (m *Master) Running() int64 {
	return atomic.LoadInt64(&m.ingNum)
}

func (m *Master) Shutdown() {
	m.AdjustSize(0) // 关闭所有worker
}

func (m *Master) getWorker() *worker {
	atomic.CompareAndSwapInt64(&m.cursor, m.ingNum, 0)
	idx := atomic.AddInt64(&m.cursor, 1)
	w := m.workers[idx-1]
	return w
}

当cursor与原ingNum相等时,你要进行缩容
这个时候,如果是先把ingNum改成了新的值,再
atomic.CompareAndSwapInt64(&m.cursor, m.ingNum, 0)
运行这行时,就不会修改成功,然后你对cursor,进行了累加,导致越界,或有可能拿到一个nil对象。
还有就是你的代码里,对workers初始化的时候,用的是maxNum
但后面修改的时候,又用了ingNum做为他的长度。
我原以为你是要一开始声明一个确定长度的数组。但后面又换了,如果按你后面的逻辑
你一开始应该是
workers: make([]*worker, initNum,maxNum)
才对。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions