Browse Source

Merge pull request #544 from marcindziadus/rescan-interval

Per repository scan intervals
Audrius Butkevicius 11 years ago
parent
commit
b6912ef95e
4 changed files with 46 additions and 27 deletions
  1. 24 13
      config/config.go
  2. 13 8
      config/config_test.go
  3. 7 4
      gui/index.html
  4. 2 2
      model/puller.go

+ 24 - 13
config/config.go

@@ -31,13 +31,14 @@ type Configuration struct {
 }
 
 type RepositoryConfiguration struct {
-	ID          string                        `xml:"id,attr"`
-	Directory   string                        `xml:"directory,attr"`
-	Nodes       []RepositoryNodeConfiguration `xml:"node"`
-	ReadOnly    bool                          `xml:"ro,attr"`
-	IgnorePerms bool                          `xml:"ignorePerms,attr"`
-	Invalid     string                        `xml:"-"` // Set at runtime when there is an error, not saved
-	Versioning  VersioningConfiguration       `xml:"versioning"`
+	ID              string                        `xml:"id,attr"`
+	Directory       string                        `xml:"directory,attr"`
+	Nodes           []RepositoryNodeConfiguration `xml:"node"`
+	ReadOnly        bool                          `xml:"ro,attr"`
+	RescanIntervalS int                           `xml:"rescanIntervalS,attr" default:"60"`
+	IgnorePerms     bool                          `xml:"ignorePerms,attr"`
+	Invalid         string                        `xml:"-"` // Set at runtime when there is an error, not saved
+	Versioning      VersioningConfiguration       `xml:"versioning"`
 
 	nodeIDs []protocol.NodeID
 }
