[MediaWiki-commits] [Gerrit] Fixed memory issues - change (operations...incremental)

2013-09-11 Thread Petr Onderka (Code Review)
Petr Onderka has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/83783


Change subject: Fixed memory issues
..

Fixed memory issues

- clearing index cache periodically, so that it doesn't grow too much
- fixed memory leaks
- less copying

Change-Id: I1483a2f4855a7faa751dd8ed7ee050b17a0c7204
---
M DumpObjects/DumpObject.h
M Indexes/Index.h
M Indexes/Index.tpp
M Indexes/IndexInnerNode.h
M Indexes/IndexInnerNode.tpp
M Indexes/IndexLeafNode.h
M Indexes/IndexLeafNode.tpp
M Indexes/IndexNode.h
M Indexes/Iterators/IndexNodeIterator.h
M XmlUtils.cpp
10 files changed, 47 insertions(+), 10 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/dumps/incremental 
refs/changes/83/83783/1

diff --git a/DumpObjects/DumpObject.h b/DumpObjects/DumpObject.h
index ef21805..3efc910 100644
--- a/DumpObjects/DumpObject.h
+++ b/DumpObjects/DumpObject.h
@@ -16,18 +16,20 @@
 virtual void WriteInternal() = 0;
 
 templatetypename T
-void WriteValue(const T value);
+void WriteValue(const T value);
 public:
 templatetypename T
-static void WriteValue(std::ostream stream, const T value);
+static void WriteValue(std::ostream stream, const T value);
 
 templatetypename T
 static void ReadValue(std::istream stream, T value);
 
 templatetypename T
-static std::uint32_t ValueSize(const T value);
+static std::uint32_t ValueSize(const T value);
 
 virtual std::uint32_t NewLength() = 0;
+
+virtual ~DumpObjectBase() {}
 };
 
 class DumpObject : public DumpObjectBase
@@ -47,13 +49,13 @@
 };
 
 templatetypename T
-void DumpObjectBase::WriteValue(const T value)
+void DumpObjectBase::WriteValue(const T value)
 {
 WriteValue(*stream, value);
 }
 
 templatetypename T
-void DumpObjectBase::WriteValue(std::ostream stream, const T value)
+void DumpObjectBase::WriteValue(std::ostream stream, const T value)
 {
 DumpTraitsT::Write(stream, value);
 }
@@ -65,7 +67,7 @@
 }
 
 templatetypename T
-uint32_t DumpObjectBase::ValueSize(const T value)
+uint32_t DumpObjectBase::ValueSize(const T value)
 {
 return DumpTraitsT::DumpSize(value);
 }
\ No newline at end of file
diff --git a/Indexes/Index.h b/Indexes/Index.h
index 24e822c..ac77ddb 100644
--- a/Indexes/Index.h
+++ b/Indexes/Index.h
@@ -17,6 +17,8 @@
 std::weak_ptrWritableDump dump;
 std::weak_ptrOffset fileHeaderOffset;
 
+int recentChanges;
+
 void AfterAdd();
 public:
 Index(std::weak_ptrWritableDump dump, std::weak_ptrOffset 
fileHeaderOffset, bool delaySave = false);
diff --git a/Indexes/Index.tpp b/Indexes/Index.tpp
index 294d755..7ba38d5 100644
--- a/Indexes/Index.tpp
+++ b/Indexes/Index.tpp
@@ -7,7 +7,7 @@
 
 templatetypename TKey, typename TValue
 IndexTKey, TValue::Index(std::weak_ptrWritableDump dump, 
std::weak_ptrOffset fileHeaderOffset, bool delaySave)
-: dump(dump), fileHeaderOffset(fileHeaderOffset)
+: dump(dump), fileHeaderOffset(fileHeaderOffset), recentChanges(0)
 {
 auto offset = fileHeaderOffset.lock();
 
@@ -63,6 +63,14 @@
 
 rootNodeUnsaved = false;
 }
+
+recentChanges++;
+
+if (recentChanges = 10)
+{
+rootNode-ClearCached();
+recentChanges = 0;
+}
 }
 
 templatetypename TKey, typename TValue
