4 years agoFix some stuck Inoreader synchronized items
Jack Miller [Wed, 3 Jun 2015 00:43:47 +0000 (19:43 -0500)]
Fix some stuck Inoreader synchronized items

It appears that sometimes, an item will be given a ""
tag, and it will resist being set as "read" on Inoreader's side, so
don't let fresh items override our local "read" state. If you mark it in
canto, it should stay read in canto.

4 years agoInoreader sync fixes
Jack Miller [Tue, 2 Jun 2015 22:15:39 +0000 (17:15 -0500)]
Inoreader sync fixes

- Introduce canto-inoreader-sync in the feed data
- Fix initial sync to Inoreader happening too often
- Get proper ids to tags_to_add/remove

4 years agoInoreader sync v0.2
Jack Miller [Tue, 2 Jun 2015 18:17:32 +0000 (13:17 -0500)]
Inoreader sync v0.2

- Stop using Inoreader as the source for feed data. Instead, use the
  standard canto-daemon fetch, and integrate Inoreader information into
  it. I made this decision for these reasons:

    - Fuck Inoreader ads coming through Canto
    - Inoreader seems to have trouble keeping up with quick feeds, not
      to mention the daemon concept of "rate" conflicts with InoReader
    - Inoreader content is sterile, so you don't have access to any
      interesting feed content, which breaks some reader extras.
    - Can use standard canto item IDs, so no dupes when you first turn
      on the plugin.

- Better initial merging, when we first see an item in Inoreader, if the
  canto item has important state, it's sent. This means that we don't
need to have Inoreader information to do the right thing when it does
show up (i.e. items won't be set as unread when they show up in
Inoreader, but have already been touched in canto)

- Fix removing tags via Inoreader not showing up in canto

4 years agoAllow feed edit_* plugins to declare add / remove tags
Jack Miller [Tue, 2 Jun 2015 18:16:51 +0000 (13:16 -0500)]
Allow feed edit_* plugins to declare add / remove tags

4 years agoRevert "Give canto-* attributes priority if it came from fetch thread"
Jack Miller [Tue, 2 Jun 2015 17:43:56 +0000 (12:43 -0500)]
Revert "Give canto-* attributes priority if it came from fetch thread"

This is better integrated later.

This reverts commit 3de10432bd86efd844724f303541705ef957ed0c.

4 years agoTrim Inoreader sync to 200 items
Jack Miller [Mon, 1 Jun 2015 06:28:56 +0000 (01:28 -0500)]
Trim Inoreader sync to 200 items

Yeah... probably don't need to be grabbing Inoreader's entire backlog
for the feeds. This might be sufficient, but it might be better to use
some of the time based API options, this is just a quickfix.

4 years agoRemove experimental TT-RSS server
Jack Miller [Mon, 1 Jun 2015 04:12:21 +0000 (23:12 -0500)]
Remove experimental TT-RSS server

Not interested in messing with this anymore.

4 years agoInoreader synchronization plugin v0.1
Jack Miller [Mon, 1 Jun 2015 04:06:56 +0000 (23:06 -0500)]
Inoreader synchronization plugin v0.1

Read the file for some caveats, but it seems to work pretty well.

4 years agoFix internal delconfig
Jack Miller [Mon, 1 Jun 2015 03:56:06 +0000 (22:56 -0500)]
Fix internal delconfig

4 years agoMake config globally available
Jack Miller [Mon, 1 Jun 2015 03:11:00 +0000 (22:11 -0500)]
Make config globally available

Similar to allfeeds and alltags, this is something that should be easy
to get to from anywhere.

4 years agoTypo fix populating tags from old items
Jack Miller [Mon, 1 Jun 2015 01:12:38 +0000 (20:12 -0500)]
Typo fix populating tags from old items

4 years agoGive canto-* attributes priority if it came from fetch thread
Jack Miller [Mon, 1 Jun 2015 01:12:02 +0000 (20:12 -0500)]
Give canto-* attributes priority if it came from fetch thread

Lets plugins sub in internal content on fetch.

4 years ago0.9.1 v0.9.1
Jack Miller [Fri, 9 Jan 2015 21:08:41 +0000 (15:08 -0600)]

4 years agoAdd hook test
Jack Miller [Fri, 9 Jan 2015 02:51:49 +0000 (20:51 -0600)]
Add hook test

