Skip to content

connection outPutAck 在事件循环里发生panic #355

@someview

Description

@someview

我们在使用read-throttle的分支,发现eventloop崩溃了。
track

原因在于:

	if triggerWrite {
				if operator.OnWrite != nil {
					// for non-connection
					operator.OnWrite(p)
				} else {
					// only for connection
					var bs, supportZeroCopy = operator.Outputs(barriers[i].bs)
					if len(bs) > 0 {
						// TODO: Let the upper layer pass in whether to use ZeroCopy.
						var n, err = iosend(operator.FD, bs, barriers[i].ivs, false && supportZeroCopy)
						operator.OutputAck(n)
						if err != nil {
							p.appendHup(operator)
							continue
						}
					}
				}
			}
			operator.done()
		}

上述这段代码在read-throttle和develop分支是一样的。触发bug的原因是,添加限流以后,var n, err = iosend(operator.FD, bs, barriers[i].ivs, false && supportZeroCopy) 触发了内核关闭连接,然而这里没有对iosend返回的错误进行判断(可能连接已经不可用了),直接outputAck了,导致panic.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions