Skip to content

Commit

Permalink
lib/db: Drop indexes for outgoing data to force refresh (ref #9496) (#…
Browse files Browse the repository at this point in the history
…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...
  • Loading branch information
calmh committed Apr 8, 2024
1 parent 6fb3c5c commit 61b94b9
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 6 deletions.
5 changes: 5 additions & 0 deletions lib/db/keyer.go
Expand Up @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down
18 changes: 18 additions & 0 deletions lib/db/lowlevel.go
Expand Up @@ -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 {
Expand Down
17 changes: 11 additions & 6 deletions lib/db/schemaupdater.go
Expand Up @@ -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"
)

Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 61b94b9

Please sign in to comment.