4 years agoTrim empty hooks on removals
Jack Miller [Fri, 9 Jan 2015 02:50:13 +0000 (20:50 -0600)]
Trim empty hooks on removals

Don't think this has caused any memory trouble yet (since our usecase is
a handful of long lived hooks), but these should be disposed of.

4 years agoWorkaround feedparser issue 283 (fix basic auth feeds)
Jack Miller [Thu, 8 Jan 2015 22:37:10 +0000 (16:37 -0600)]
Workaround feedparser issue 283 (fix basic auth feeds)

Apparently auth handlers are processed too late, so they need to get
bumped up to work.

With test =)

4 years agoKeep all items on empty new content
Jack Miller [Wed, 3 Dec 2014 18:19:29 +0000 (12:19 -0600)]
Keep all items on empty new content

Fixes daemon running with items over keep_time that will later appear
in the non-empty feed when we get it.

4 years agoAdd experimental TT-RSS server compatibility plugin
Jack Miller [Thu, 27 Nov 2014 06:03:53 +0000 (00:03 -0600)]
Add experimental TT-RSS server compatibility plugin

- Read-only in this version, but WIP
- Auth is non-functional

4 years agoAdd feed.index test
Jack Miller [Mon, 24 Nov 2014 23:45:16 +0000 (17:45 -0600)]
Add feed.index test

4 years agoJust remove all items and re-add them on index
Jack Miller [Mon, 24 Nov 2014 21:46:23 +0000 (15:46 -0600)]
Just remove all items and re-add them on index

- Less code, and keeps items on life support (i.e. not in the feed but
  kept around via keep_time or keep_unread ) toward the end instead of
the beginning so tag[0] is always the most recent top item.

4 years agoProperly queue up tags for old items
Jack Miller [Mon, 24 Nov 2014 16:43:41 +0000 (10:43 -0600)]
Properly queue up tags for old items

4 years agoKey hooks for mass removal
Jack Miller [Sun, 23 Nov 2014 04:55:52 +0000 (22:55 -0600)]
Key hooks for mass removal

5 years ago0.9.0 v0.9.0
Jack Miller [Wed, 19 Nov 2014 17:53:58 +0000 (11:53 -0600)]

5 years agoFix populating user tags on index()
Jack Miller [Mon, 17 Nov 2014 22:02:22 +0000 (16:02 -0600)]
Fix populating user tags on index()

5 years agoKeep needs_update() from hitting the shelf
Jack Miller [Mon, 17 Nov 2014 07:47:36 +0000 (01:47 -0600)]
Keep needs_update() from hitting the shelf

Keep a timestamp in memory instead of just in the shelf itself.

Also fixes the high CPU usage introduced in the previous commit.

5 years agoRemove pointless fetch timer
Jack Miller [Sat, 15 Nov 2014 23:16:43 +0000 (17:16 -0600)]
Remove pointless fetch timer

We already have a good mechanism in place for fetch thread timing, the
second layer of timing was just a way to waste time. At the cost of
taking feed_lock (a low contention lock) briefly once a second (instead
of once a minute) fetch work is done faster.

This is especially important on a fresh startup where there is no disk
presence already.

In addition, scale back some logging that is made annoying by the
increased frequency of some fetch calls.

5 years agoPass client verbosity onto daemon if forked
Jack Miller [Sat, 15 Nov 2014 21:10:58 +0000 (15:10 -0600)]
Pass client verbosity onto daemon if forked

(i.e. starting canto-curses -v will start canto-daemon -v if there isn't
already a daemon running)

5 years agoUpdate copyright date
Jack Miller [Fri, 7 Nov 2014 16:23:49 +0000 (10:23 -0600)]
Update copyright date

5 years agoAdd non-blocking support to RWLock
Jack Miller [Wed, 29 Oct 2014 19:43:40 +0000 (14:43 -0500)]
Add non-blocking support to RWLock

5 years agotry_plugins may now return error string
Jack Miller [Wed, 29 Oct 2014 19:15:13 +0000 (14:15 -0500)]
try_plugins may now return error string

If there were plugin-fatal errors on import, that information is
probably interesting.

5 years agoMinor logging / buffer sizing tweak
Jack Miller [Wed, 29 Oct 2014 05:08:44 +0000 (00:08 -0500)]
Minor logging / buffer sizing tweak

Drastically improves the readability of logs

5 years agoUse timestamps instead of ticking for sync
Jack Miller [Sat, 27 Sep 2014 23:58:20 +0000 (18:58 -0500)]
Use timestamps instead of ticking for sync