@@ -116,7 +117,6 @@ type OptionsConfiguration struct {
 	LocalAnnMCAddr     string   `xml:"localAnnounceMCAddr" default:"[ff32::5222]:21026"`
 	ParallelRequests   int      `xml:"parallelRequests" default:"16"`
 	MaxSendKbps        int      `xml:"maxSendKbps"`
-	RescanIntervalS    int      `xml:"rescanIntervalS" default:"60"`
 	ReconnectIntervalS int      `xml:"reconnectionIntervalS" default:"60"`
 	StartBrowser       bool     `xml:"startBrowser" default:"true"`
 	UPnPEnabled        bool     `xml:"upnpEnabled" default:"true"`
@@ -124,11 +124,12 @@ type OptionsConfiguration struct {
 	UPnPRenewal        int      `xml:"upnpRenewalMinutes" default:"30"`
 	URAccepted         int      `xml:"urAccepted"` // Accepted usage reporting version; 0 for off (undecided), -1 for off (permanently)
 
-	Deprecated_UREnabled  bool   `xml:"urEnabled,omitempty" json:"-"`
-	Deprecated_URDeclined bool   `xml:"urDeclined,omitempty" json:"-"`
-	Deprecated_ReadOnly   bool   `xml:"readOnly,omitempty" json:"-"`
-	Deprecated_GUIEnabled bool   `xml:"guiEnabled,omitempty" json:"-"`
-	Deprecated_GUIAddress string `xml:"guiAddress,omitempty" json:"-"`
+	Deprecated_RescanIntervalS int    `xml:"rescanIntervalS,omitempty" json:"-"`
+	Deprecated_UREnabled       bool   `xml:"urEnabled,omitempty" json:"-"`
+	Deprecated_URDeclined      bool   `xml:"urDeclined,omitempty" json:"-"`
+	Deprecated_ReadOnly        bool   `xml:"readOnly,omitempty" json:"-"`
+	Deprecated_GUIEnabled      bool   `xml:"guiEnabled,omitempty" json:"-"`
+	Deprecated_GUIAddress      string `xml:"guiAddress,omitempty" json:"-"`
 }
 
 type GUIConfiguration struct {
@@ -372,10 +373,20 @@ func Load(rd io.Reader, myID protocol.NodeID) (Configuration, error) {
 }
 
 func convertV3V4(cfg *Configuration) {
+	// In previous versions, rescan interval was common for each repository.
+	// From now, it can be set independently. We have to make sure, that after upgrade
+	// the individual rescan interval will be defined for every existing repository.
+	for i := range cfg.Repositories {
+		cfg.Repositories[i].RescanIntervalS = cfg.Options.Deprecated_RescanIntervalS
+	}
+
+	cfg.Options.Deprecated_RescanIntervalS = 0
+
 	// In previous versions, repositories held full node configurations.
 	// Since that's the only place where node configs were in V1, we still have
 	// to define the deprecated fields to be able to upgrade from V1 to V4.
 	for i, repo := range cfg.Repositories {
+
 		for j := range repo.Nodes {
 			rncfg := cfg.Repositories[i].Nodes[j]
 			rncfg.Deprecated_Name = ""

+ 13 - 8
config/config_test.go

@@ -33,7 +33,6 @@ func TestDefaultValues(t *testing.T) {
 		LocalAnnMCAddr:     "[ff32::5222]:21026",
 		ParallelRequests:   16,
 		MaxSendKbps:        0,
-		RescanIntervalS:    60,
 		ReconnectIntervalS: 60,
 		StartBrowser:       true,
 		UPnPEnabled:        true,
@@ -70,6 +69,7 @@ func TestNodeConfig(t *testing.T) {
     </repository>
     <options>
         <readOnly>true</readOnly>
+        <rescanIntervalS>600</rescanIntervalS>
     </options>
 </configuration>
 `)
@@ -90,6 +90,9 @@ func TestNodeConfig(t *testing.T) {
     <node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ" name="node two">
         <address>b</address>
     </node>
+    <options>
+        <rescanIntervalS>600</rescanIntervalS>
+    </options>
 </configuration>
 `)
 
@@ -105,11 +108,14 @@ func TestNodeConfig(t *testing.T) {
     <node id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2" name="node two" compression="true">
         <address>b</address>
     </node>
+    <options>
+        <rescanIntervalS>600</rescanIntervalS>
+    </options>
 </configuration>`)
 
 	v4data := []byte(`
 <configuration version="4">
-    <repository id="test" directory="~/Sync" ro="true" ignorePerms="false">
+    <repository id="test" directory="~/Sync" ro="true" ignorePerms="false" rescanIntervalS="600">
         <node id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR"></node>
         <node id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2"></node>
     </repository>
@@ -129,10 +135,11 @@ func TestNodeConfig(t *testing.T) {
 
 		expectedRepos := []RepositoryConfiguration{
 			{
-				ID:        "test",
-				Directory: "~/Sync",
-				Nodes:     []RepositoryNodeConfiguration{{NodeID: node1}, {NodeID: node4}},
-				ReadOnly:  true,
+				ID:              "test",
+				Directory:       "~/Sync",
+				Nodes:           []RepositoryNodeConfiguration{{NodeID: node1}, {NodeID: node4}},
+				ReadOnly:        true,
+				RescanIntervalS: 600,
 			},
 		}
 		expectedNodes := []NodeConfiguration{
@@ -204,7 +211,6 @@ func TestOverriddenValues(t *testing.T) {
         <localAnnounceMCAddr>quux:3232</localAnnounceMCAddr>
         <parallelRequests>32</parallelRequests>
         <maxSendKbps>1234</maxSendKbps>
-        <rescanIntervalS>600</rescanIntervalS>
         <reconnectionIntervalS>6000</reconnectionIntervalS>
         <startBrowser>false</startBrowser>
         <upnpEnabled>false</upnpEnabled>
@@ -223,7 +229,6 @@ func TestOverriddenValues(t *testing.T) {
 		LocalAnnMCAddr:     "quux:3232",
 		ParallelRequests:   32,
 		MaxSendKbps:        1234,
-		RescanIntervalS:    600,
 		ReconnectIntervalS: 6000,
 		StartBrowser:       false,
 		UPnPEnabled:        false,

+ 7 - 4
gui/index.html

@@ -497,6 +497,13 @@
                     <span translate ng-if="repoEditor.repoPath.$error.required && repoEditor.repoPath.$dirty">The repository path cannot be blank.</span>
                   </p>
                 </div>
+                <div class="form-group" ng-class="{'has-error': repoEditor.rescanIntervalS.$invalid && repoEditor.rescanIntervalS.$dirty}">
+                  <label translate for="rescanIntervalS">Rescan Interval (s)</label>
+                  <input name="rescanIntervalS" placeholder="60" id="rescanIntervalS" class="form-control" type="number" ng-model="currentRepo.RescanIntervalS" required min="5"></input>
+                  <p class="help-block">
+                    <span translate ng-if="!repoEditor.rescanIntervalS.$valid && repoEditor.rescanIntervalS.$dirty">The rescan interval must be at least 5 seconds.</span>
+                  </p>
+                </div>
               </div>
             </div>
             <div class="row">
@@ -581,10 +588,6 @@
                   <label translate for="MaxSendKbps">Outgoing Rate Limit (KiB/s)</label>
                   <input id="MaxSendKbps" class="form-control" type="number" ng-model="tmpOptions.MaxSendKbps">
                 </div>
-                <div class="form-group">
-                  <label translate for="RescanIntervalS">Rescan Interval (s)</label>
-                  <input id="RescanIntervalS" class="form-control" type="number" ng-model="tmpOptions.RescanIntervalS">
-                </div>
                 <!--
                 <div class="form-group">
                   <label translate for="ReconnectIntervalS">Reconnect Interval (s)</label>

+ 2 - 2
model/puller.go

@@ -134,7 +134,7 @@ func newPuller(repoCfg config.RepositoryConfiguration, model *Model, slots int,
 
 func (p *puller) run() {
 	changed := true
-	scanintv := time.Duration(p.cfg.Options.RescanIntervalS) * time.Second
+	scanintv := time.Duration(p.repoCfg.RescanIntervalS) * time.Second
 	lastscan := time.Now()
 	var prevVer uint64
 	var queued int
@@ -241,7 +241,7 @@ func (p *puller) run() {
 }
 
 func (p *puller) runRO() {
-	walkTicker := time.Tick(time.Duration(p.cfg.Options.RescanIntervalS) * time.Second)
+	walkTicker := time.Tick(time.Duration(p.repoCfg.RescanIntervalS) * time.Second)
 
 	for _ = range walkTicker {
 		if debug {