diff --git a/Indexes/IndexInnerNode.h b/Indexes/IndexInnerNode.h
index 3b039bc..5ccc1e1 100644
--- a/Indexes/IndexInnerNode.h
+++ b/Indexes/IndexInnerNode.h
@@ -41,6 +41,8 @@
 virtual std::uint32_t RealLength() override;
 virtual SplitResult Split() override;
 
+virtual void ClearCached() override;
+
 virtual std::unique_ptrIndexNodeIteratorTKey, TValue begin() override;
 virtual std::unique_ptrIndexNodeIteratorTKey, TValue end() override;
 };
diff --git a/Indexes/IndexInnerNode.tpp b/Indexes/IndexInnerNode.tpp
index b6607c1..0890b2a 100644
--- a/Indexes/IndexInnerNode.tpp
+++ b/Indexes/IndexInnerNode.tpp
@@ -152,6 +152,8 @@
 templatetypename TKey, typename TValue
 void IndexInnerNodeTKey, TValue::Write()
 {
+// TODO: don't do anything when there are no changes
+
 IndexNodeTKey, TValue::Write();
 
 for (auto cachedChild : cachedChildren)
@@ -217,6 +219,17 @@
 }
 
 templatetypename TKey, typename TValue
+void IndexInnerNodeTKey, TValue::ClearCached()
+{
+Write();
+
+for (unsigned i = 0; i  cachedChildren.size(); i++)
+{
+cachedChildren.at(i) = nullptr;
+}
+}
+
+templatetypename TKey, typename TValue
 std::unique_ptrIndexNodeIteratorTKey, TValue IndexInnerNodeTKey, 
TValue::begin()
 {
 return std::unique_ptrIndexNodeIteratorTKey, TValue(new 
IndexInnerIteratorTKey, TValue(this, true));
diff --git a/Indexes/IndexLeafNode.h b/Indexes/IndexLeafNode.h
index 1598488..ad069ac 100644
--- a/Indexes/IndexLeafNode.h
+++ b/Indexes/IndexLeafNode.h
@@ -32,6 +32,8 @@
 virtual std::uint32_t RealLength() override;
 virtual SplitResult Split() override;
 
+virtual void ClearCached() override;
+
 

[MediaWiki-commits] [Gerrit] Fixed memory issues - change (operations...incremental)

2013-09-11 Thread Petr Onderka (Code Review)
Petr Onderka has submitted this change and it was merged.

Change subject: Fixed memory issues
..


Fixed memory issues

- clearing index cache periodically, so that it doesn't grow too much
- fixed memory leaks
- less copying

Change-Id: I1483a2f4855a7faa751dd8ed7ee050b17a0c7204
---
M DumpObjects/DumpObject.h
M Indexes/Index.h
M Indexes/Index.tpp
M Indexes/IndexInnerNode.h
M Indexes/IndexInnerNode.tpp
M Indexes/IndexLeafNode.h
M Indexes/IndexLeafNode.tpp
M Indexes/IndexNode.h
M Indexes/Iterators/IndexNodeIterator.h
M XmlUtils.cpp
10 files changed, 47 insertions(+), 10 deletions(-)

Approvals:
  Petr Onderka: Verified; Looks good to me, approved



diff --git a/DumpObjects/DumpObject.h b/DumpObjects/DumpObject.h
index ef21805..3efc910 100644
--- a/DumpObjects/DumpObject.h
+++ b/DumpObjects/DumpObject.h
@@ -16,18 +16,20 @@
 virtual void WriteInternal() = 0;
 
 templatetypename T
-void WriteValue(const T value);
+void WriteValue(const T value);
 public:
 templatetypename T
-static void WriteValue(std::ostream stream, const T value);
+static void WriteValue(std::ostream stream, const T value);
 
 templatetypename T
 static void ReadValue(std::istream stream, T value);
 
 templatetypename T
-static std::uint32_t ValueSize(const T value);
+static std::uint32_t ValueSize(const T value);
 
 virtual std::uint32_t NewLength() = 0;
+
+virtual ~DumpObjectBase() {}
 };
 
 class DumpObject : public DumpObjectBase
@@ -47,13 +49,13 @@
 };
 
 templatetypename T
-void DumpObjectBase::WriteValue(const T value)
+void DumpObjectBase::WriteValue(const T value)
 {
 WriteValue(*stream, value);
 }
 
 templatetypename T