This should make sync work a little bit better when dealing with
suspending machines or any other reason ticks might spread out.

5 years agoDatabase mod times should be UTC
Jack Miller [Sat, 27 Sep 2014 23:44:12 +0000 (18:44 -0500)]
Database mod times should be UTC

If they're going to be used for comparison (like sync), it should be
consistent regardless of timezone.

5 years agov0.9.0-alpha5 v0.9.0-alpha5
Jack Miller [Fri, 26 Sep 2014 16:22:05 +0000 (11:22 -0500)]

5 years agoBrush up manpages
Jack Miller [Thu, 25 Sep 2014 21:33:32 +0000 (16:33 -0500)]
Brush up manpages

- Update daemon/remote command line usage
- Add plugin information to daemon manpage
- Remove .canto-ng/conf from "FILES" in an attempt to discourage hand use,
  although it's still just sitting where you'd expect =P
- Add remote command details

5 years agoFailure to parse global_transform is now fatal
Jack Miller [Thu, 25 Sep 2014 02:13:06 +0000 (21:13 -0500)]
Failure to parse global_transform is now fatal

5 years agoDon't propagate config changes that errored
Jack Miller [Thu, 25 Sep 2014 02:12:36 +0000 (21:12 -0500)]
Don't propagate config changes that errored

5 years agoAdd config notification to sync plugin
Jack Miller [Wed, 17 Sep 2014 20:42:19 +0000 (15:42 -0500)]
Add config notification to sync plugin

I'm pretty sure this is working okay (I can see the changes propagate)
but there are some changes that need to be made to c-c to automatically
refresh on some of the changes (i.e. global_transform).

5 years agoFix canto-remote export
Jack Miller [Mon, 15 Sep 2014 23:03:02 +0000 (18:03 -0500)]
Fix canto-remote export

Don't care about type detection.

5 years agov0.9.0-alpha4 v0.9.0-alpha4
Jack Miller [Mon, 15 Sep 2014 17:24:21 +0000 (12:24 -0500)]

5 years agoFix config timestamp
Jack Miller [Mon, 15 Sep 2014 06:39:04 +0000 (01:39 -0500)]
Fix config timestamp

5 years agoFix confused sync
Jack Miller [Mon, 15 Sep 2014 06:28:48 +0000 (01:28 -0500)]
Fix confused sync

syncto in loop should've been eliminated when syncfrom became sync.

5 years agoFix shelf timestamping
Jack Miller [Mon, 15 Sep 2014 06:02:33 +0000 (01:02 -0500)]
Fix shelf timestamping

- Cache is only one key deep, so we have to read-modify-write just to
  change a single key in 'control'

5 years agoMore lock tweaks
Jack Miller [Sun, 14 Sep 2014 22:49:16 +0000 (17:49 -0500)]
More lock tweaks

- Now that feed.locks are no longer serial, we can afford to properly
  lock then on apply_transforms, using a new function to take selective
feed.locks in the same order as the allfeed variants.

- Only hold most cmd_items lock during apply_transforms

- cmd_listtags holds tag_lock which is now held independently from
  feed.lock, so we don't need to get feed.locks anymore, just feed_lock
since we're using get_feeds()

- cmd_attributes holds feed_lock for the same reason, but can still
  throw exception since attributes can be requested for items that don't
match up to real feeds.

- feed_lock is no longer taken first, but in the same alphabetical order
  we use conventionally.

5 years agoBetter exception handling in locks
Jack Miller [Sun, 14 Sep 2014 22:48:11 +0000 (17:48 -0500)]
Better exception handling in locks

5 years agoAdd canto-modified information to 'control'
Jack Miller [Sun, 14 Sep 2014 22:46:53 +0000 (17:46 -0500)]
Add canto-modified information to 'control'

5 years agoget_attributes loop should break
Jack Miller [Sun, 14 Sep 2014 21:15:35 +0000 (16:15 -0500)]
get_attributes loop should break

5 years agoget_config remote feed_lock
Jack Miller [Sun, 14 Sep 2014 20:52:16 +0000 (15:52 -0500)]
get_config remote feed_lock

5 years agoFix -a and -p --help output for remote
Jack Miller [Sun, 14 Sep 2014 20:03:31 +0000 (15:03 -0500)]
Fix -a and -p --help output for remote

