浏览代码

lib/db: Drop indexes for outgoing data to force refresh (ref #9496) (#9502)

### Purpose

Resend our indexes since we fixed that index-sending issue.

I made a new thing to only drop the non-local-device index IDs, i.e.,
those for other devices. This means we will see a mismatch and resend
all indexes, but they will not. This is somewhat cleaner as it avoids
resending everything twice when two devices are upgraded, and in any
case, we have no reason to force a resend of incoming indexes here.

### Testing

It happens on my computer...
Jakob Borg 1 年之前
父节点
当前提交
61b94b9ea5
共有 3 个文件被更改,包括 34 次插入6 次删除
  1. 5 0
      lib/db/keyer.go
  2. 18 0
      lib/db/lowlevel.go
  3. 11 6
      lib/db/schemaupdater.go

+ 5 - 0
lib/db/keyer.go

@@ -103,6 +103,7 @@ type keyer interface {
 	// index IDs
 	GenerateIndexIDKey(key, device, folder []byte) (indexIDKey, error)
 	FolderFromIndexIDKey(key []byte) ([]byte, bool)
+	DeviceFromIndexIDKey(key []byte) ([]byte, bool)
 
 	// Mtimes
 	GenerateMtimesKey(key, folder []byte) (mtimesKey, error)
@@ -308,6 +309,10 @@ func (k defaultKeyer) FolderFromIndexIDKey(key []byte) ([]byte, bool) {
 	return k.folderIdx.Val(binary.BigEndian.Uint32(key[keyPrefixLen+keyDeviceLen:]))
 }
 
+func (k defaultKeyer) DeviceFromIndexIDKey(key []byte) ([]byte, bool) {
+	return k.folderIdx.Val(binary.BigEndian.Uint32(key[keyPrefixLen : keyPrefixLen+keyDeviceLen]))
+}
+
 type mtimesKey []byte
 
 func (k defaultKeyer) GenerateMtimesKey(key, folder []byte) (mtimesKey, error) {

+ 18 - 0
lib/db/lowlevel.go

@@ -665,6 +665,24 @@ func (db *Lowlevel) dropIndexIDs() error {
 	return t.Commit()
 }
 
+// dropOtherDeviceIndexIDs drops all index IDs for devices other than the
+// local device. This means we will resend our indexes to all other devices,
+// but they don't have to resend to us.
+func (db *Lowlevel) dropOtherDeviceIndexIDs() error {
+	t, err := db.newReadWriteTransaction()
+	if err != nil {
+		return err
+	}
+	defer t.close()
+	if err := t.deleteKeyPrefixMatching([]byte{KeyTypeIndexID}, func(key []byte) bool {
+		dev, _ := t.keyer.DeviceFromIndexIDKey(key)
+		return !bytes.Equal(dev, protocol.LocalDeviceID[:])
+	}); err != nil {
+		return err
+	}
+	return t.Commit()
+}
+
 func (db *Lowlevel) dropMtimes(folder []byte) error {
 	key, err := db.keyer.GenerateMtimesKey(nil, folder)
 	if err != nil {

+ 11 - 6
lib/db/schemaupdater.go

@@ -20,7 +20,7 @@ import (
 // do not put restrictions on downgrades (e.g. for repairs after a bugfix).
 const (
 	dbVersion             = 14
-	dbMigrationVersion    = 19
+	dbMigrationVersion    = 20
 	dbMinSyncthingVersion = "v1.9.0"
 )
 
@@ -102,7 +102,8 @@ func (db *schemaUpdater) updateSchema() error {
 		{14, 14, "v1.9.0", db.updateSchemaTo14},
 		{14, 16, "v1.9.0", db.checkRepairMigration},
 		{14, 17, "v1.9.0", db.migration17},
-		{14, 19, "v1.9.0", db.dropIndexIDsMigration},
+		{14, 19, "v1.9.0", db.dropAllIndexIDsMigration},
+		{14, 20, "v1.9.0", db.dropOutgoingIndexIDsMigration},
 	}
 
 	for _, m := range migrations {
@@ -130,13 +131,13 @@ func (db *schemaUpdater) updateSchema() error {
 }
 
 func (*schemaUpdater) writeVersions(m migration, miscDB *NamespacedKV) error {
-	if err := miscDB.PutInt64("dbVersion", m.schemaVersion); err != nil && err == nil {
+	if err := miscDB.PutInt64("dbVersion", m.schemaVersion); err != nil {
 		return err
 	}
-	if err := miscDB.PutString("dbMinSyncthingVersion", m.minSyncthingVersion); err != nil && err == nil {
+	if err := miscDB.PutString("dbMinSyncthingVersion", m.minSyncthingVersion); err != nil {
 		return err
 	}
-	if err := miscDB.PutInt64("dbMigrationVersion", m.migrationVersion); err != nil && err == nil {
+	if err := miscDB.PutInt64("dbMigrationVersion", m.migrationVersion); err != nil {
 		return err
 	}
 	return nil
@@ -831,10 +832,14 @@ func (db *schemaUpdater) migration17(prev int) error {
 	return nil
 }
 
-func (db *schemaUpdater) dropIndexIDsMigration(_ int) error {
+func (db *schemaUpdater) dropAllIndexIDsMigration(_ int) error {
 	return db.dropIndexIDs()
 }
 
+func (db *schemaUpdater) dropOutgoingIndexIDsMigration(_ int) error {
+	return db.dropOtherDeviceIndexIDs()
+}
+
 func rewriteGlobals(t readWriteTransaction) error {
 	it, err := t.NewPrefixIterator([]byte{KeyTypeGlobal})
 	if err != nil {