* fix: use keyed fields in struct literals - Replace unsafe reflect.StringHeader/SliceHeader with safe unsafe.String/Slice (weed/query/sqltypes/unsafe.go) - Add field names to Type_ScalarType struct literals (weed/mq/schema/schema_builder.go) - Add Duration field name to FlexibleDuration struct literals across test files - Add field names to bson.D struct literals (weed/filer/mongodb/mongodb_store_kv.go) Fixes go vet warnings about unkeyed struct literals. * fix: remove unreachable code - Remove unreachable return statements after infinite for loops - Remove unreachable code after if/else blocks where all paths return - Simplify recursive logic by removing unnecessary for loop (inode_to_path.go) - Fix Type_ScalarType literal to use enum value directly (schema_builder.go) - Call onCompletionFn on stream error (subscribe_session.go) Files fixed: - weed/query/sqltypes/unsafe.go - weed/mq/schema/schema_builder.go - weed/mq/client/sub_client/connect_to_sub_coordinator.go - weed/filer/redis3/ItemList.go - weed/mq/client/agent_client/subscribe_session.go - weed/mq/broker/broker_grpc_pub_balancer.go - weed/mount/inode_to_path.go - weed/util/skiplist/name_list.go * fix: avoid copying lock values in protobuf messages - Use proto.Merge() instead of direct assignment to avoid copying sync.Mutex in S3ApiConfiguration (iamapi_server.go) - Add explicit comments noting that channel-received values are already copies before taking addresses (volume_grpc_client_to_master.go) The protobuf messages contain sync.Mutex fields from the message state, which should not be copied. Using proto.Merge() properly merges messages without copying the embedded mutex. * fix: correct byte array size for uint32 bit shift operations The generateAccountId() function only needs 4 bytes to create a uint32 value. Changed from allocating 8 bytes to 4 bytes to match the actual usage. This fixes go vet warning about shifting 8-bit values (bytes) by more than 8 bits. * fix: ensure context cancellation on all error paths In broker_client_subscribe.go, ensure subscriberCancel() is called on all error return paths: - When stream creation fails - When partition assignment fails - When sending initialization message fails This prevents context leaks when an error occurs during subscriber creation. * fix: ensure subscriberCancel called for CreateFreshSubscriber stream.Send error Ensure subscriberCancel() is called when stream.Send fails in CreateFreshSubscriber. * ci: add go vet step to prevent future lint regressions - Add go vet step to GitHub Actions workflow - Filter known protobuf lock warnings (MessageState sync.Mutex) These are expected in generated protobuf code and are safe - Prevents accumulation of go vet errors in future PRs - Step runs before build to catch issues early * fix: resolve remaining syntax and logic errors in vet fixes - Fixed syntax errors in filer_sync.go caused by missing closing braces - Added missing closing brace for if block and function - Synchronized fixes to match previous commits on branch * fix: add missing return statements to daemon functions - Add 'return false' after infinite loops in filer_backup.go and filer_meta_backup.go - Satisfies declared bool return type signatures - Maintains consistency with other daemon functions (runMaster, runFilerSynchronize, runWorker) - While unreachable, explicitly declares the return satisfies function signature contract * fix: add nil check for onCompletionFn in SubscribeMessageRecord - Check if onCompletionFn is not nil before calling it - Prevents potential panic if nil function is passed - Matches pattern used in other callback functions * docs: clarify unreachable return statements in daemon functions - Add comments documenting that return statements satisfy function signature - Explains that these returns follow infinite loops and are unreachable - Improves code clarity for future maintainers
82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
package mongodb
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
func (store *MongodbStore) KvPut(ctx context.Context, key []byte, value []byte) (err error) {
|
|
|
|
dir, name := genDirAndName(key)
|
|
|
|
c := store.connect.Database(store.database).Collection(store.collectionName)
|
|
|
|
opts := options.Update().SetUpsert(true)
|
|
filter := bson.D{
|
|
{Key: "directory", Value: dir},
|
|
{Key: "name", Value: name},
|
|
}
|
|
update := bson.D{
|
|
{Key: "$set", Value: bson.D{
|
|
{Key: "meta", Value: value},
|
|
}},
|
|
}
|
|
|
|
_, err = c.UpdateOne(ctx, filter, update, opts)
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("kv put: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (store *MongodbStore) KvGet(ctx context.Context, key []byte) (value []byte, err error) {
|
|
dir, name := genDirAndName(key)
|
|
|
|
var data Model
|
|
|
|
var where = bson.M{"directory": dir, "name": name}
|
|
err = store.connect.Database(store.database).Collection(store.collectionName).FindOne(ctx, where).Decode(&data)
|
|
if err != mongo.ErrNoDocuments && err != nil {
|
|
glog.ErrorfCtx(ctx, "kv get: %v", err)
|
|
return nil, filer.ErrKvNotFound
|
|
}
|
|
|
|
if len(data.Meta) == 0 {
|
|
return nil, filer.ErrKvNotFound
|
|
}
|
|
|
|
return data.Meta, nil
|
|
}
|
|
|
|
func (store *MongodbStore) KvDelete(ctx context.Context, key []byte) (err error) {
|
|
|
|
dir, name := genDirAndName(key)
|
|
|
|
where := bson.M{"directory": dir, "name": name}
|
|
_, err = store.connect.Database(store.database).Collection(store.collectionName).DeleteOne(ctx, where)
|
|
if err != nil {
|
|
return fmt.Errorf("kv delete: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func genDirAndName(key []byte) (dir string, name string) {
|
|
for len(key) < 8 {
|
|
key = append(key, 0)
|
|
}
|
|
|
|
dir = string(key[:8])
|
|
name = string(key[8:])
|
|
|
|
return
|
|
}
|