Skip to content

Commit

Permalink
1st phase of InodeCount rework... InodeCount goes negative currently
Browse files Browse the repository at this point in the history
  • Loading branch information
edmc-ss committed Mar 1, 2022
1 parent ebf3481 commit ac92547
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 18 deletions.
49 changes: 32 additions & 17 deletions iclient/iclientpkg/inode.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,10 @@ func (inode *inodeStruct) PutNode(nodeByteSlice []byte) (objectNumber uint64, ob

layoutMapEntry, ok = inode.layoutMap[inode.putObjectNumber]
if !ok {
logFatalf("inode.layoutMap[inode.putObjectNumber] returned !ok")
layoutMapEntry = layoutMapEntryStruct{
objectSize: 0,
bytesReferenced: 0,
}
}

objectNumber = inode.putObjectNumber
Expand Down Expand Up @@ -182,19 +185,25 @@ func (inode *inodeStruct) DiscardNode(objectNumber uint64, objectOffset uint64,

// It's ok to update lauoutMap... but note that the above checks don't protect against all double deallocations

if (objectLength == layoutMapEntry.bytesReferenced) && (objectNumber != inode.putObjectNumber) {
// Note that we skip the special case where we are currently
// discarding the only referenced bytes in an active putObjectBuffer
// since a subsequent flush will write (at least) the inodeHeadV1 there
if objectLength == layoutMapEntry.bytesReferenced {
// We are completely dereferencing objectNumber...

delete(inode.layoutMap, objectNumber)

inode.superBlockInodeObjectCountAdjustment--
inode.superBlockInodeObjectSizeAdjustment -= int64(layoutMapEntry.objectSize)
inode.superBlockInodeBytesReferencedAdjustment -= int64(objectLength)

inode.dereferencedObjectNumberArray = append(inode.dereferencedObjectNumberArray, objectNumber)
if objectNumber == inode.putObjectNumber {
// We haven't put inode.putObjectNumber yet, so no need to delete it
} else {
// Ok to delete the object as it will be unrefenenced when we put inode.putObjectNumber during flush

inode.dereferencedObjectNumberArray = append(inode.dereferencedObjectNumberArray, objectNumber)
}
} else {
// Just update layoutMapEntry.bytesReferenced (that will still be non-zero)

layoutMapEntry.bytesReferenced -= objectLength

inode.layoutMap[objectNumber] = layoutMapEntry
Expand Down Expand Up @@ -645,13 +654,6 @@ func (inode *inodeStruct) ensurePutObjectIsActive() {
if inode.putObjectNumber == 0 {
inode.putObjectNumber = fetchNonce()
inode.putObjectBuffer = make([]byte, 0)

inode.layoutMap[inode.putObjectNumber] = layoutMapEntryStruct{
objectSize: 0,
bytesReferenced: 0,
}

inode.superBlockInodeObjectCountAdjustment++
}
}

Expand Down Expand Up @@ -896,7 +898,10 @@ func (fileInode *inodeStruct) recordExtent(startingFileOffset uint64, length uin

layoutMapEntry, ok = fileInode.layoutMap[fileInode.putObjectNumber]
if !ok {
logFatalf("fileInode.layoutMap[inode.putObjectNumber] returned !ok")
layoutMapEntry = layoutMapEntryStruct{
objectSize: 0,
bytesReferenced: 0,
}
}

layoutMapEntry.objectSize += length
Expand Down Expand Up @@ -1212,19 +1217,29 @@ func (fileInode *inodeStruct) unmapExtent(startingFileOffset uint64, length uint
logFatalf("fileInode.payload.DeleteByIndex() returned !ok")
}

// Update the layoutMapEntry... possibly deleting it if .bytesReferences reaches 0 (and it's not the current putObject)
// Update the layoutMapEntry... possibly deleting it if .bytesReferences reaches 0

layoutMapEntry.bytesReferenced -= extentMapEntryValueV1.Length

if (layoutMapEntry.bytesReferenced == 0) && (extentMapEntryValueV1.ObjectNumber != fileInode.putObjectNumber) {
if layoutMapEntry.bytesReferenced == 0 {
// We are completely dereferencing extentMapEntryValueV1.ObjectNumber

delete(fileInode.layoutMap, extentMapEntryValueV1.ObjectNumber)

fileInode.superBlockInodeObjectCountAdjustment--
fileInode.superBlockInodeObjectSizeAdjustment -= int64(layoutMapEntry.objectSize)
fileInode.superBlockInodeBytesReferencedAdjustment -= int64(extentMapEntryValueV1.Length)

fileInode.dereferencedObjectNumberArray = append(fileInode.dereferencedObjectNumberArray, extentMapEntryValueV1.ObjectNumber)
if extentMapEntryValueV1.ObjectNumber == fileInode.putObjectNumber {
// We haven't put inode.putObjectNumber yet, so no need to delete it
} else {
// Ok to delete the object as it will be unrefenenced when we put fileInode.putObjectNumber during flush

fileInode.dereferencedObjectNumberArray = append(fileInode.dereferencedObjectNumberArray, extentMapEntryValueV1.ObjectNumber)
}
} else {
// Just update layoutMapEntry.bytesReferenced (that will still be non-zero)

fileInode.layoutMap[extentMapEntryValueV1.ObjectNumber] = layoutMapEntry

fileInode.superBlockInodeBytesReferencedAdjustment -= int64(extentMapEntryValueV1.Length)
Expand Down
2 changes: 1 addition & 1 deletion ilayout/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ type SuperBlockV1Struct struct {
InodeTableRootObjectOffset uint64 // Starting offset in the Object of the root of the InodeTable
InodeTableRootObjectLength uint64 // Number of bytes in the Object of the root of the InodeTable
InodeTableLayout []InodeTableLayoutEntryV1Struct // Describes the data and space occupied by the the InodeTable
InodeObjectCount uint64 // Number of Objects holding {Dir|File}Inode Payload-described B+Tree as well as the FileInode's contents
InodeObjectCount uint64 // Number of Objects holding {Dir|File}Inode Payload-described B+Tree's as well as the FileInode's contents
InodeObjectSize uint64 // Sum of bytes written in all Objects holding {Dir|File}Inode Payload-described B+Tree as well as the FileInode's contents
InodeBytesReferenced uint64 // Sum of bytes currently referenced in all Objects holding {Dir|File}Inode Payload-described B+Tree as well as the FileInode's contents
PendingDeleteObjectNumberArray []uint64 // List of Objects to be deleted after the this CheckPoint
Expand Down

0 comments on commit ac92547

Please sign in to comment.