修改execSync后flaky test频发的解决

修改前,未对传进来的timeout参数进行处理,通过time.Sleep(100 * time.Millisecond)的方式,隔一段时间执行一次getExecConfig,用running参数来判断exec是否结束。

// ExecSync executes a command in the container, and returns the stdout output.

// If command exits with a non-zero exit code, an error is returned.

func (c *CriManager) ExecSync(ctx context.Context, r *runtime.ExecSyncRequest) (*runtime.ExecSyncResponse, error) {

// TODO: handle timeout.

  id := r.GetContainerId()

createConfig := &apitypes.ExecCreateConfig{

Cmd: r.GetCmd(),

}

execid, err := c.ContainerMgr.CreateExec(ctx, id, createConfig)

if err != nil {

return nil, fmt.Errorf("failed to create exec for container %q: %v", id, err)

}

var output bytes.Buffer

startConfig := &apitypes.ExecStartConfig{}

attachConfig := &AttachConfig{

Stdout:true,

Stderr:true,

MemBuffer: &output,

}

err = c.ContainerMgr.StartExec(ctx, execid, startConfig, attachConfig)

if err != nil {

return nil, fmt.Errorf("failed to start exec for container %q: %v", id, err)

}

var execConfig *ContainerExecConfig

for {

execConfig, err = c.ContainerMgr.GetExecConfig(ctx, execid)

if err != nil {

return nil, fmt.Errorf("failed to inspect exec for container %q: %v", id, err)

}

// Loop until exec finished.

      if !execConfig.Running {

break

      }

time.Sleep(100 * time.Millisecond)

}

var stderr []byte

if execConfig.Error != nil {

stderr = []byte(execConfig.Error.Error())

}

return &runtime.ExecSyncResponse{

Stdout:  output.Bytes(),

Stderr:  stderr,

ExitCode: int32(execConfig.ExitCode),

}, nil

}

修改后,把AttachConfig结构里的membuffer改成了pipe,pipe为io.pipewriter类型。

通过io.copy来判断StartExec是否执行完成。这样子,相当于把管道的一头交给 containerio 来操作了,剩下的read操作,就在 ExecSync 里读出来,放到一个 buffer 里。而io.copy返回有两种情况:一是遇到error直接返回;二是读到eof,也会返回,但是此时的返回值为nil。

这样就完美解决了频繁的ping pouchd的问题!但是这个pr merge后,cri test开始频发flaky test,还是一些与代码无关的文档pr。。

• Failure [0.653 seconds]

[k8s.io] Security Context

/home/travis/gopath/src/github.com/kubernetes-incubator/cri-tools/pkg/framework/framework.go:72

  SeccompProfilePath

  /home/travis/gopath/src/github.com/kubernetes-incubator/cri-tools/pkg/validate/security_context.go:411

    runtime should support an seccomp profile that blocks setting hostname with SYS_ADMIN [It]

    /home/travis/gopath/src/github.com/kubernetes-incubator/cri-tools/pkg/validate/security_context.go:517

    cmd [hostname ANewHostName], stdout "hostname: sethostname: Operation not permitted\n", stderr ""

    Expected an error to have occurred.  Got:

        : nil

    /home/travis/gopath/src/github.com/kubernetes-incubator/cri-tools/pkg/validate/security_context.go:1046

错误的源头不在cri部分,而是在pouchd部分。execSync方法中,判断IO是否完成的流程如下:


因此在pouchd的execExitedAndRelease方法里,把IO关闭的部分,移到execConfig update后面就好了。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 谈到docker源码,其实网上有很多的源码的分析的文章,也看过一些大牛写的docker源码解读的文章,收获很大。我...
    跨界师阅读 1,481评论 2赞 3
  • 01.{ 换行: Opening Brace Can't Be Placed on a Separate Lin...
    码农不器阅读 2,515评论 0赞 14
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,282评论 19赞 139
  • Notes Section 2, Program Structure nested block in if-els...
    keysaim阅读 1,369评论 0赞 1
  • 昨天阴天,空气里杨絮飞舞。 下午翘班和今天就要去旅行的朋友坐在MOMA水池边的长椅上说了会儿话。从工作琐事说到《深...
    YanaZhang阅读 288评论 0赞 0

友情链接更多精彩内容