randgalt [Thu, 9 Jul 2020 22:11:47 +0000 (17:11 -0500)]
CURATOR-577 - Add a dedicated downloads page to the website
Add a dedicated downloads page to the website. Note: this page depends
on the new property "currentStableVersion"
Enrico Olivelli [Tue, 30 Jun 2020 13:03:19 +0000 (15:03 +0200)]
[maven-release-plugin] prepare for next development iteration
Enrico Olivelli [Tue, 30 Jun 2020 13:03:09 +0000 (15:03 +0200)]
[maven-release-plugin] prepare release apache.curator-5.1.0
Jordan Zimmerman [Thu, 25 Jun 2020 15:27:22 +0000 (10:27 -0500)]
Update README.md
Added Twitter follow badge
randgalt [Thu, 25 Jun 2020 06:46:08 +0000 (08:46 +0200)]
CURATOR-575: TestingServer shutdown can cause an NPE
TestingServer shutdown can cause an NPE due to FileTxnSnapLog being closed in a different thread
Author: randgalt <randgalt@apache.org>
Reviewers: Enrico Olivelli <eolivelli@apache.org>, Cameron McKenzie <mckenzie.cam@gmail.com>
Closes #368 from Randgalt/CURATOR-575-fix-testing-server-npe
Enrico Olivelli [Tue, 23 Jun 2020 11:28:23 +0000 (13:28 +0200)]
CURATOR-574 DiscoveryService fatal error on deserializing an empty byte[] as JSON
Enrico Olivelli [Mon, 15 Jun 2020 14:31:23 +0000 (16:31 +0200)]
CURATOR-574 DiscoveryService fatal error on deserializing an empty byte[] as JSON
Cam McKenzie [Mon, 15 Jun 2020 22:11:43 +0000 (08:11 +1000)]
Merge branch 'master' of https://github.com/apache/curator
Enrico Olivelli [Fri, 12 Jun 2020 15:47:19 +0000 (17:47 +0200)]
Add Enrico Olivelli as Committer and PMC
Cam McKenzie [Wed, 3 Jun 2020 01:00:29 +0000 (11:00 +1000)]
Merge branch 'master' of https://github.com/apache/curator
Jordan Zimmerman [Wed, 20 May 2020 16:31:01 +0000 (11:31 -0500)]
Fixed typo
Jordan Zimmerman [Wed, 20 May 2020 16:30:30 +0000 (11:30 -0500)]
More/better links in the Read Me
Jordan Zimmerman [Wed, 20 May 2020 16:26:11 +0000 (11:26 -0500)]
Fixed the website badge
Cameron McKenzie [Mon, 18 May 2020 02:43:58 +0000 (12:43 +1000)]
[maven-release-plugin] prepare for next development iteration
Cameron McKenzie [Mon, 18 May 2020 02:43:48 +0000 (12:43 +1000)]
[maven-release-plugin] prepare release apache-curator-5.0.0
Jordan Zimmerman [Sat, 16 May 2020 04:49:08 +0000 (23:49 -0500)]
Added some more icons
randgalt [Fri, 15 May 2020 20:03:52 +0000 (15:03 -0500)]
Added missing headers from CURATOR-569
chevaris [Sun, 10 May 2020 16:41:05 +0000 (18:41 +0200)]
CURATOR-569
- New methods to handle protected ZNode names
randgalt [Sun, 10 May 2020 16:15:38 +0000 (11:15 -0500)]
CURATOR-558 was supposed to shade all of Guava - forgot to remove the exclusions for the old guava classes that were still exposed. This was causing the installed JARs to be incorrect (missing the 3 shaded Guava classes) in the client JAR
randgalt [Sat, 9 May 2020 22:56:42 +0000 (17:56 -0500)]
testDisconnectReconnectEventDoesNotFireValueWatcher() added as part of CURATOR-344 was flakey and would fail on the final assertion of numChangeEvents.get(). I don't believe you can be assured of the exact number so I made it more lenient and hopefully less flakey
randgalt [Sat, 9 May 2020 15:40:03 +0000 (10:40 -0500)]
make testParentContainerMissing() more resilient by waiting for initial connection
randgalt [Sat, 9 May 2020 14:46:05 +0000 (09:46 -0500)]
testDeleteChildrenConcurrently() was badly written and error prone. I fixed it so it should run every time now
randgalt [Fri, 8 May 2020 13:00:41 +0000 (08:00 -0500)]
CURATOR-544 - Fix issue with 'error code' 0 being passed to the KeeperExeception create method. This was breaking a lot of code
chevaris [Thu, 7 May 2020 07:22:30 +0000 (09:22 +0200)]
JIRA:CURATOR-568
- Javadoc typo
chevaris [Wed, 6 May 2020 07:54:55 +0000 (09:54 +0200)]
JIRA:CURATOR-568
- Adding ensembleTracker(boolean) and withEnsembleTracker() methods to
CuratorFrameworkFactory.builder() that allows enabling/disabling
ensemble tracking
tison [Thu, 7 May 2020 15:58:18 +0000 (23:58 +0800)]
Document breaking changes
tison [Thu, 7 May 2020 15:54:59 +0000 (23:54 +0800)]
Address comments
tison [Mon, 4 May 2020 04:51:29 +0000 (12:51 +0800)]
CURATOR-544: SessionFailedRetryPolicy
randgalt [Wed, 22 Apr 2020 02:21:34 +0000 (21:21 -0500)]
Merge branch 'master' of https://gitbox.apache.org/repos/asf/curator
randgalt [Mon, 20 Apr 2020 22:14:41 +0000 (17:14 -0500)]
CURATOR-559 - background thread retries are spoiling the test. Try to work around this
randgalt [Sun, 19 Apr 2020 19:54:04 +0000 (14:54 -0500)]
CURATOR-559 - more attempts to keep tests from failing. Make sure count is zeroed after server is stopped.
bigmarvin [Mon, 20 Apr 2020 08:00:48 +0000 (16:00 +0800)]
[CURATOR-464] update classifier and document accordingly
randgalt [Sun, 19 Apr 2020 23:28:19 +0000 (18:28 -0500)]
Merge branch 'CURATOR-567-remove-test-clean-state-where-flaky'
randgalt [Sun, 19 Apr 2020 23:26:13 +0000 (18:26 -0500)]
CURATOR-567 - At this point, TestCleanState is so flakey we should just turn it off for now. It's not serving much purpose anyway.
randgalt [Sun, 19 Apr 2020 21:30:52 +0000 (16:30 -0500)]
Merge branch 'CURATOR-567-remove-test-clean-state-where-flaky'
randgalt [Sun, 19 Apr 2020 21:30:42 +0000 (16:30 -0500)]
CURATOR-567 - TestCleanState.closeAndTestClean has meet is desired goal. Start removing it where it causes test flakiness
randgalt [Sun, 19 Apr 2020 15:47:57 +0000 (10:47 -0500)]
CURATOR-559 test used InterProcessReadWriteLock - the problem is that the retry can end up in background loop which has its own thread thereby spoiling the test. Instead use a foreground operation for consistent tests
randgalt [Sun, 19 Apr 2020 15:15:36 +0000 (10:15 -0500)]
Merge branch 'master' of https://gitbox.apache.org/repos/asf/curator
randgalt [Sun, 19 Apr 2020 14:10:32 +0000 (09:10 -0500)]
CURATOR-567 - remove flaky cases of TestCleanState
randgalt [Sat, 18 Apr 2020 21:05:16 +0000 (16:05 -0500)]
Merge branch 'master' of github.com:bigmarvin/curator into CURATOR-464
randgalt [Thu, 2 Apr 2020 13:16:41 +0000 (08:16 -0500)]
CURATOR-525 - instead of resetting the connection, change the state to RECONNECTED. I'm concerned about LOST/reset loops. This is still a bad hack and needs to be addressed in the future.
randgalt [Wed, 1 Apr 2020 01:22:43 +0000 (20:22 -0500)]
CURATOR-525
There is a race whereby the ZooKeeper connection can be healed before Curator is finished processing the new connection state. When this happens
the Curator instance becomes a Zombie stuck in the LOST state. This fix is a "hack". ConnectionStateManager will notice that the connection state is
LOST but that the Curator instance reports that it is connected. When this happens, it is logged and the connection is reset.
randgalt [Thu, 9 Apr 2020 15:16:05 +0000 (10:16 -0500)]
For CURATOR-559 make the test a bit more robust. Wait for the connection to go to LOST after server stop
randgalt [Fri, 20 Mar 2020 19:48:18 +0000 (14:48 -0500)]
CURATOR-549
Creates a simple bridge that, when using ZK 3.6.0 creates a CuratorCache, and for earlier versions creates a TreeCache. The curator-test-zk35 module ensures that both code paths are tested.
randgalt [Sun, 29 Mar 2020 20:33:13 +0000 (15:33 -0500)]
CURATOR-549
The next phase of this issue will implement a bridge cache that bridges TreeCache for pre 3.6 SK and CuratorCache for ZK 3.6+. That bridge will need this TreeCache iterator.
Jordan Zimmerman [Wed, 1 Apr 2020 03:52:41 +0000 (22:52 -0500)]
CURATOR-549 (#335)
Adds several recipes that use the new ZOOKEEPER-1416 Persistent Recursive watches from ZooKeeper 3.6.0. PersistentWatcher - A wrapper recipe that keeps a persistent (single or recursive) watch set and active through disconnections, etc. CuratorCache - Completely re-written cache recipe that will replace TreeCache, NodeCache and PathChildrenCache. With the benefit of persistent recursive watchers, the implementation is far simpler, will use significantly less resources and network calls, be easier to support and should be more stable and performant. Wrappers for the older cache's listeners are provided to help with transitions.
Co-authored-by: randgalt <randgalt@apache.org>
bigmarvin [Fri, 27 Mar 2020 06:35:14 +0000 (14:35 +0800)]
[CURATOR-464] attach orignal artifacts with classifier original
Jordan Zimmerman [Mon, 23 Mar 2020 20:11:18 +0000 (15:11 -0500)]
CURATOR-564 (#351)
Like was done for TestingServer, catch startup issues for TestingCluster and then re-recreate and re-start the cluster one time. Hopefully this will make the tests more stable.
Co-authored-by: randgalt <randgalt@apache.org>
Jordan Zimmerman [Fri, 20 Mar 2020 01:52:43 +0000 (20:52 -0500)]
CURATOR-549 (#334)
Support persistent watchers in ZK 3.6+ while maintaining background compatibility with previous versions of ZK. Adds Curator Framework DSL calls to ZooKeeper's addWatch() method. Subsequent PRs will add recipes. Both the older Framework and the async Framework now have methods to add persistent watchers.
Co-authored-by: randgalt <randgalt@apache.org>
Jordan Zimmerman [Mon, 16 Mar 2020 17:12:53 +0000 (12:12 -0500)]
[CURATOR-558] - Updates for ZooKeeper 3.6.0 (#350)
* CURATOR-558
Bring Curator up to ZooKeeper 3.5.6 in preparation for supporting persistent recursive watchers while maintaining background compatability with previous versions of ZK. Added a new module to make sure we maintain compatibility with ZK 3.5.x. ZooKeeper 3.6.0 has some significant changes from previous versions. The reconfig APIs have moved into a new class, ZooKeeperAdmin. This class existed in 3.5.x but wasn't required. Now it is. A bunch of little things changed in the ZK server code which affected Curator's test classes. I moved it all into reflection based calls in Compatibility.java in the test module. We now have modules that test ZK 3.4, 3.5 and 3.6 so we're safe with compatibility. ZooKeeper's MultiTransactionRecord has been removed it seems. That forced CuratorMultiTransactionRecord to be re-written. It's not a public class so hopefully it won't affect anyone.
There is a new module, curator-test-zk35. It forces ZooKeeper 3.5.6 and performs selected tests from the other modules to ensure compatibility. Tests annotated with TestNG groups zk35 and zk35Compatibility are tested. Group zk36 is excluded. Note: these tests will only run from Maven. I don't think IntelliJ/Eclipse support the Maven syntax I used.
Support persistent watchers in ZK 3.6+ while maintaining background compatability with previous versions of ZK. Added a new module to make sure we maintain comaptibility with ZK 3.5.x
* CURATOR-558 - change to version 5.0.0-SNAPSHOT
Co-authored-by: randgalt <randgalt@apache.org>
Jordan Zimmerman [Sat, 14 Mar 2020 23:13:56 +0000 (18:13 -0500)]
CURATOR-558 (#344)
Pt1 of change
* Remove the ZK 3.4 compatibility module and code
* Remove the deprecated ListenerContainer that leaks Guava classes into our APIs
* Remove Exhibitor support
* Various minor changes/cleanups
Co-authored-by: randgalt <randgalt@apache.org>
randgalt [Sat, 14 Mar 2020 18:05:44 +0000 (13:05 -0500)]
Merge branch 'master' of https://gitbox.apache.org/repos/asf/curator
tison [Tue, 10 Mar 2020 16:25:13 +0000 (00:25 +0800)]
CURATOR-562 - Remove ConnectionHandlingPolicy - flatten out behavior to match old StandardConnectionHandlingPolicy - closes #348
tison [Tue, 10 Mar 2020 16:25:13 +0000 (00:25 +0800)]
CURATOR-562 - Remove ConnectionHandlingPolicy - flatten out behavior to match old StandardConnectionHandlingPolicy
Jordan Zimmerman [Thu, 20 Feb 2020 03:27:10 +0000 (22:27 -0500)]
CURATOR-559 (#346)
The retry loop mechanism ended up getting nested multiple times causing exponential calls to the retry policy and violating a given policy's limits. Use a thread local to mitigate this so that a retry loop is reused for nested API calls, etc.
randgalt [Tue, 18 Feb 2020 18:59:52 +0000 (13:59 -0500)]
CURATOR-560
a) make sure setReuseAddress is set for server when getting a random port
b) always set "tickTime" and "minSessionTimeout" to make our tests run a bit faster
c) fixed incorrect exception message in blockUntilStarted()
Oleksandr Porunov [Wed, 16 Oct 2019 08:30:04 +0000 (11:30 +0300)]
[CURATOR-548] Bump zookeeper version to 3.5.7
Jordan Zimmerman [Wed, 12 Feb 2020 22:07:45 +0000 (17:07 -0500)]
CURATOR-551 (#345)
Commit
26364c6186fc7c09a9462557b1ca791e9aa70006 (Sat Sep 26 13:13:02 2015) changed HandleHolder.getNewConnectionString() was changed to return the new connection string instead of just a boolean. I believe the value returned should have been ensembleProvider.getConnectionString() not helper.getConnectionString(). TBH I no longer remember the genesis of this change but I can't make the current implementation make sense.
Additionally, a change was made to optionally call zooKeeper.updateServerList(). When this path is taken the handle holder's connection needs to be updated as well or we'll get an infinite loop of changes. The path that runs when ensembleProvider.updateServerListEnabled() is false ends up setting handle holder's connection to ensembleProvider.getConnectionString().
I'm loathe to make such low level changes in code that's existed for a long time. But, my investigation shows that this is how it should be. Hopefully, users can do testing.
Shay Shimony [Fri, 31 Jan 2020 15:27:51 +0000 (17:27 +0200)]
Merge pull request #343 from naude-r/servicecache_thread_leak
[CURATOR-557] ServiceCacheImpl does not close ExecutorService
Roelof Naude [Wed, 22 Jan 2020 13:04:37 +0000 (15:04 +0200)]
- ServiceCacheImpl should allow the self-created executor service to be closed
- Allow an optional executor service for ServiceProvider
康智冬 [Sun, 19 Jan 2020 00:44:22 +0000 (08:44 +0800)]
Fix typo
fix typo
Tatu Saloranta [Fri, 11 Oct 2019 05:23:56 +0000 (22:23 -0700)]
CURATOR-547 change JAX-RS reader/writer to reuse Jackson ObjectMapper; also Jackson 2.9.8 -> 2.9.10
Jordan Zimmerman [Mon, 4 Nov 2019 14:30:23 +0000 (09:30 -0500)]
Merge pull request #332 from apache/dependabot/maven/jackson-version-2.10.0
Bump jackson-version from 2.9.8 to 2.10.0
dependabot[bot] [Fri, 1 Nov 2019 12:15:30 +0000 (12:15 +0000)]
Bump jackson-version from 2.9.8 to 2.10.0
Bumps `jackson-version` from 2.9.8 to 2.10.0.
Updates `jackson-core` from 2.9.8 to 2.10.0
- [Release notes](https://github.com/FasterXML/jackson-core/releases)
- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.9.8...jackson-core-2.10.0)
Updates `jackson-databind` from 2.9.8 to 2.10.0
- [Release notes](https://github.com/FasterXML/jackson/releases)
- [Commits](https://github.com/FasterXML/jackson/commits)
Updates `jackson-dataformat-yaml` from 2.9.8 to 2.10.0
- [Release notes](https://github.com/FasterXML/jackson-dataformats-text/releases)
- [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.9.8...jackson-dataformats-text-2.10.0)
Signed-off-by: dependabot[bot] <support@github.com>
randgalt [Fri, 11 Oct 2019 05:25:36 +0000 (08:25 +0300)]
CURATOR-546
Bad copy/paste bug. ModeledCacheImpl.currentData() was removing from entries instead of calling get()
Shay Shimony [Sun, 29 Sep 2019 11:18:06 +0000 (14:18 +0300)]
Merge pull request #327 from apache/CURATOR-543-fix-testLockACLs-due-to-ZOOKEEPER-1392
CURATOR-543 - ZOOKEEPER-1392 broke TestLockACLs
randgalt [Sat, 28 Sep 2019 17:46:35 +0000 (12:46 -0500)]
CURATOR-543
ZOOKEEPER-1392 broke TestLockACLs. In order to read ACLS you now need READ perm. TestLockACLs.testLockACLs() needs to be updated to reflect this.
randgalt [Tue, 24 Sep 2019 19:25:22 +0000 (14:25 -0500)]
Merge branch 'CURATOR-541-x'
randgalt [Tue, 24 Sep 2019 18:44:13 +0000 (13:44 -0500)]
temp checking to see if adding synchronized fixes travis
randgalt [Tue, 24 Sep 2019 18:03:18 +0000 (13:03 -0500)]
Merge branch 'CURATOR-541'
randgalt [Sat, 21 Sep 2019 17:57:09 +0000 (12:57 -0500)]
CURATOR-541
The retry code in BaseClassForTests was hopelessly broken - I don't know for how long. Reworked it so that it does the right thing now (hopefully). Storing the retry count as an attribute wasn't working. The new method stores it as a field in the test class and makes sure that it's always correct. It should only ever be true when actually retrying and, given that TestNG always calls the retry method, it can be reset after a retry fails.
Jordan Zimmerman [Thu, 5 Sep 2019 14:32:43 +0000 (09:32 -0500)]
Merge pull request #314 from aseychell/master
CURATOR-519: Update zookeeper to 3.5.5 stable version
Jordan Zimmerman [Thu, 5 Sep 2019 14:31:06 +0000 (09:31 -0500)]
Merge pull request #324 from apache/CURATOR-537
[CURATOR-537] make getOurPath() public
Jordan Zimmerman [Tue, 3 Sep 2019 21:00:13 +0000 (16:00 -0500)]
Merge pull request #323 from sth/remove-obsolete-link
[CURATOR-539] Remove link to obsolete Stack Overflow tag
randgalt [Mon, 2 Sep 2019 17:04:22 +0000 (12:04 -0500)]
CURATOR-537 - make getOurPath() public
Stephan Hohe [Sun, 25 Aug 2019 16:55:25 +0000 (18:55 +0200)]
Remove link to obsolete Stack Overflow tag
Shay Shimony [Thu, 22 Aug 2019 19:11:39 +0000 (22:11 +0300)]
Merge pull request #321 from asdf2014/fix_bytebuffer
CURATOR-523: Fix ByteBuffer's compatibility issues
Aldrin Seychell [Thu, 22 Aug 2019 04:48:34 +0000 (06:48 +0200)]
Merge remote-tracking branch 'upstream/master'
Shay Shimony [Mon, 12 Aug 2019 19:32:30 +0000 (22:32 +0300)]
Merge pull request #320 from apache/CURATOR-505-improve-circuit-breaker-to-shared
[CURATOR-533] - improve circuit breaking behavior
randgalt [Sun, 28 Jul 2019 06:01:13 +0000 (01:01 -0500)]
CURATOR-533
CURATOR-505 introduced circuit breaking behavior via CircuitBreakingConnectionStateListener and ConnectionStateListenerDecorator. Elastic has been using it to success but reports that the implementation can be improved. The existing implementation uses a new CircuitBreaker for each ConnectionStateListener set in a Curator client. It turns out that this is not ideal. Instead, a shared CircuitBreaker should be used per Curator client.
Unfortunately, the best way to do this is to remove the ConnectionStateListenerDecorator semantics and use a different mechanism. This Issue proposes to do this and remove ConnectionStateListenerDecorator. This is a breaking change but given the short amount of time it's been in Curator it's unlikely that it's been widely adopted.
In this commit, ConnectionStateListenerDecorator is removed in favor of ConnectionStateListenerManagerFactory. ConnectionStateManager uses this factory to create the container to hold registered ConnectionStateListeners. A new CircuitBreakerManager now manages the circuit breaking behavior using a shared CircuitBreaker.
Shay Shimony [Sat, 10 Aug 2019 18:59:02 +0000 (21:59 +0300)]
Merge pull request #322 from abcdenis/CURATOR-536
[CURATOR-536] break infinite loop in internalLeave() on timeout
abcdenis [Thu, 8 Aug 2019 09:17:23 +0000 (12:17 +0300)]
CURATOR-536 break infinite loop in internalLeave() on timeout
subj!
asdf2014 [Thu, 1 Aug 2019 00:58:34 +0000 (08:58 +0800)]
Fix ByteBuffer's compatibility issues
Enrico Olivelli [Sun, 28 Jul 2019 14:48:30 +0000 (16:48 +0200)]
Turn off spammy logs
Enrico Olivelli [Sun, 28 Jul 2019 11:51:00 +0000 (13:51 +0200)]
Switch to OpenJDK 8 and 11
Shay Shimony [Mon, 15 Jul 2019 18:16:33 +0000 (21:16 +0300)]
Merge pull request #317 from apache/CURATOR-528-fix-mailing-list-issues
fix mailing list issues
shayshim [Sun, 14 Jul 2019 20:49:43 +0000 (23:49 +0300)]
fix mailing-lists.html buttons to have mailto prefix; fix doap.rdf to refer correctly to mailing-lists.html
Shay Shimony [Fri, 12 Jul 2019 14:33:35 +0000 (17:33 +0300)]
Merge pull request #315 from emretetik96/CURATOR-530
[CURATOR-530] Documentation on InterProcessSemaphoreMutex is misleading
Emre Tetik [Thu, 11 Jul 2019 19:29:11 +0000 (15:29 -0400)]
Add note on InterProcessLock description
Emre Tetik [Wed, 3 Jul 2019 18:29:14 +0000 (14:29 -0400)]
Style changes
Emre Tetik [Wed, 3 Jul 2019 18:19:26 +0000 (14:19 -0400)]
Modified javadoc for InterProcessLock and subclasses to be less misleading
Aldrin Seychell [Tue, 28 May 2019 15:39:10 +0000 (17:39 +0200)]
Update zookeeper to 3.5.5 stable version
Shay Shimony [Mon, 13 May 2019 20:51:05 +0000 (23:51 +0300)]
Merge pull request #311 from JiriOndrusek/CURATOR-429_osgi-zookeeper-dependency
[CURATOR-429] Make Curator 4.x compatible with Zookeeper 3.4.x in OSGi too
JiriOndrusek [Mon, 13 May 2019 10:09:31 +0000 (12:09 +0200)]
[CURATOR-429] Make Curator 4.x compatible with Zookeeper 3.4.x in OSGi too
shayshim [Sun, 21 Apr 2019 17:22:21 +0000 (20:22 +0300)]
added myself in the developers section
randgalt [Sat, 20 Apr 2019 17:20:46 +0000 (12:20 -0500)]
fixed some broken left nav links
randgalt [Thu, 18 Apr 2019 20:37:59 +0000 (15:37 -0500)]
Merge branch 'master' of https://gitbox.apache.org/repos/asf/curator
randgalt [Thu, 18 Apr 2019 20:37:48 +0000 (15:37 -0500)]
move to gitbox
Jordan Zimmerman [Fri, 22 Mar 2019 11:07:32 +0000 (06:07 -0500)]
Merge pull request #305 from BELUGABEHR/CURATOR-511
CURATOR-511: Add toString to ZKPaths PathAndNode
Beluga Behr [Thu, 21 Mar 2019 22:04:13 +0000 (18:04 -0400)]
CURATOR-511: Add toString to ZKPaths PathAndNode