-void DumpObjectBase::WriteValue(std::ostream stream, const T value)
+void DumpObjectBase::WriteValue(std::ostream stream, const T value)
 {
 DumpTraitsT::Write(stream, value);
 }
@@ -65,7 +67,7 @@
 }
 
 templatetypename T
-uint32_t DumpObjectBase::ValueSize(const T value)
+uint32_t DumpObjectBase::ValueSize(const T value)
 {
 return DumpTraitsT::DumpSize(value);
 }
\ No newline at end of file
diff --git a/Indexes/Index.h b/Indexes/Index.h
index 24e822c..ac77ddb 100644
--- a/Indexes/Index.h
+++ b/Indexes/Index.h
@@ -17,6 +17,8 @@
 std::weak_ptrWritableDump dump;
 std::weak_ptrOffset fileHeaderOffset;
 
+int recentChanges;
+
 void AfterAdd();
 public:
 Index(std::weak_ptrWritableDump dump, std::weak_ptrOffset 
fileHeaderOffset, bool delaySave = false);
diff --git a/Indexes/Index.tpp b/Indexes/Index.tpp
index 294d755..7ba38d5 100644
--- a/Indexes/Index.tpp
+++ b/Indexes/Index.tpp
@@ -7,7 +7,7 @@
 
 templatetypename TKey, typename TValue
 IndexTKey, TValue::Index(std::weak_ptrWritableDump dump, 
std::weak_ptrOffset fileHeaderOffset, bool delaySave)
-: dump(dump), fileHeaderOffset(fileHeaderOffset)
+: dump(dump), fileHeaderOffset(fileHeaderOffset), recentChanges(0)
 {
 auto offset = fileHeaderOffset.lock();
 
@@ -63,6 +63,14 @@
 
 rootNodeUnsaved = false;
 }
+
+recentChanges++;
+
+if (recentChanges = 10)
+{
+rootNode-ClearCached();
+recentChanges = 0;
+}
 }
 
 templatetypename TKey, typename TValue
diff --git a/Indexes/IndexInnerNode.h b/Indexes/IndexInnerNode.h
index 3b039bc..5ccc1e1 100644
--- a/Indexes/IndexInnerNode.h
+++ b/Indexes/IndexInnerNode.h
@@ -41,6 +41,8 @@
 virtual std::uint32_t RealLength() override;
 virtual SplitResult Split() override;
 
+virtual void ClearCached() override;
+
 virtual std::unique_ptrIndexNodeIteratorTKey, TValue begin() override;
 virtual std::unique_ptrIndexNodeIteratorTKey, TValue end() override;
 };
diff --git a/Indexes/IndexInnerNode.tpp b/Indexes/IndexInnerNode.tpp
index b6607c1..0890b2a 100644
--- a/Indexes/IndexInnerNode.tpp
+++ b/Indexes/IndexInnerNode.tpp
@@ -152,6 +152,8 @@
 templatetypename TKey, typename TValue
 void IndexInnerNodeTKey, TValue::Write()
 {
+// TODO: don't do anything when there are no changes
+
 IndexNodeTKey, TValue::Write();
 
 for (auto cachedChild : cachedChildren)
@@ -217,6 +219,17 @@
 }
 
 templatetypename TKey, typename TValue
+void IndexInnerNodeTKey, TValue::ClearCached()
+{
+Write();
+
+for (unsigned i = 0; i  cachedChildren.size(); i++)
+{
+cachedChildren.at(i) = nullptr;
+}
+}
+
+templatetypename TKey, typename TValue
 std::unique_ptrIndexNodeIteratorTKey, TValue IndexInnerNodeTKey, 
TValue::begin()
 {
 return std::unique_ptrIndexNodeIteratorTKey, TValue(new 
IndexInnerIteratorTKey, TValue(this, true));
diff --git a/Indexes/IndexLeafNode.h b/Indexes/IndexLeafNode.h
index 1598488..ad069ac 100644
--- a/Indexes/IndexLeafNode.h
+++ b/Indexes/IndexLeafNode.h
@@ -32,6 +32,8 @@
 virtual std::uint32_t RealLength() override;
 virtual SplitResult Split() override;
 
+virtual void ClearCached() override;
+
 virtual unique_ptrIndexNodeIteratorTKey, TValue begin()