[MediaWiki-commits] [Gerrit] Bug fix: correctly update cluster offsets in directory entries. - change (openzim)

2016-06-26 Thread Kelson (Code Review)
Kelson has submitted this change and it was merged.

Change subject: Bug fix: correctly update cluster offsets in directory entries.
..


Bug fix: correctly update cluster offsets in directory entries.

This is a follow-up to f5de40f94b30795f42bb9388cbb46df9cd605167.

When we moved the blob writing to the main dirent-creation loop,
we ended up making separate *copies* of the dirents and updating
blob/cluster information in these, instead of the dirents in the
main list which will eventually be written.  Make the auxilliary
lists contain dirent *pointers* to avoid this problem.

Change-Id: I008fa700acd90c3c51614bde65d61ffbc6061872
---
M zimlib/include/zim/writer/zimcreator.h
M zimlib/src/zimcreator.cpp
2 files changed, 10 insertions(+), 9 deletions(-)

Approvals:
  Kelson: Verified; Looks good to me, approved



diff --git a/zimlib/include/zim/writer/zimcreator.h 
b/zimlib/include/zim/writer/zimcreator.h
index 6f47402..2e52d7e 100644
--- a/zimlib/include/zim/writer/zimcreator.h
+++ b/zimlib/include/zim/writer/zimcreator.h
@@ -33,6 +33,7 @@
 {
   public:
 typedef std::vector DirentsType;
+typedef std::vector DirentPtrsType;
 typedef std::vector SizeVectorType;
 typedef std::vector OffsetsType;
 typedef std::map MimeTypes;
diff --git a/zimlib/src/zimcreator.cpp b/zimlib/src/zimcreator.cpp
index bc977ea..46c550f 100644
--- a/zimlib/src/zimcreator.cpp
+++ b/zimlib/src/zimcreator.cpp
@@ -144,7 +144,7 @@
   // because we don't know which one will fill up first.  We also need
   // to track the dirents currently in each, so we can fix up the
   // cluster index if the other one ends up written first.
-  DirentsType compDirents, uncompDirents;
+  DirentPtrsType compDirents, uncompDirents;
   Cluster compCluster, uncompCluster;
   compCluster.setCompression(compression);
   uncompCluster.setCompression(zimcompNone);
@@ -188,11 +188,11 @@
   }
 }
 
-dirents.push_back(dirent);
 currentSize +=
   dirent.getDirentSize() /* for directory entry */ +
   sizeof(offset_type) /* for url pointer list */ +
   sizeof(size_type) /* for title pointer list */;
+dirents.push_back(dirent);
 
 // If this is a redirect, we're done: there's no blob to add.
 if (dirent.isRedirect())
@@ -217,7 +217,7 @@
 }
 
 Cluster *cluster;
-DirentsType *myDirents, *otherDirents;
+DirentPtrsType *myDirents, *otherDirents;
 if (dirent.isCompress())
 {
   cluster = 
@@ -230,9 +230,9 @@
   myDirents = 
   otherDirents = 
 }
-myDirents->push_back(dirent);
-dirent.setCluster(clusterOffsets.size(), cluster->count());
+dirents.back().setCluster(clusterOffsets.size(), cluster->count());
 cluster->addBlob(blob);
+myDirents->push_back(&(dirents.back()));
 
 // If cluster is now large enough, write it to disk.
 if (cluster->size() >= minChunkSize * 1024)
@@ -247,10 +247,10 @@
   cluster->clear();
   myDirents->clear();
   // Update the cluster number of the dirents *not* written to disk.