5 years agoRoll up locks required to parse the config
Jack Miller [Sun, 14 Sep 2014 19:33:11 +0000 (14:33 -0500)]
Roll up locks required to parse the config

- Also corrects the parse usage in sync plugin

Config users shouldn't have to know what locks the config wants, and
they could change at some point.

5 years agoSelective config reparse
Jack Miller [Sun, 14 Sep 2014 03:57:55 +0000 (22:57 -0500)]
Selective config reparse

Since we host client configuration, we should only reparse the config
when a value that actually affects the daemon is set.

The daemon-irrelevant config changes will still be written and
reflected to clients.

5 years agoAllow return all attributes
Jack Miller [Sat, 13 Sep 2014 19:37:07 +0000 (14:37 -0500)]
Allow return all attributes

When ATTRIBUTES's arg has an id with an empty list of attributes
requested, then return all of the item data.

Good for discovery of items.

5 years agoStart installing plugins to [prefix]/lib/canto/plugins
Jack Miller [Sat, 13 Sep 2014 18:13:13 +0000 (13:13 -0500)]
Start installing plugins to [prefix]/lib/canto/plugins


5 years agoStop sending TAGCHANGE on reset()
Jack Miller [Sat, 13 Sep 2014 08:03:26 +0000 (03:03 -0500)]
Stop sending TAGCHANGE on reset()

reset() will likely just be repopulating anyway, and add / remove will
handle it otherwise.

5 years agoFix sending ITEMs for empty tags
Jack Miller [Sat, 13 Sep 2014 00:45:35 +0000 (19:45 -0500)]
Fix sending ITEMs for empty tags

5 years ago0.9.0-alpha3 v0.9.0-alpha3
Jack Miller [Fri, 12 Sep 2014 20:06:45 +0000 (15:06 -0500)]

5 years agoFix expanding feed file
Jack Miller [Fri, 12 Sep 2014 07:16:14 +0000 (02:16 -0500)]
Fix expanding feed file

5 years agoExcept for maintag: leave categorization to clients
Jack Miller [Fri, 12 Sep 2014 06:04:22 +0000 (01:04 -0500)]
Except for maintag: leave categorization to clients

5 years agov0.9.0-alpha2
Jack Miller [Thu, 11 Sep 2014 02:35:56 +0000 (21:35 -0500)]

5 years agoLog version / hash
Jack Miller [Thu, 11 Sep 2014 02:35:00 +0000 (21:35 -0500)]
Log version / hash

5 years agoRemove h and help options from common args
Jack Miller [Wed, 10 Sep 2014 05:30:36 +0000 (00:30 -0500)]
Remove h and help options from common args

5 years agoImplement caching options
Jack Miller [Wed, 10 Sep 2014 04:36:16 +0000 (23:36 -0500)]
Implement caching options

So, it's come to my attention that not everyone runs the daemon on a
quick disk, and some people don't care enough about 100M of RAM to put
up with items taking seconds longer to load.

I also would like more information about memory costs of various

To accomodate, I've added a -c/--cache option that will take an

    - 'on' turns the cache on all the time (similar to before the
      minimization patches). Obviously this is the fastest, most memory

    - 'conn' heats up the cache while connections are live

    - 'off' relies on the disk for almost everything.

Off is still the default, but I'll run some fresh metrics on memory
usage over time now that the usage pattern has changed a bit.

5 years agoFixed plugin control arg parsing
Jack Miller [Wed, 10 Sep 2014 03:50:44 +0000 (22:50 -0500)]
Fixed plugin control arg parsing

This is what I get for waffling between two terms.

5 years agoAdd first connect and last connect hooks
Jack Miller [Wed, 10 Sep 2014 02:46:06 +0000 (21:46 -0500)]
Add first connect and last connect hooks

"server_first_connection" is called with no arguments when a connection
is made and there were no previously active connections. So to be clear
"first_connection" can be called multiple times as long as at some time
in between calls there were no connections.

"server_no_connections" is the inverse. It's called with no arguments
when a disconnect occurs and there are no more connections.

5 years agoProtection is eliminated.
Jack Miller [Tue, 9 Sep 2014 22:09:31 +0000 (17:09 -0500)]
Protection is eliminated.

The idea behind the protection system was that items that were sitting
in the client, but protected, would never have requests for information
fail. A noble goal. However, I've decided that it's just not worth the
effort. Here's why:

- 99.99% of the time items are protected without need. Items are already
  kept for 24 hours *after* they disappear from the source feed. So,
assuming that a client gets the item immediately before it disappears,
it still has to sit there for a full day before protection makes one bit
of difference.

- Keeping in mind that's it's extremely rare that protection would
  matter, I can't justify all of this:

    - Having logic to keep dead feeds around when they have protected

    - Having to hold a lock in feed.index to check protections

    - Having to automatically protect every item sent to a client to
      keep the whole thing from being racy.

    - Forcing the sync plugin to try and reconcile protected old items
      that no longer exist in new content.

- In addition, protection doesn't mean that attribute requests will
  never fail because attribute requests can always fail. Items might not
even have a "title" entry for Chrissakes, so it's not really saving any
complexity on the client side

- Most importantly for this argument, if you really want to make sure
  you never lose an item there's keep_unread which will keep every
single item that you haven't explicitly marked read (and works naturally
without any of the bullshit from point 2).

Filter-immune protection was eliminated as well, which caused an API
change to transforms. This system was inherently racy with
multi-threading anyway (i.e. items received before filter-immunity set)

I came up with a few solutions that kept this system alive, like keeping
protected items in memory instead of on disk (which would avoid the
technical shortcomings) but when every item in a client has to be
protected by default to keep the system from being racy the memory cost
was too great just for the 00.01% case.

5 years agoDELTAGs are now only issued for feeds that have been removed
Jack Miller [Tue, 9 Sep 2014 19:25:10 +0000 (14:25 -0500)]
DELTAGs are now only issued for feeds that have been removed

Tags aren't always mentioned in the config, so we have no idea if
they're really dead.

So, when a feed is dead, send a DELTAG for its maintag: and that's it.
Everything else will just get an empty TAGCHANGE.

5 years agoGiving --port without --address now assumes address is loopback
Jack Miller [Tue, 9 Sep 2014 17:12:09 +0000 (12:12 -0500)]
Giving --port without --address now assumes address is loopback

Thanks to ewancoder for pointing out this incompatibility

5 years agoProperly cache umod time
Jack Miller [Tue, 9 Sep 2014 16:41:40 +0000 (11:41 -0500)]
Properly cache umod time

Should fix sync timing issues.

5 years agoAdd git hashes to -V output
Jack Miller [Tue, 9 Sep 2014 05:29:33 +0000 (00:29 -0500)]
Add git hashes to -V output

This tries its best. If there's no git in PATH, it will be blank, and
it's using os.utime to touch source files to force them to be
reinstalled every time.

5 years agoQuiet sync plugin
Jack Miller [Tue, 9 Sep 2014 03:48:04 +0000 (22:48 -0500)]
Quiet sync plugin

5 years agoStandardize arg parsing
Jack Miller [Tue, 9 Sep 2014 03:38:05 +0000 (22:38 -0500)]
Standardize arg parsing

daemon, remote and curses (with a companion patch) will share a bunch of
arguments, particularly useful because the plugin switches are now
universal, as well as --help, --version etc.

5 years agoMissing -V in help text
Jack Miller [Tue, 9 Sep 2014 02:40:07 +0000 (21:40 -0500)]
Missing -V in help text

5 years agoMove remote logging init to instantiation
Jack Miller [Tue, 9 Sep 2014 02:31:02 +0000 (21:31 -0500)]
Move remote logging init to instantiation

canto_next.remote gets imported (i.e. by plugins) so don't fuck with
logging configuration unless we're actually running.

5 years agoAlias description and summary
Jack Miller [Tue, 9 Sep 2014 00:31:41 +0000 (19:31 -0500)]
Alias description and summary

5 years agoImprove sync plugin
Jack Miller [Mon, 8 Sep 2014 23:23:43 +0000 (18:23 -0500)]
Improve sync plugin

- `canto-remote sync` and `canto-remote help sync` works.
- clear up the terminology a bit to (syncfrom -> sync since it will
  possibly also syncto).

5 years agoRemote plugin improvements
Jack Miller [Mon, 8 Sep 2014 23:13:49 +0000 (18:13 -0500)]
Remote plugin improvements

- Load plugins
- Properly rely on hasattr for plugin lookup
- Hook to print commands from plugin

5 years agoAdd -h/--help
Jack Miller [Mon, 8 Sep 2014 22:38:09 +0000 (17:38 -0500)]
Add -h/--help

