blob: 1a571f2eed2d1f314c4e355c4d3401cecc8db59b [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#ifndef KUDU_MASTER_TS_DESCRIPTOR_H
#define KUDU_MASTER_TS_DESCRIPTOR_H
#include <memory>
#include <mutex>
#include <string>
#include "kudu/gutil/gscoped_ptr.h"
#include "kudu/util/locks.h"
#include "kudu/util/make_shared.h"
#include "kudu/util/monotime.h"
#include "kudu/util/status.h"
namespace kudu {
class NodeInstancePB;
class Sockaddr;
namespace consensus {
class ConsensusServiceProxy;
}
namespace rpc {
class Messenger;
}
namespace tserver {
class TabletServerAdminServiceProxy;
}
namespace master {
class TSRegistrationPB;
// Master-side view of a single tablet server.
//
// Tracks the last heartbeat, status, instance identifier, etc.
// This class is thread-safe.
class TSDescriptor {
public:
static Status RegisterNew(const NodeInstancePB& instance,
const TSRegistrationPB& registration,
std::shared_ptr<TSDescriptor>* desc);
virtual ~TSDescriptor();
// Set the last-heartbeat time to now.
void UpdateHeartbeatTime();
// Return the amount of time since the last heartbeat received
// from this TS.
MonoDelta TimeSinceHeartbeat() const;
// Register this tablet server.
Status Register(const NodeInstancePB& instance,
const TSRegistrationPB& registration);
const std::string &permanent_uuid() const { return permanent_uuid_; }
int64_t latest_seqno() const;
// Copy the current registration info into the given PB object.
// A safe copy is returned because the internal Registration object
// may be mutated at any point if the tablet server re-registers.
void GetRegistration(TSRegistrationPB* reg) const;
void GetNodeInstancePB(NodeInstancePB* instance_pb) const;
// Return an RPC proxy to the tablet server admin service.
Status GetTSAdminProxy(const std::shared_ptr<rpc::Messenger>& messenger,
std::shared_ptr<tserver::TabletServerAdminServiceProxy>* proxy);
// Return an RPC proxy to the consensus service.
Status GetConsensusProxy(const std::shared_ptr<rpc::Messenger>& messenger,
std::shared_ptr<consensus::ConsensusServiceProxy>* proxy);
// Increment the accounting of the number of replicas recently created on this
// server. This value will automatically decay over time.
void IncrementRecentReplicaCreations();
// Return the number of replicas which have recently been created on this
// TS. This number is incremented when replicas are placed on the TS, and
// then decayed over time. This method is not 'const' because each call
// actually performs the time-based decay.
double RecentReplicaCreations();
// Set the number of live replicas (i.e. running or bootstrapping).
void set_num_live_replicas(int n) {
DCHECK_GE(n, 0);
std::lock_guard<simple_spinlock> l(lock_);
num_live_replicas_ = n;
}
// Return the number of live replicas (i.e running or bootstrapping).
int num_live_replicas() const {
std::lock_guard<simple_spinlock> l(lock_);
return num_live_replicas_;
}
private:
FRIEND_TEST(TestTSDescriptor, TestReplicaCreationsDecay);
explicit TSDescriptor(std::string perm_id);
// Uses DNS to resolve registered hosts to a single Sockaddr.
Status ResolveSockaddr(Sockaddr* addr) const;
void DecayRecentReplicaCreationsUnlocked();
mutable simple_spinlock lock_;
const std::string permanent_uuid_;
int64_t latest_seqno_;
// The last time a heartbeat was received for this node.
MonoTime last_heartbeat_;
// The number of times this tablet server has recently been selected to create a
// tablet replica. This value decays back to 0 over time.
double recent_replica_creations_;
MonoTime last_replica_creations_decay_;
// The number of live replicas on this host, from the last heartbeat.
int num_live_replicas_;
gscoped_ptr<TSRegistrationPB> registration_;
std::shared_ptr<tserver::TabletServerAdminServiceProxy> ts_admin_proxy_;
std::shared_ptr<consensus::ConsensusServiceProxy> consensus_proxy_;
ALLOW_MAKE_SHARED(TSDescriptor);
DISALLOW_COPY_AND_ASSIGN(TSDescriptor);
};
} // namespace master
} // namespace kudu
#endif /* KUDU_MASTER_TS_DESCRIPTOR_H */