From 4035763ef4ffecb2c1ef908679d17c07458f8557 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Thu, 7 Jul 2016 11:22:15 -0500 Subject: [PATCH 1/4] ignore checksum on single node clusters --- fragment.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/fragment.go b/fragment.go index 90deb153f..e38867474 100644 --- a/fragment.go +++ b/fragment.go @@ -1245,13 +1245,17 @@ func (s *FragmentSyncer) isClosing() bool { func (s *FragmentSyncer) SyncFragment() error { // Determine replica set. nodes := s.Cluster.FragmentNodes(s.Fragment.DB(), s.Fragment.Slice()) - + if len(nodes) == 1 { + //fmt.Println("no place to replicate", s.Fragment.DB(), s.Fragment.Frame(), s.Fragment.Slice()) + return nil + } // Create a set of blocks. blockSets := make([][]FragmentBlock, 0, len(nodes)) for _, node := range nodes { // Read local blocks. if node.Host == s.Host { - blockSets = append(blockSets, s.Fragment.Blocks()) + b := s.Fragment.Blocks() + blockSets = append(blockSets, b) continue } From ced399c6fc385b3f5e136c120ad398f47393b351 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Tue, 30 Aug 2016 17:36:00 -0500 Subject: [PATCH 2/4] corrected ClearBit --- bitmap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitmap.go b/bitmap.go index b9a56a802..083ed1529 100644 --- a/bitmap.go +++ b/bitmap.go @@ -127,7 +127,7 @@ func (b *Bitmap) SetBit(i uint64) (changed bool) { // ClearBit clears the i-th bit of the bitmap. func (b *Bitmap) ClearBit(i uint64) (changed bool) { - return b.createSegmentIfNotExists(i / SliceWidth).SetBit(i) + return b.createSegmentIfNotExists(i / SliceWidth).ClearBit(i) } func (b *Bitmap) createSegmentIfNotExists(slice uint64) *BitmapSegment { From ec4b1352d1db1414869689f60bdbfa4fe3b06402 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Thu, 15 Sep 2016 13:37:10 -0500 Subject: [PATCH 3/4] cache update on import adjustment --- fragment.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fragment.go b/fragment.go index e38867474..1369a0143 100644 --- a/fragment.go +++ b/fragment.go @@ -883,7 +883,8 @@ func (f *Fragment) Import(bitmapIDs, profileIDs []uint64) error { } // Write to storage. - if _, err := f.storage.Add(pos); err != nil { + changed, err := f.storage.Add(pos) + if err != nil { return err } @@ -898,13 +899,14 @@ func (f *Fragment) Import(bitmapIDs, profileIDs []uint64) error { bmCounter = bitmap.Count() lastID = bitmapID } - if bitmap.SetBit(profileID) { + if changed { bmCounter += 1 } // Invalidate block checksum. delete(f.checksums, int(bitmapID/HashBlockSize)) } + f.cache.Add(lastID, bmCounter) f.cache.Invalidate() return nil From b40d4385e844fd3aacc8b6ed7804f9b9d62265d6 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Fri, 16 Sep 2016 11:36:54 -0600 Subject: [PATCH 4/4] Remove import count optimization. --- fragment.go | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/fragment.go b/fragment.go index 1369a0143..cf55f600d 100644 --- a/fragment.go +++ b/fragment.go @@ -871,11 +871,10 @@ func (f *Fragment) Import(bitmapIDs, profileIDs []uint64) error { // Process every bit. // If an error occurs then reopen the storage. if err := func() error { - lastID := uint64(0) - bmCounter := uint64(0) - var bitmap *Bitmap + set := make(map[uint64]struct{}) for i := range bitmapIDs { bitmapID, profileID := bitmapIDs[i], profileIDs[i] + // Determine the position of the bit in the storage. pos, err := f.pos(bitmapID, profileID) if err != nil { @@ -888,25 +887,19 @@ func (f *Fragment) Import(bitmapIDs, profileIDs []uint64) error { return err } - // import optimization to avoid linear foreach calls - // slight risk of concurrent cache counter being off but - // no real danger - if i == 0 || bitmapID != lastID { - bitmap = f.bitmap(bitmapID) - if i != 0 { - f.cache.Add(lastID, bmCounter) - } - bmCounter = bitmap.Count() - lastID = bitmapID - } + // Mark bitmap to be updated in cache. if changed { - bmCounter += 1 + set[bitmapID] = struct{}{} } // Invalidate block checksum. delete(f.checksums, int(bitmapID/HashBlockSize)) } - f.cache.Add(lastID, bmCounter) + + // Update cache counts for all bitmaps. + for bitmapID := range set { + f.cache.Add(bitmapID, f.bitmap(bitmapID).Count()) + } f.cache.Invalidate() return nil