Skip to content

Commit f63b07a

Browse files
authored
Merge pull request #272 from servicetitan/upstream/ColumnInfoCollection_leak
Fix ColumnInfoCollection leak
2 parents 0c61bdb + d174265 commit f63b07a

File tree

3 files changed

+16
-12
lines changed

3 files changed

+16
-12
lines changed

Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -787,20 +787,19 @@ private static IReadOnlyList<TypeInfo> NonAbstractTypeWithDescendants(TypeInfo t
787787
private IEnumerable<ColumnInfo> GatherValueColumns(IEnumerable<ColumnInfo> columns)
788788
{
789789
var nameBuilder = context.NameBuilder;
790-
var valueColumns = new ColumnInfoCollection(null, "ValueColumns");
791-
foreach (var column in columns) {
792-
if (valueColumns.Contains(column.Name)) {
793-
if (column.IsSystem)
794-
continue;
790+
var valueColumns = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
791+
foreach (var column in columns) {
792+
if (valueColumns.Add(column.Name)) {
793+
yield return column;
794+
}
795+
else if (!column.IsSystem) {
795796
var clone = column.Clone();
796797
clone.Name = nameBuilder.BuildColumnName(column);
797798
clone.Field.MappingName = clone.Name;
798-
valueColumns.Add(clone);
799+
_ = valueColumns.Add(clone.Name);
800+
yield return clone;
799801
}
800-
else
801-
valueColumns.Add(column);
802802
}
803-
return valueColumns;
804803
}
805804

806805
private ColumnGroup BuildColumnGroup(IndexInfo index)

Orm/Xtensive.Orm/Orm/Model/ColumnInfoCollection.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ public IEnumerable<ColumnInfo> Find(ColumnAttributes criteria, MatchType matchTy
3939

4040
/// <inheritdoc/>
4141
public ColumnInfoCollection(Node owner, string name)
42-
: base(owner, name)
42+
: base(owner, name, new Dictionary<string, ColumnInfo>(StringComparer.OrdinalIgnoreCase))
4343
{
44-
NameIndex = new Dictionary<string, ColumnInfo>(StringComparer.OrdinalIgnoreCase);
4544
}
4645
}
4746
}

Orm/Xtensive.Orm/Orm/Model/NodeCollection.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class NodeCollection<TNode> : CollectionBaseSlim<TNode>
2626
[NonSerialized, DebuggerBrowsable(DebuggerBrowsableState.Never)]
2727
private EventHandler<ChangeNotifierEventArgs> itemChangingHandler;
2828

29-
protected Dictionary<string, TNode> NameIndex = new Dictionary<string, TNode>();
29+
protected readonly Dictionary<string, TNode> NameIndex;
3030

3131
/// <summary>
3232
/// Gets empty collection.
@@ -221,8 +221,14 @@ public override void Lock(bool recursive)
221221
/// <param name="owner">The owner.</param>
222222
/// <param name="name">The name.</param>
223223
public NodeCollection(Node owner, string name)
224+
: this(owner, name, new Dictionary<string, TNode>())
225+
{
226+
}
227+
228+
protected NodeCollection(Node owner, string name, Dictionary<string, TNode> nameIndex)
224229
{
225230
ArgumentValidator.EnsureArgumentNotNullOrEmpty(name, "name");
231+
NameIndex = nameIndex;
226232
Owner = owner;
227233
Name = name;
228234
itemChangingHandler = OnItemChanging;

0 commit comments

Comments
 (0)