-  for (DirentsType::iterator di = otherDirents->begin();
+  for (DirentPtrsType::iterator di = otherDirents->begin();
di != otherDirents->end(); ++di)
   {
-di->setCluster(clusterOffsets.size(), di->getBlobNumber());
+(*di)->setCluster(clusterOffsets.size(), (*di)->getBlobNumber());
   }
   offset_type end = out.tellp();
   currentSize += (end - start) +
@@ -263,10 +263,10 @@
   {
 clusterOffsets.push_back(out.tellp());
 out << compCluster;
-for (DirentsType::iterator di = uncompDirents.begin();
+for (DirentPtrsType::iterator di = uncompDirents.begin();
  di != uncompDirents.end(); ++di)
 {
-  di->setCluster(clusterOffsets.size(), di->getBlobNumber());
+  (*di)->setCluster(clusterOffsets.size(), (*di)->getBlobNumber());
 }
   }
   compCluster.clear();

-- 
To view, visit https://gerrit.wikimedia.org/r/296158
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I008fa700acd90c3c51614bde65d61ffbc6061872
Gerrit-PatchSet: 1
Gerrit-Project: openzim
Gerrit-Branch: master
Gerrit-Owner: Cscott 
Gerrit-Reviewer: Kelson 

___
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits


[MediaWiki-commits] [Gerrit] Bug fix: correctly update cluster offsets in directory entries. - change (openzim)

2016-06-26 Thread Cscott (Code Review)
Cscott has uploaded a new change for review.

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

Change subject: Bug fix: correctly update cluster offsets in directory entries.
..

Bug fix: correctly update cluster offsets in directory entries.

This is a follow-up to f5de40f94b30795f42bb9388cbb46df9cd605167.

When we moved the blob writing to the main dirent-creation loop,
we ended up making separate *copies* of the dirents and updating
blob/cluster information in these, instead of the dirents in the
main list which will eventually be written.  Make the auxilliary
lists contain dirent *pointers* to avoid this problem.

Change-Id: I008fa700acd90c3c51614bde65d61ffbc6061872
---
M zimlib/include/zim/writer/zimcreator.h
M zimlib/src/zimcreator.cpp
2 files changed, 10 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/openzim refs/changes/58/296158/1

diff --git a/zimlib/include/zim/writer/zimcreator.h 
b/zimlib/include/zim/writer/zimcreator.h
index 6f47402..2e52d7e 100644
--- a/zimlib/include/zim/writer/zimcreator.h
+++ b/zimlib/include/zim/writer/zimcreator.h
@@ -33,6 +33,7 @@
 {
   public:
 typedef std::vector DirentsType;
+typedef std::vector DirentPtrsType;
 typedef std::vector SizeVectorType;
 typedef std::vector OffsetsType;
 typedef std::map MimeTypes;
diff --git a/zimlib/src/zimcreator.cpp b/zimlib/src/zimcreator.cpp
index bc977ea..46c550f 100644
--- a/zimlib/src/zimcreator.cpp
+++ b/zimlib/src/zimcreator.cpp
@@ -144,7 +144,7 @@
   // because we don't know which one will fill up first.  We also need
   // to track the dirents currently in each, so we can fix up the
   // cluster index if the other one ends up written first.
-  DirentsType compDirents, uncompDirents;
+  DirentPtrsType compDirents, uncompDirents;
   Cluster compCluster, uncompCluster;
   compCluster.setCompression(compression);
   uncompCluster.setCompression(zimcompNone);
@@ -188,11 +188,11 @@
   }
 }
 
-dirents.push_back(dirent);
 currentSize +=
   dirent.getDirentSize() /* for directory entry */ +
   sizeof(offset_type) /* for url pointer list */ +
   sizeof(size_type) /* for title pointer list */;
+dirents.push_back(dirent);
 
 // If this is a redirect, we're done: there's no blob to add.
 if (dirent.isRedirect())
@@ -217,7 +217,7 @@
 }
 
 Cluster *cluster;
-DirentsType *myDirents, *otherDirents;
+DirentPtrsType *myDirents, *otherDirents;
 if (dirent.isCompress())
 {
   cluster = 
@@ -230,9 +230,9 @@
   myDirents = 
   otherDirents = 
 }
-myDirents->push_back(dirent);
-dirent.setCluster(clusterOffsets.size(), cluster->count());
+dirents.back().setCluster(clusterOffsets.size(), cluster->count());
 cluster->addBlob(blob);
+myDirents->push_back(&(dirents.back()));
 
 // If cluster is now large enough, write it to disk.
 if (cluster->size() >= minChunkSize * 1024)
@@ -247,10 +247,10 @@
   cluster->clear();
   myDirents->clear();
   // Update the cluster number of the dirents *not* written to disk.
-  for (DirentsType::iterator di = otherDirents->begin();
+  for (DirentPtrsType::iterator di = otherDirents->begin();
di != otherDirents->end(); ++di)
   {
-di->setCluster(clusterOffsets.size(), di->getBlobNumber());
+(*di)->setCluster(clusterOffsets.size(), (*di)->getBlobNumber());
   }
   offset_type end = out.tellp();
   currentSize += (end - start) +
@@ -263,10 +263,10 @@
   {
 clusterOffsets.push_back(out.tellp());
 out << compCluster;
-for (DirentsType::iterator di = uncompDirents.begin();
+for (DirentPtrsType::iterator di = uncompDirents.begin();
  di != uncompDirents.end(); ++di)
 {
-  di->setCluster(clusterOffsets.size(), di->getBlobNumber());
+  (*di)->setCluster(clusterOffsets.size(), (*di)->getBlobNumber());
 }
   }
   compCluster.clear();

-- 
To view, visit https://gerrit.wikimedia.org/r/296158
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I008fa700acd90c3c51614bde65d61ffbc6061872
Gerrit-PatchSet: 1
Gerrit-Project: openzim
Gerrit-Branch: master
Gerrit-Owner: Cscott 

___
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits