We have the invalid bit to indicate that a file isn't good. That's enough for remote devices. For ourselves, it would be good to know sometimes why the file isn't good - because it's an unsupported type, because it matches an ignore pattern, or because we detected the data is bad and we need to rescan it. Or, and this is the main future reason for the PR, because it's a change detected on a receive only device. We will want something like the invalid flag for those changes, but marking them as invalid today means the scanner will rehash them. Hence something more fine grained is required. This introduces a LocalFlags fields to the FileInfo where we can stash things that we care about locally. For example, FlagLocalUnsupported = 1 << 0 // The kind is unsupported, e.g. symlinks on Windows FlagLocalIgnored = 1 << 1 // Matches local ignore patterns FlagLocalMustRescan = 1 << 2 // Doesn't match content on disk, must be rechecked fully The LocalFlags fields isn't sent over the wire; instead the Invalid attribute is calculated based on the flags at index sending time. It's on the FileInfo anyway because that's what we serialize to database etc. The actual Invalid flag should after this just be considered when building the global state and figuring out availability for remote devices. It is not used for local file index entries.
62 lines
2.2 KiB
Protocol Buffer
62 lines
2.2 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package db;
|
|
|
|
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
|
|
import "github.com/syncthing/syncthing/lib/protocol/bep.proto";
|
|
|
|
option (gogoproto.goproto_getters_all) = false;
|
|
option (gogoproto.sizer_all) = false;
|
|
option (gogoproto.protosizer_all) = true;
|
|
|
|
message FileVersion {
|
|
protocol.Vector version = 1 [(gogoproto.nullable) = false];
|
|
bytes device = 2;
|
|
bool invalid = 3;
|
|
}
|
|
|
|
message VersionList {
|
|
option (gogoproto.goproto_stringer) = false;
|
|
repeated FileVersion versions = 1 [(gogoproto.nullable) = false];
|
|
}
|
|
|
|
// Must be the same as FileInfo but without the blocks field
|
|
message FileInfoTruncated {
|
|
option (gogoproto.goproto_stringer) = false;
|
|
string name = 1;
|
|
protocol.FileInfoType type = 2;
|
|
int64 size = 3;
|
|
uint32 permissions = 4;
|
|
int64 modified_s = 5;
|
|
int32 modified_ns = 11;
|
|
uint64 modified_by = 12 [(gogoproto.customtype) = "github.com/syncthing/syncthing/lib/protocol.ShortID", (gogoproto.nullable) = false];
|
|
bool deleted = 6;
|
|
bool invalid = 7 [(gogoproto.customname) = "RawInvalid"];
|
|
bool no_permissions = 8;
|
|
protocol.Vector version = 9 [(gogoproto.nullable) = false];
|
|
int64 sequence = 10;
|
|
int32 block_size = 13 [(gogoproto.customname) = "RawBlockSize"];
|
|
// repeated BlockInfo Blocks = 16
|
|
string symlink_target = 17;
|
|
|
|
// see bep.proto
|
|
uint32 local_flags = 1000;
|
|
}
|
|
|
|
// For each folder and device we keep one of these to track the current
|
|
// counts and sequence. We also keep one for the global state of the folder.
|
|
message Counts {
|
|
int32 files = 1;
|
|
int32 directories = 2;
|
|
int32 symlinks = 3;
|
|
int32 deleted = 4;
|
|
int64 bytes = 5;
|
|
int64 sequence = 6; // zero for the global state
|
|
bytes deviceID = 17; // device ID for remote devices, or special values for local/global
|
|
}
|
|
|
|
message CountsSet {
|
|
repeated Counts counts = 1 [(gogoproto.nullable) = false];
|
|
int64 created = 2; // unix nanos
|
|
}
|