5 years agoAdd plugin control options
Jack Miller [Mon, 8 Sep 2014 21:48:22 +0000 (16:48 -0500)]
Add plugin control options

--noplugins will disable all plugins, but can be overridden by adding
--enableplugins "one two ..." and normal operation can disable single
plugins with --disableplugins "one two ..."

This is mostly to aid testing, but may be useful otherwise.

5 years agoClose dangling file handle
Jack Miller [Mon, 8 Sep 2014 21:32:26 +0000 (16:32 -0500)]
Close dangling file handle

5 years agoMake fetches all happen from maintenance thread
Jack Miller [Sun, 7 Sep 2014 21:52:03 +0000 (16:52 -0500)]
Make fetches all happen from maintenance thread

This allows us to get rid of fetch_lock as well as currying multiple
update requests into a single action.

5 years agoMemory usage improvements.
Jack Miller [Sun, 7 Sep 2014 22:00:59 +0000 (17:00 -0500)]
Memory usage improvements.

Another weekend spent poring over memory diagnostics and I think I've
finally got the daemon memory optimized. This is the first time I sat
down with Python's resource module and just started to go at the code
basically bisecting to find where the reported usage rose.

To my surprise, it wasn't an actual memory leak (although I guess I
should have known when all of the fancy tools kept telling me the number
of objects was level), but it was that every time I touched the
database, memory usage would skyrocket. Now, with writeback on (which
was the default) I would expect that, but when your memory usage grows
by 8M (which I assume is 2x pymalloc blocks) when *overwriting* a 500k
value something's wrong.

With writeback disabled (--nowb), the memory usage flattened out, but
the daemon was unresponsive. So, now that I have a properly threaded
daemon, I decided to make it work.

8 - 10 hour tests conducted over the weekend show about a 50% memory
reduction running under the same conditions over that period. For
example, going from >90M usage to ~45M.

- Shelf modified to only touch disk on close/sync and possibly read.
  Which means the fetching threads only have to hit disk at most once on
read, and never on write. Before it was the opposite.

- Syncs are now only done from the main thread, not the fetching or
  worker threads. This speeds them up and hides the write overhead in
the main thread along with the other maintenance tasks.

- Feed.items no longer exists. It was intended to be a sort of quick
  cache, but was never populated aside from item ids (a cached index, I
suppose) and in practice the disk is fast enough. Especially when the
client is also loading stuff in the background. This simplifies

- Minor memory optimizations in feed.index(), particularly not making a
  duplicate list of items or feed.items at all.

- --nowb doesn't exist anymore for obvious reasons

5 years agoFix index work
Jack Miller [Fri, 5 Sep 2014 02:39:13 +0000 (21:39 -0500)]
Fix index work

Urgh, daemon_work_done wants to sync() which wants to get locks which is
way too much contention for the threads.

So, instead, do the call when the threads are reaped.

5 years agoFix syncto on close
Jack Miller [Fri, 5 Sep 2014 01:59:54 +0000 (20:59 -0500)]
Fix syncto on close

Storage has been able to assume that sync() wouldn't be called while it
was closed up to now, but the sync plugin breaks that assumption and
shouldn't really have to check itself to make sure sync() won't blow up.

5 years agoFeed indexing should count as "work"
Jack Miller [Fri, 5 Sep 2014 01:52:05 +0000 (20:52 -0500)]
Feed indexing should count as "work"

The daemon_work_done hook is used to indicate that a command is over so
that stuff like TAGCHANGE can be batched (so you don't get TAGCHANGE for
every single item being added or removed).

This change causes indexing threads to also call daemon_work_done, so
that TAGCHANGEs can be propagated properly.

5 years agoAdd lightweight file sync plugins
Jack Miller [Thu, 4 Sep 2014 20:47:51 +0000 (15:47 -0500)]
Add lightweight file sync plugins

These are alpha, but they work for the feed database and config.

Plugins are a definite maybe in the future, but as of now can't be
hotswapped so would require that or some sort of restart (which might be
useful elsewhere too).

This adds sync functionality to the daemon using the new metadata. is the foundation, which handles all of the locking and
reloading that needs to happen. is a basic implementation
of an rsync sync, where the database is rsync'd to a remote or local

