github.com/apache/beam/sdks/v2@v2.48.2/go/test/integration/primitives/heap_dump.go (about)

     1  // Licensed to the Apache Software Foundation (ASF) under one or more
     2  // contributor license agreements.  See the NOTICE file distributed with
     3  // this work for additional information regarding copyright ownership.
     4  // The ASF licenses this file to You under the Apache License, Version 2.0
     5  // (the "License"); you may not use this file except in compliance with
     6  // the License.  You may obtain a copy of the License at
     7  //
     8  //    http://www.apache.org/licenses/LICENSE-2.0
     9  //
    10  // Unless required by applicable law or agreed to in writing, software
    11  // distributed under the License is distributed on an "AS IS" BASIS,
    12  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  // See the License for the specific language governing permissions and
    14  // limitations under the License.
    15  
    16  package primitives
    17  
    18  import (
    19  	"context"
    20  	"time"
    21  
    22  	"github.com/apache/beam/sdks/v2/go/pkg/beam"
    23  	"github.com/apache/beam/sdks/v2/go/pkg/beam/log"
    24  )
    25  
    26  func oomFn(ctx context.Context, elm int, emit func(int)) {
    27  	size := 1 << 25
    28  	// Simulate a slow memory leak
    29  	for {
    30  		abc := make([]int64, size)
    31  		log.Debugf(ctx, "abc %v", abc)
    32  		time.Sleep(5 * time.Second)
    33  		log.Debugf(ctx, "abc %v", abc)
    34  		if size > 1<<40 {
    35  			break
    36  		}
    37  
    38  		size = int(float64(size) * 1.2)
    39  	}
    40  	emit(elm)
    41  }
    42  
    43  // OomParDo tests a DoFn that OOMs.
    44  func OomParDo() *beam.Pipeline {
    45  	p, s := beam.NewPipelineWithRoot()
    46  
    47  	in := beam.Create(s, 1)
    48  	beam.ParDo(s, oomFn, in)
    49  
    50  	return p
    51  }