mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-11 07:11:02 +00:00
Merge pull request #1613 from kuba--/missed-return
Add return to handleCommitIDs
This commit is contained in:
commit
894f599310
2 changed files with 11 additions and 81 deletions
76
holder.go
76
holder.go
|
|
@ -1874,82 +1874,6 @@ func (s *holderSyncer) readBothTranslateReader(rd TranslateEntryReader, snap *to
|
|||
}
|
||||
}
|
||||
|
||||
// holderCleaner removes fragments and data files that are no longer used.
|
||||
type holderCleaner struct {
|
||||
Node *topology.Node
|
||||
|
||||
Holder *Holder
|
||||
Cluster *cluster
|
||||
|
||||
// Signals that the sync should stop.
|
||||
Closing <-chan struct{}
|
||||
}
|
||||
|
||||
// TODO: this is here to satisfy the linter since holderCleaner was removed from
|
||||
// the gossip implementation of removeNode. But presumably we will use it once
|
||||
// we have ported over the etcd implementation.
|
||||
var _ holderCleaner
|
||||
|
||||
// IsClosing returns true if the cleaner has been marked to close.
|
||||
func (c *holderCleaner) IsClosing() bool {
|
||||
select {
|
||||
case <-c.Closing:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// CleanHolder compares the holder with the cluster state and removes
|
||||
// any unnecessary fragments and files.
|
||||
func (c *holderCleaner) CleanHolder() error {
|
||||
// Create a snapshot of the cluster to use for node/partition calculations.
|
||||
snap := topology.NewClusterSnapshot(c.Cluster.noder, c.Cluster.Hasher, c.Cluster.ReplicaN)
|
||||
|
||||
for _, index := range c.Holder.Indexes() {
|
||||
// Verify cleaner has not closed.
|
||||
if c.IsClosing() {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get the fragments that node is responsible for (based on hash(index, node)).
|
||||
containedShards := snap.ContainsShards(index.Name(), index.AvailableShards(includeRemote), c.Node)
|
||||
|
||||
// Get the fragments registered in memory.
|
||||
for _, field := range index.Fields() {
|
||||
// deletedShards is used to track which shards for the field
|
||||
// were deleted. Any shards that get deleted from this node
|
||||
// get added to remoteAvailableShards. This is done because
|
||||
// the CleanHolder process is cleaning up shards which got
|
||||
// moved to other nodes. Because those shards still exist
|
||||
// (just no longer on this particular node), this node still
|
||||
// needs to consider each of them as an available shard in
|
||||
// the cluster.
|
||||
var deletedShards []uint64
|
||||
for _, view := range field.views() {
|
||||
for _, fragment := range view.allFragments() {
|
||||
fragShard := fragment.shard
|
||||
// Ignore fragments that should be present.
|
||||
if uint64InSlice(fragShard, containedShards) {
|
||||
continue
|
||||
}
|
||||
// Delete fragment.
|
||||
if err := view.deleteFragment(fragShard); err != nil {
|
||||
return errors.Wrap(err, "deleting fragment")
|
||||
}
|
||||
deletedShards = append(deletedShards, fragShard)
|
||||
}
|
||||
}
|
||||
if len(deletedShards) > 0 {
|
||||
if err := field.AddRemoteAvailableShards(roaring.NewBitmap(deletedShards...)); err != nil {
|
||||
return errors.Wrap(err, "adding remote available shards")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func uint64InSlice(i uint64, s []uint64) bool {
|
||||
for _, o := range s {
|
||||
if i == o {
|
||||
|
|
|
|||
|
|
@ -2627,7 +2627,8 @@ func (h *Handler) handleFindIndexKeys(w http.ResponseWriter, r *http.Request) {
|
|||
if r.Header.Get("Content-Type") != "application/json" {
|
||||
http.Error(w, "Unsupported media type", http.StatusUnsupportedMediaType)
|
||||
return
|
||||
} else if !validHeaderAcceptJSON(r.Header) {
|
||||
}
|
||||
if !validHeaderAcceptJSON(r.Header) {
|
||||
http.Error(w, "Not acceptable", http.StatusNotAcceptable)
|
||||
return
|
||||
}
|
||||
|
|
@ -2669,7 +2670,8 @@ func (h *Handler) handleFindFieldKeys(w http.ResponseWriter, r *http.Request) {
|
|||
if r.Header.Get("Content-Type") != "application/json" {
|
||||
http.Error(w, "Unsupported media type", http.StatusUnsupportedMediaType)
|
||||
return
|
||||
} else if !validHeaderAcceptJSON(r.Header) {
|
||||
}
|
||||
if !validHeaderAcceptJSON(r.Header) {
|
||||
http.Error(w, "Not acceptable", http.StatusNotAcceptable)
|
||||
return
|
||||
}
|
||||
|
|
@ -2717,7 +2719,8 @@ func (h *Handler) handleCreateIndexKeys(w http.ResponseWriter, r *http.Request)
|
|||
if r.Header.Get("Content-Type") != "application/json" {
|
||||
http.Error(w, "Unsupported media type", http.StatusUnsupportedMediaType)
|
||||
return
|
||||
} else if !validHeaderAcceptJSON(r.Header) {
|
||||
}
|
||||
if !validHeaderAcceptJSON(r.Header) {
|
||||
http.Error(w, "Not acceptable", http.StatusNotAcceptable)
|
||||
return
|
||||
}
|
||||
|
|
@ -2759,7 +2762,8 @@ func (h *Handler) handleCreateFieldKeys(w http.ResponseWriter, r *http.Request)
|
|||
if r.Header.Get("Content-Type") != "application/json" {
|
||||
http.Error(w, "Unsupported media type", http.StatusUnsupportedMediaType)
|
||||
return
|
||||
} else if !validHeaderAcceptJSON(r.Header) {
|
||||
}
|
||||
if !validHeaderAcceptJSON(r.Header) {
|
||||
http.Error(w, "Not acceptable", http.StatusNotAcceptable)
|
||||
return
|
||||
}
|
||||
|
|
@ -2807,7 +2811,8 @@ func (h *Handler) handleReserveIDs(w http.ResponseWriter, r *http.Request) {
|
|||
if r.Header.Get("Content-Type") != "application/json" {
|
||||
http.Error(w, "Unsupported media type", http.StatusUnsupportedMediaType)
|
||||
return
|
||||
} else if !validHeaderAcceptJSON(r.Header) {
|
||||
}
|
||||
if !validHeaderAcceptJSON(r.Header) {
|
||||
http.Error(w, "Not acceptable", http.StatusNotAcceptable)
|
||||
return
|
||||
}
|
||||
|
|
@ -2891,6 +2896,7 @@ func (h *Handler) handleCommitIDs(w http.ResponseWriter, r *http.Request) {
|
|||
func (h *Handler) handleResetIDAlloc(w http.ResponseWriter, r *http.Request) {
|
||||
if !validHeaderAcceptType(r.Header, "text", "plain") {
|
||||
http.Error(w, "text/plain is not an acceptable response type", http.StatusNotAcceptable)
|
||||
return
|
||||
}
|
||||
indexName, ok := mux.Vars(r)["index"]
|
||||
if !ok {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue