ZooKeeperImpl(ZooKeeper* zk, const string& servers, const Duration& timeout, Watcher* watcher) : servers(servers), zk(zk), watcher(watcher) { if (watcher == NULL) { LOG(FATAL) << "Cannot instantiate ZooKeeper with NULL watcher"; } // Lookup PID of the WatcherProcess associated with the Watcher. pid = process::dispatch(manager->self(), &WatcherProcessManager::lookup, watcher).get(); // N.B. The Watcher and thus WatcherProcess may already be gone, // in which case, each dispatch to the WatcherProcess that we do // will just get dropped on the floor. // TODO(benh): Link with WatcherProcess PID? zh = zookeeper_init( servers.c_str(), event, static_cast<int>(timeout.ms()), NULL, this, 0); if (zh == NULL) { PLOG(FATAL) << "Failed to create ZooKeeper, zookeeper_init"; } }
void ZooKeeperTestServer::setMinSessionTimeout(const Duration& min) { // ZooKeeper server uses int representation of milliseconds for // session timeouts. // See http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html zooKeeperServer->setMinSessionTimeout(static_cast<int>(min.ms())); }
ZooKeeperImpl(ZooKeeper* zk, const string& servers, const Duration& timeout, Watcher* watcher) : servers(servers), zk(zk), watcher(watcher) { if (watcher == NULL) { LOG(FATAL) << "Cannot instantiate ZooKeeper with NULL watcher"; } zh = zookeeper_init( servers.c_str(), event, static_cast<int>(timeout.ms()), NULL, this, 0); if (zh == NULL) { PLOG(FATAL) << "Failed to create ZooKeeper, zookeeper_init"; } }
// Suspends execution for the given duration. // NOTE: This implementation features a millisecond-resolution sleep API, while // the POSIX version uses a nanosecond-resolution sleep API. As of this writing, // Mesos only requires millisecond resolution, so this is ok for now. inline Try<Nothing> sleep(const Duration& duration) { ::Sleep(static_cast<DWORD>(duration.ms())); return Nothing(); }
inline std::ostream& operator<<(std::ostream& stream, const Duration& duration_) { // Output the duration in full double precision and save the old precision. std::streamsize precision = stream.precision(std::numeric_limits<double>::digits10); // Parse the duration as the sign and the absolute value. Duration duration = duration_; if (duration_ < Duration::zero()) { stream << "-"; // Duration::min() may not be representable as a positive Duration. if (duration_ == Duration::min()) { duration = Duration::max(); } else { duration = duration_ * -1; } } // First determine which bucket of time unit the duration falls into // then check whether the duration can be represented as a whole // number with this time unit or a smaller one. // e.g. 1.42857142857143weeks falls into the 'Weeks' bucket but // reads better with a smaller unit: '10days'. So we use 'days' // instead of 'weeks' to output the duration. int64_t nanoseconds = duration.ns(); if (duration < Microseconds(1)) { stream << duration.ns() << Nanoseconds::units(); } else if (duration < Milliseconds(1)) { if (nanoseconds % Duration::MICROSECONDS != 0) { // We can't get a whole number using this unit but we can at // one level down. stream << duration.ns() << Nanoseconds::units(); } else { stream << duration.us() << Microseconds::units(); } } else if (duration < Seconds(1)) { if (nanoseconds % Duration::MILLISECONDS != 0 && nanoseconds % Duration::MICROSECONDS == 0) { stream << duration.us() << Microseconds::units(); } else { stream << duration.ms() << Milliseconds::units(); } } else if (duration < Minutes(1)) { if (nanoseconds % Duration::SECONDS != 0 && nanoseconds % Duration::MILLISECONDS == 0) { stream << duration.ms() << Milliseconds::units(); } else { stream << duration.secs() << Seconds::units(); } } else if (duration < Hours(1)) { if (nanoseconds % Duration::MINUTES != 0 && nanoseconds % Duration::SECONDS == 0) { stream << duration.secs() << Seconds::units(); } else { stream << duration.mins() << Minutes::units(); } } else if (duration < Days(1)) { if (nanoseconds % Duration::HOURS != 0 && nanoseconds % Duration::MINUTES == 0) { stream << duration.mins() << Minutes::units(); } else { stream << duration.hrs() << Hours::units(); } } else if (duration < Weeks(1)) { if (nanoseconds % Duration::DAYS != 0 && nanoseconds % Duration::HOURS == 0) { stream << duration.hrs() << Hours::units(); } else { stream << duration.days() << Days::units(); } } else { if (nanoseconds % Duration::WEEKS != 0 && nanoseconds % Duration::DAYS == 0) { stream << duration.days() << Days::units(); } else { stream << duration.weeks() << Weeks::units(); } } // Return the stream to original formatting state. stream.precision(precision); return stream; }
void ZooKeeperTestServer::setMaxSessionTimeout(const Duration& max) { // See the comment for setMinSessionTimeout. zooKeeperServer->setMaxSessionTimeout(static_cast<int>(max.ms())); }