This is an automated email from the ASF dual-hosted git repository.
zhongxjian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-kubernetes.git
The following commit(s) were added to refs/heads/master by this push:
new 98ee2306 [operator] Add Lazy complete
98ee2306 is described below
commit 98ee230613e0d5ff7c660372d4e09f24ccf99add
Author: mfordjody <[email protected]>
AuthorDate: Sun Dec 8 12:37:49 2024 +0800
[operator] Add Lazy complete
---
pkg/laziness/laziness.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/pkg/laziness/laziness.go b/pkg/laziness/laziness.go
new file mode 100644
index 00000000..0a65e5d3
--- /dev/null
+++ b/pkg/laziness/laziness.go
@@ -0,0 +1,58 @@
+package laziness
+
+import (
+ "sync"
+ "sync/atomic"
+)
+
+type lazinessImpl[T any] struct {
+ getter func() (T, error)
+ retry bool
+ res T
+ err error
+ done uint32
+ m sync.Mutex
+}
+
+type Laziness[T any] interface {
+ Get() (T, error)
+}
+
+var _ Laziness[any] = &lazinessImpl[any]{}
+
+func New[T any](f func() (T, error)) Laziness[T] {
+ return &lazinessImpl[T]{
+ getter: f,
+ }
+}
+
+func NewWithRetry[T any](f func() (T, error)) Laziness[T] {
+ return &lazinessImpl[T]{
+ getter: f,
+ retry: true,
+ }
+}
+
+func (l *lazinessImpl[T]) Get() (T, error) {
+ if atomic.LoadUint32(&l.done) == 0 {
+ }
+}
+
+func (l *lazinessImpl[T]) doSlow() (T, error) {
+ l.m.Lock()
+ defer l.m.Unlock()
+ if l.done == 0 {
+ done := uint32(1)
+ defer func() {
+ atomic.StoreInt32(&l.done, done)
+ }()
+ res, err := l.getter()
+ if l.retry && err != nil {
+ done = 0
+ } else {
+ l.res, l.err = res, err
+ }
+ return res, err
+ }
+ return l.res, l.err
+}