diff --git a/plugins/kvscheduler/txn_exec.go b/plugins/kvscheduler/txn_exec.go index 804c10a3f1..2f2ce67598 100644 --- a/plugins/kvscheduler/txn_exec.go +++ b/plugins/kvscheduler/txn_exec.go @@ -255,7 +255,9 @@ func (s *Scheduler) applyValue(args *applyValueArgs) (executed kvs.RecordedTxnOp } // applyDelete removes value. -func (s *Scheduler) applyDelete(node graph.NodeRW, txnOp *kvs.RecordedTxnOp, args *applyValueArgs, pending bool) (executed kvs.RecordedTxnOps, err error) { +func (s *Scheduler) applyDelete(node graph.NodeRW, txnOp *kvs.RecordedTxnOp, args *applyValueArgs, + pending bool) (executed kvs.RecordedTxnOps, err error) { + if s.logGraphWalk { endLog := s.logNodeVisit("applyDelete", args) defer endLog() @@ -290,7 +292,9 @@ func (s *Scheduler) applyDelete(node graph.NodeRW, txnOp *kvs.RecordedTxnOp, arg // removed by request txnOp.NewState = kvs.ValueState_REMOVED if args.isDerived { - args.graphW.DeleteNode(args.kv.key) + if !txnOp.IsRecreate { + args.graphW.DeleteNode(args.kv.key) + } } else { s.updateNodeState(node, txnOp.NewState, args) } @@ -517,7 +521,7 @@ func (s *Scheduler) applyUpdate(node graph.NodeRW, txnOp *kvs.RecordedTxnOp, arg descriptor := s.registry.GetDescriptorForKey(args.kv.key) handler := newDescriptorHandler(descriptor) if !args.dryRun && args.kv.origin == kvs.FromNB { - err = handler.validate(node.GetKey(), node.GetValue()) + err = handler.validate(node.GetKey(), args.kv.value) if err != nil { node.SetValue(args.kv.value) // save the invalid value node.SetFlags(&UnavailValueFlag{})