Bladeren bron

Fix on DefOp

luis 7 jaren geleden
bovenliggende
commit
7393ad70cc
1 gewijzigde bestanden met toevoegingen van 31 en 14 verwijderingen
  1. 31 14
      go/src/flow/flow.go

+ 31 - 14
go/src/flow/flow.go

@@ -109,8 +109,9 @@ func (f *Flow) Op(name string, params ...interface{}) (Operation, error) {
 	var op Operation
 	var err error
 
-	allocErr := f.allocID(func(id string) {
+	allocErr := f.allocID(func(id string) error {
 		op, err = f.DefOp(id, name, params...)
+		return err
 	})
 	if allocErr != nil {
 		return nil, allocErr
@@ -131,8 +132,9 @@ func (f *Flow) ErrOp(operr error) (Operation, error) {
 	var op Operation
 	var err error
 
-	allocErr := f.allocID(func(id string) {
+	allocErr := f.allocID(func(id string) error {
 		op, err = f.DefErrOp(id, operr)
+		return err
 	})
 	if allocErr != nil {
 		return nil, err
@@ -152,8 +154,9 @@ func (f *Flow) DefConst(id string, value Data) (Operation, error) {
 func (f *Flow) Const(value Data) (Operation, error) {
 	var op Operation
 	var err error
-	allocErr := f.allocID(func(id string) {
+	allocErr := f.allocID(func(id string) error {
 		op, err = f.DefConst(id, value)
+		return err
 	})
 	if allocErr != nil {
 		return nil, allocErr
@@ -280,20 +283,34 @@ func (f *Flow) MarshalJSON() ([]byte, error) {
 	return json.Marshal(data)
 }
 
-func (f *Flow) allocID(fn func(id string)) error {
-	f.Lock()
-	defer f.Unlock()
+func (f *Flow) allocID(fn func(id string) error) error {
 
-	var id string
-	// generate ID
-	for i := 0; i < 10; i++ {
-		id = f.idGen()
-		if _, ok := f.operations.Load(id); !ok {
-			break
+	genID := func() (string, error) {
+		f.Lock()
+		defer f.Unlock()
+
+		var id string
+		// generate ID
+		for i := 0; i < 10; i++ {
+			id = f.idGen()
+			if _, ok := f.operations.Load(id); !ok {
+				f.operations.Store(id, nil) // tmp
+				return id, nil
+			}
 		}
-		return errors.New("ID Exausted")
+		return "", errors.New("ID Exausted")
+	}
+
+	// Safe generate an ID
+	id, err := genID()
+	if err != nil {
+		return err
+	}
+
+	err = fn(id)
+	if err != nil {
+		f.operations.Delete(id)
 	}
-	fn(id)
 	return nil
 
 }