8282 ColumnQuarantine * =
8383 SidecarQuarantine [fulu.DataColumnSidecar , OnDataColumnSidecarCallback ]
8484
85+ ColumnQuarantineNode * =
86+ DoublyLinkedNode [RootTableRecord [fulu.DataColumnSidecar ]]
87+
8588func indexLog * [T: SomeSidecarRef ](sidecars: openArray [ref T]): string =
8689 " [" & sidecars.mapIt ($ uint64 (it [].index)).join (" ," ) & " ]"
8790
@@ -886,12 +889,13 @@ proc init*(
886889 onDataColumnSidecarCallback: OnDataColumnSidecarCallback
887890): ColumnQuarantine =
888891 doAssert (len (custodyColumns) <= NUMBER_OF_COLUMNS )
892+
893+ let custodyMap = ColumnMap .init (custodyColumns)
889894 var indexMap = newSeqUninit [int ](NUMBER_OF_COLUMNS )
890895 if len (custodyColumns) < NUMBER_OF_COLUMNS :
891896 for i in 0 ..< len (indexMap):
892897 indexMap[i] = - 1
893- for index, item in custodyColumns.pairs ():
894- doAssert (item < uint64 (NUMBER_OF_COLUMNS ))
898+ for index, item in custodyMap.pairs ():
895899 indexMap[int (item)] = index
896900
897901 let size = maxSidecars (NUMBER_OF_COLUMNS )
@@ -911,27 +915,84 @@ proc init*(
911915 memSidecarsCount: 0 ,
912916 diskSidecarsCount: 0 ,
913917 indexMap: indexMap,
914- custodyColumns: @ custodyColumns ,
915- custodyMap: ColumnMap . init (custodyColumns) ,
918+ custodyColumns: toSeq (custodyMap.items) ,
919+ custodyMap: custodyMap ,
916920 list: initDoublyLinkedList [RootTableRecord [fulu.DataColumnSidecar ]](),
917921 db: database,
918922 onSidecarCallback: onDataColumnSidecarCallback
919923 )
920924
921- func updateColumnQuarantine * (
922- quarantine: ref ColumnQuarantine ,
925+ proc update * (
926+ quarantine: var ColumnQuarantine ,
923927 cfg: RuntimeConfig ,
924- custodyColumns: openArray [ColumnIndex ]) =
928+ custodyColumns: openArray [ColumnIndex ]
929+ ) =
925930 doAssert (len (custodyColumns) <= NUMBER_OF_COLUMNS )
931+ let
932+ custodyMap = ColumnMap .init (custodyColumns)
933+ maxSidecarsPerBlockCount = len (custodyMap)
934+
926935 var indexMap = newSeqUninit [int ](NUMBER_OF_COLUMNS )
927936 if len (custodyColumns) < NUMBER_OF_COLUMNS :
928937 for i in 0 ..< len (indexMap):
929938 indexMap[i] = - 1
930- for index, item in custodyColumns.pairs ():
931- doAssert (item < uint64 (NUMBER_OF_COLUMNS ))
939+ for index, item in custodyMap.pairs ():
932940 indexMap[int (item)] = index
933941
934- quarantine.maxSidecarsPerBlockCount = len (custodyColumns)
942+ var
943+ memSidecarsCount = 0
944+ diskSidecarsCount = 0
945+ nodesToRemove: seq [ColumnQuarantineNode ]
946+
947+ for node in quarantine.list.nodes ():
948+ var
949+ sidecars =
950+ newSeq [SidecarHolder [fulu.DataColumnSidecar ]](len (custodyMap))
951+ count = 0
952+ unloaded = 0
953+
954+ for cindex in quarantine.custodyMap.items ():
955+ let
956+ index = quarantine.getIndex (cindex)
957+ sidecar = node[].value.sidecars[index]
958+
959+ if not (isEmpty (sidecar)):
960+ if cindex in custodyMap:
961+ let dindex = indexMap[int (cindex)]
962+ if dindex >= 0 :
963+ sidecars[dindex] = sidecar
964+ inc (count)
965+ if not (sidecar.isLoaded ()):
966+ inc (unloaded)
967+
968+ node.value.sidecars.reset ()
969+
970+ if count > 0 :
971+ node[].value.sidecars = sidecars
972+ node[].value.count = count
973+ node[].value.unloaded = unloaded
974+ # We do account sidecars which are useful in new configuration, but
975+ # its possible that some sidecars will be left on disk which can't be
976+ # used in new configuration, and we can't delete it easily. But this
977+ # sidecars will be deleted as soon as sidecars with same `block_root`
978+ # will be popped out from quarantine.
979+ diskSidecarsCount.inc (unloaded)
980+ memSidecarsCount.inc (count - unloaded)
981+ else :
982+ # If there no useful columns, we will mark this node for deletion.
983+ nodesToRemove.add (node)
984+
985+ for node in nodesToRemove:
986+ quarantine.removeNode (node, 0 )
987+
988+ quarantine.diskSidecarsCount = diskSidecarsCount
989+ quarantine.memSidecarsCount = memSidecarsCount
990+ blob_quarantine_memory_slots_occupied.set (
991+ int64 (quarantine.memSidecarsCount))
992+ blob_quarantine_database_slots_occupied.set (
993+ int64 (quarantine.diskSidecarsCount))
994+
995+ quarantine.maxSidecarsPerBlockCount = maxSidecarsPerBlockCount
935996 quarantine.indexMap = indexMap
936- quarantine.custodyColumns = @ custodyColumns
937- quarantine.custodyMap = ColumnMap . init (custodyColumns)
997+ quarantine.custodyColumns = toSeq (custodyMap.items)
998+ quarantine.custodyMap = custodyMap
0 commit comments