falls back to update only if error contains msg "duplicate entry"

https://github.com/seaweedfs/seaweedfs/issues/5062
This commit is contained in:
Konstantin Lebedev 2023-12-01 18:19:51 +05:00 committed by Chris Lu
parent c1a6e624e5
commit 125ad8fe63

View file

@ -161,31 +161,24 @@ func (store *AbstractSqlStore) InsertEntry(ctx context.Context, entry *filer.Ent
if len(entry.GetChunks()) > filer.CountEntryChunksForGzip {
meta = util.MaybeGzipData(meta)
}
sqlInsert := "insert"
res, err := db.ExecContext(ctx, store.GetSqlInsert(bucket), util.HashStringToLong(dir), name, dir, meta)
if err == nil {
return
if err != nil && strings.Contains(strings.ToLower(err.Error()), "duplicate entry") {
// now the insert failed possibly due to duplication constraints
sqlInsert = "falls back to update"
glog.V(1).Infof("insert %s %s: %v", entry.FullPath, sqlInsert, err)
res, err = db.ExecContext(ctx, store.GetSqlUpdate(bucket), meta, util.HashStringToLong(dir), name, dir)
}
if !strings.Contains(strings.ToLower(err.Error()), "duplicate") {
// return fmt.Errorf("insert: %s", err)
// skip this since the error can be in a different language
}
// now the insert failed possibly due to duplication constraints
glog.V(1).Infof("insert %s falls back to update: %v", entry.FullPath, err)
res, err = db.ExecContext(ctx, store.GetSqlUpdate(bucket), meta, util.HashStringToLong(dir), name, dir)
if err != nil {
return fmt.Errorf("upsert %s: %s", entry.FullPath, err)
return fmt.Errorf("%s %s: %s", sqlInsert, entry.FullPath, err)
}
_, err = res.RowsAffected()
if err != nil {
return fmt.Errorf("upsert %s but no rows affected: %s", entry.FullPath, err)
return fmt.Errorf("%s %s but no rows affected: %s", sqlInsert, entry.FullPath, err)
}
return nil
return nil
}
func (store *AbstractSqlStore) UpdateEntry(ctx context.Context, entry *filer.Entry) (err error) {