diff --git a/metanode/partition_fsm.go b/metanode/partition_fsm.go index bfb588031..a81ec7887 100644 --- a/metanode/partition_fsm.go +++ b/metanode/partition_fsm.go @@ -94,6 +94,11 @@ func (mp *metaPartition) Apply(command []byte, index uint64) (resp interface{}, if inoOnce, err = InodeOnceUnmarshal(msg.V); err != nil { return } + status := mp.inodeInTx(inoOnce.Inode) + if status != proto.OpOk { + resp = &InodeResponse{Status: status} + return + } ino := NewInode(inoOnce.Inode, 0) ino.setVer(inoOnce.VerSeq) resp = mp.fsmUnlinkInode(ino, inoOnce.UniqID) @@ -125,6 +130,11 @@ func (mp *metaPartition) Apply(command []byte, index uint64) (resp interface{}, if inoOnce, err = InodeOnceUnmarshal(msg.V); err != nil { return } + status := mp.inodeInTx(inoOnce.Inode) + if status != proto.OpOk { + resp = &InodeResponse{Status: status} + return + } ino := NewInode(inoOnce.Inode, 0) resp = mp.fsmCreateLinkInode(ino, inoOnce.UniqID) case opFSMEvictInode: diff --git a/metanode/partition_fsmop_dentry.go b/metanode/partition_fsmop_dentry.go index c60a405d0..22f68db17 100644 --- a/metanode/partition_fsmop_dentry.go +++ b/metanode/partition_fsmop_dentry.go @@ -64,6 +64,13 @@ func (mp *metaPartition) fsmTxCreateDentry(txDentry *TxDentry) (status uint8) { } }() + item := mp.dentryTree.Get(txDentry.Dentry) + if item != nil { + log.LogWarnf("fsmTxCreateDentry: got wrong dentry, want %v, got %v", txDentry.Dentry, item) + status = proto.OpExistErr + return + } + return mp.fsmCreateDentry(txDentry.Dentry, false) } diff --git a/metanode/partition_fsmop_inode.go b/metanode/partition_fsmop_inode.go index e0959eb3c..8e1d066e9 100644 --- a/metanode/partition_fsmop_inode.go +++ b/metanode/partition_fsmop_inode.go @@ -263,6 +263,13 @@ func (mp *metaPartition) fsmTxUnlinkInode(txIno *TxInode) (resp *InodeResponse) } }() + item := mp.inodeTree.Get(txIno.Inode) + if item == nil || item.(*Inode).IsTempFile() { + resp.Status = proto.OpNotExistErr + log.LogWarnf("fsmTxUnlinkInode: inode may be already not exist or link 0, txInode %v, item %v", txIno, item) + return + } + resp = mp.fsmUnlinkInode(txIno.Inode, 0) if resp.Status != proto.OpOk { return