There's still a lot of testing to be done, and the has a TODO in
it that needs a lot of work (particularly, I have to decide how the sync
will be exposed to the client and how protection guarantees will be


- Supports local movement for NFS/sshfs/Dropbox etc.
- Easy to write new storage methods (see
- Doesn't require canto-daemon running elsewhere, so shared hosts or
  storage services are valid targets.


- sync-rsync requires rsync in your $PATH and on the remote server, if
  you're using one.

- Hasn't been tested without a decent connection, although sync-rsync
  should just fail gracefully.

- It's a bit free-wheeling with bandwidth at the moment. Nothing that
  should make you bat an eye on a modern connection (maybe 10M an hour),
but if you're on a metered connection, or trying to use sync from
Antarctica you might want to think twice.

5 years agoDon't write config when we just read it
Jack Miller [Thu, 4 Sep 2014 22:03:03 +0000 (17:03 -0500)]
Don't write config when we just read it

If we properly validated the config, even if we made corrections to it,
it doesn't need to be rewritten.

This preserves the modified time of the config file.

5 years agoImprove CantoBackend init
Jack Miller [Thu, 4 Sep 2014 20:44:23 +0000 (15:44 -0500)]
Improve CantoBackend init

Do init immediately, as would be expected.

5 years agoAdd 'control' key to database
Jack Miller [Thu, 4 Sep 2014 20:43:07 +0000 (15:43 -0500)]
Add 'control' key to database

Allow us to store some metadata, like the new canto-user-modified time

5 years agoPlugin improvements
Jack Miller [Thu, 4 Sep 2014 03:28:08 +0000 (22:28 -0500)]
Plugin improvements

- Plugins are now evaled in alphabetical order. Plugins should be able
  to rely on one another, so a defined load order is necessary.

- CantoRemote and CantoBackend are now plugin compatible.

5 years agoMake transforms a warn instead of fatal
Jack Miller [Wed, 3 Sep 2014 02:10:27 +0000 (21:10 -0500)]
Make transforms a warn instead of fatal

Fallback to empty filter. This fixes, for example, losing defined
transforms by deleting a plugin (like the reddit plugin).

5 years agoYet more debug
Jack Miller [Wed, 3 Sep 2014 02:09:25 +0000 (21:09 -0500)]
Yet more debug

Add some memory usage output if pympler is installed.

5 years agoMore hooks
Jack Miller [Wed, 3 Sep 2014 16:46:58 +0000 (11:46 -0500)]
More hooks

- pre and post socket commands with socket + arguments
- open and close database hooks with filename

5 years agowlock/wunlock_all needs to hold feed_lock write
Jack Miller [Fri, 22 Aug 2014 00:52:21 +0000 (19:52 -0500)]
wlock/wunlock_all needs to hold feed_lock write

5 years agoPunt on missing attributes
Jack Miller [Wed, 20 Aug 2014 05:02:55 +0000 (00:02 -0500)]
Punt on missing attributes

So I've been seeing occasional crashes where I'm trying to filter items
that have no attributes on disk. I don't know why this is happening, but
crashes aren't helping and I need more info.

For now, just print some log output and filter out the offending items.
Perhaps getting some more context instead of crashing will help me get
the information I need to properly fix it.

5 years agoFix reddit plugin URL match
Jack Miller [Sat, 16 Aug 2014 02:07:23 +0000 (21:07 -0500)]
Fix reddit plugin URL match

Can't count on ?, can probably count on leading /

5 years agoMake executable
Jack Miller [Sat, 16 Aug 2014 01:59:43 +0000 (20:59 -0500)]
Make executable

5 years agoFix sweep_tags
Jack Miller [Sat, 16 Aug 2014 01:19:24 +0000 (20:19 -0500)]
Fix sweep_tags

More confusion over disk vs. cache ids

5 years agoSet attributes now needs tag_lock write
Jack Miller [Sat, 16 Aug 2014 00:57:20 +0000 (19:57 -0500)]
Set attributes now needs tag_lock write

We may add or remove tags from items with it.

5 years agoFix socket cleanup
Jack Miller [Sat, 16 Aug 2014 00:23:47 +0000 (19:23 -0500)]
Fix socket cleanup

Didn't catch this instance of rename

5 years agoSpawn FetchThreads to populate items from disk only
Jack Miller [Fri, 15 Aug 2014 19:13:24 +0000 (14:13 -0500)]
Spawn FetchThreads to populate items from disk only

This makes it spawn threads right before it begins to serve.

Before you'd have to wait for a network fetch to actually occur (or
timeout, either way).