Documentation ¶
Index ¶
- func AllocateVolume(dn *DataNode, grpcDialOption grpc.DialOption, vid needle.VolumeId, ...) error
- func ReplicatedDelete(masterNode string, store *storage.Store, volumeId needle.VolumeId, ...) (size types.Size, err error)
- func ReplicatedWrite(masterNode string, s *storage.Store, volumeId needle.VolumeId, ...) (isUnchanged bool, err error)
- type AllocateVolumeResult
- type Collection
- type Configuration
- type DataCenter
- type DataNode
- func (dn *DataNode) AddOrUpdateEcShard(s *erasure_coding.EcVolumeInfo)
- func (dn *DataNode) AddOrUpdateVolume(v storage.VolumeInfo) (isNew, isChangedRO bool)
- func (dn *DataNode) DeleteEcShard(s *erasure_coding.EcVolumeInfo)
- func (dn *DataNode) DeltaUpdateEcShards(newShards, deletedShards []*erasure_coding.EcVolumeInfo)
- func (dn *DataNode) DeltaUpdateVolumes(newlVolumes, deletedVolumes []storage.VolumeInfo)
- func (dn *DataNode) GetDataCenter() *DataCenter
- func (dn *DataNode) GetEcShards() (ret []*erasure_coding.EcVolumeInfo)
- func (dn *DataNode) GetRack() *Rack
- func (dn *DataNode) GetTopology() *Topology
- func (dn *DataNode) GetVolumeIds() string
- func (dn *DataNode) GetVolumes() (ret []storage.VolumeInfo)
- func (dn *DataNode) GetVolumesById(id needle.VolumeId) (storage.VolumeInfo, error)
- func (dn *DataNode) HasVolumesById(id needle.VolumeId) (hasVolumeId bool)
- func (dn *DataNode) MatchLocation(ip string, port int) bool
- func (dn *DataNode) String() string
- func (dn *DataNode) ToDataNodeInfo() *master_pb.DataNodeInfo
- func (dn *DataNode) ToMap() interface{}
- func (dn *DataNode) UpdateEcShards(actualShards []*erasure_coding.EcVolumeInfo) (newShards, deletedShards []*erasure_coding.EcVolumeInfo)
- func (dn *DataNode) UpdateVolumes(actualVolumes []storage.VolumeInfo) (newVolumes, deletedVolumes, changeRO []storage.VolumeInfo)
- func (dn *DataNode) Url() string
- type DistributedOperationResult
- type EcShardLocations
- type MaxVolumeIdCommand
- type Node
- type NodeId
- type NodeImpl
- func (n *NodeImpl) Children() (ret []Node)
- func (n *NodeImpl) CollectDeadNodeAndFullVolumes(freshThreshHold int64, volumeSizeLimit uint64)
- func (n *NodeImpl) FreeSpace() int64
- func (n *NodeImpl) GetActiveVolumeCount() int64
- func (n *NodeImpl) GetEcShardCount() int64
- func (n *NodeImpl) GetMaxVolumeCount() int64
- func (n *NodeImpl) GetMaxVolumeId() needle.VolumeId
- func (n *NodeImpl) GetRemoteVolumeCount() int64
- func (n *NodeImpl) GetTopology() *Topology
- func (n *NodeImpl) GetValue() interface{}
- func (n *NodeImpl) GetVolumeCount() int64
- func (n *NodeImpl) Id() NodeId
- func (n *NodeImpl) IsDataCenter() bool
- func (n *NodeImpl) IsDataNode() bool
- func (n *NodeImpl) IsRack() bool
- func (n *NodeImpl) LinkChildNode(node Node)
- func (n *NodeImpl) Parent() Node
- func (n *NodeImpl) PickNodesByWeight(numberOfNodes int, filterFirstNodeFn func(dn Node) error) (firstNode Node, restNodes []Node, err error)
- func (n *NodeImpl) ReserveOneVolume(r int64) (assignedNode *DataNode, err error)
- func (n *NodeImpl) SetParent(node Node)
- func (n *NodeImpl) String() string
- func (n *NodeImpl) UnlinkChildNode(nodeId NodeId)
- func (n *NodeImpl) UpAdjustActiveVolumeCountDelta(activeVolumeCountDelta int64)
- func (n *NodeImpl) UpAdjustEcShardCountDelta(ecShardCountDelta int64)
- func (n *NodeImpl) UpAdjustMaxVolumeCountDelta(maxVolumeCountDelta int64)
- func (n *NodeImpl) UpAdjustMaxVolumeId(vid needle.VolumeId)
- func (n *NodeImpl) UpAdjustRemoteVolumeCountDelta(remoteVolumeCountDelta int64)
- func (n *NodeImpl) UpAdjustVolumeCountDelta(volumeCountDelta int64)
- type Rack
- type RemoteResult
- type Topology
- func (t *Topology) DeleteCollection(collectionName string)
- func (t *Topology) DeleteEcCollection(collection string)
- func (t *Topology) FindCollection(collectionName string) (*Collection, bool)
- func (t *Topology) GetOrCreateDataCenter(dcName string) *DataCenter
- func (t *Topology) GetVolumeLayout(collectionName string, rp *super_block.ReplicaPlacement, ttl *needle.TTL) *VolumeLayout
- func (t *Topology) HasWritableVolume(option *VolumeGrowOption) bool
- func (t *Topology) IncrementalSyncDataNodeEcShards(newEcShards, deletedEcShards []*master_pb.VolumeEcShardInformationMessage, ...)
- func (t *Topology) IncrementalSyncDataNodeRegistration(newVolumes, deletedVolumes []*master_pb.VolumeShortInformationMessage, ...)
- func (t *Topology) IsLeader() bool
- func (t *Topology) Leader() (string, error)
- func (t *Topology) ListCollections(includeNormalVolumes, includeEcVolumes bool) (ret []string)
- func (t *Topology) ListEcServersByCollection(collection string) (dataNodes []string)
- func (t *Topology) Lookup(collection string, vid needle.VolumeId) (dataNodes []*DataNode)
- func (t *Topology) LookupEcShards(vid needle.VolumeId) (locations *EcShardLocations, found bool)
- func (t *Topology) NextVolumeId() (needle.VolumeId, error)
- func (t *Topology) PickForWrite(count uint64, option *VolumeGrowOption) (string, uint64, *DataNode, error)
- func (t *Topology) RegisterEcShards(ecShardInfos *erasure_coding.EcVolumeInfo, dn *DataNode)
- func (t *Topology) RegisterVolumeLayout(v storage.VolumeInfo, dn *DataNode)
- func (t *Topology) SetVolumeCapacityFull(volumeInfo storage.VolumeInfo) bool
- func (t *Topology) StartRefreshWritableVolumes(grpcDialOption grpc.DialOption, garbageThreshold float64, preallocate int64)
- func (t *Topology) SyncDataNodeEcShards(shardInfos []*master_pb.VolumeEcShardInformationMessage, dn *DataNode) (newShards, deletedShards []*erasure_coding.EcVolumeInfo)
- func (t *Topology) SyncDataNodeRegistration(volumes []*master_pb.VolumeInformationMessage, dn *DataNode) (newVolumes, deletedVolumes []storage.VolumeInfo)
- func (t *Topology) ToMap() interface{}
- func (t *Topology) ToTopologyInfo() *master_pb.TopologyInfo
- func (t *Topology) ToVolumeLocations() (volumeLocations []*master_pb.VolumeLocation)
- func (t *Topology) ToVolumeMap() interface{}
- func (t *Topology) UnRegisterDataNode(dn *DataNode)
- func (t *Topology) UnRegisterEcShards(ecShardInfos *erasure_coding.EcVolumeInfo, dn *DataNode)
- func (t *Topology) UnRegisterVolumeLayout(v storage.VolumeInfo, dn *DataNode)
- func (t *Topology) Vacuum(grpcDialOption grpc.DialOption, garbageThreshold float64, preallocate int64) int
- type VolumeGrowOption
- type VolumeGrowth
- type VolumeLayout
- func (vl *VolumeLayout) GetActiveVolumeCount(option *VolumeGrowOption) int
- func (vl *VolumeLayout) ListVolumeServers() (nodes []*DataNode)
- func (vl *VolumeLayout) Lookup(vid needle.VolumeId) []*DataNode
- func (vl *VolumeLayout) PickForWrite(count uint64, option *VolumeGrowOption) (*needle.VolumeId, uint64, *VolumeLocationList, error)
- func (vl *VolumeLayout) RegisterVolume(v *storage.VolumeInfo, dn *DataNode)
- func (vl *VolumeLayout) SetVolumeAvailable(dn *DataNode, vid needle.VolumeId, isReadOnly bool) bool
- func (vl *VolumeLayout) SetVolumeCapacityFull(vid needle.VolumeId) bool
- func (vl *VolumeLayout) SetVolumeUnavailable(dn *DataNode, vid needle.VolumeId) bool
- func (vl *VolumeLayout) Stats() *VolumeLayoutStats
- func (vl *VolumeLayout) String() string
- func (vl *VolumeLayout) ToMap() map[string]interface{}
- func (vl *VolumeLayout) UnRegisterVolume(v *storage.VolumeInfo, dn *DataNode)
- type VolumeLayoutStats
- type VolumeLocationList
- func (dnll *VolumeLocationList) Head() *DataNode
- func (dnll *VolumeLocationList) Length() int
- func (dnll *VolumeLocationList) Refresh(freshThreshHold int64)
- func (dnll *VolumeLocationList) Remove(loc *DataNode) bool
- func (dnll *VolumeLocationList) Set(loc *DataNode)
- func (dnll *VolumeLocationList) Stats(vid needle.VolumeId, freshThreshHold int64) (size uint64, fileCount int)
- func (dnll *VolumeLocationList) String() string
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func AllocateVolume ¶
func AllocateVolume(dn *DataNode, grpcDialOption grpc.DialOption, vid needle.VolumeId, option *VolumeGrowOption) error
func ReplicatedDelete ¶
Types ¶
type AllocateVolumeResult ¶
type AllocateVolumeResult struct {
Error string
}
type Collection ¶
type Collection struct { Name string // contains filtered or unexported fields }
func NewCollection ¶
func NewCollection(name string, volumeSizeLimit uint64, replicationAsMin bool) *Collection
func (*Collection) GetOrCreateVolumeLayout ¶
func (c *Collection) GetOrCreateVolumeLayout(rp *super_block.ReplicaPlacement, ttl *needle.TTL) *VolumeLayout
func (*Collection) ListVolumeServers ¶
func (c *Collection) ListVolumeServers() (nodes []*DataNode)
func (*Collection) String ¶
func (c *Collection) String() string
type Configuration ¶
type Configuration struct { XMLName xml.Name `xml:"Configuration"` Topo topology `xml:"Topology"` // contains filtered or unexported fields }
func (*Configuration) String ¶
func (c *Configuration) String() string
type DataCenter ¶
type DataCenter struct {
NodeImpl
}
func NewDataCenter ¶
func NewDataCenter(id string) *DataCenter
func (*DataCenter) GetOrCreateRack ¶
func (dc *DataCenter) GetOrCreateRack(rackName string) *Rack
func (*DataCenter) ToDataCenterInfo ¶
func (dc *DataCenter) ToDataCenterInfo() *master_pb.DataCenterInfo
func (*DataCenter) ToMap ¶
func (dc *DataCenter) ToMap() interface{}
type DataNode ¶
type DataNode struct { NodeImpl Ip string Port int PublicUrl string LastSeen int64 // unix time in seconds // contains filtered or unexported fields }
func NewDataNode ¶
func (*DataNode) AddOrUpdateEcShard ¶
func (dn *DataNode) AddOrUpdateEcShard(s *erasure_coding.EcVolumeInfo)
func (*DataNode) AddOrUpdateVolume ¶
func (dn *DataNode) AddOrUpdateVolume(v storage.VolumeInfo) (isNew, isChangedRO bool)
func (*DataNode) DeleteEcShard ¶
func (dn *DataNode) DeleteEcShard(s *erasure_coding.EcVolumeInfo)
func (*DataNode) DeltaUpdateEcShards ¶
func (dn *DataNode) DeltaUpdateEcShards(newShards, deletedShards []*erasure_coding.EcVolumeInfo)
func (*DataNode) DeltaUpdateVolumes ¶
func (dn *DataNode) DeltaUpdateVolumes(newlVolumes, deletedVolumes []storage.VolumeInfo)
func (*DataNode) GetDataCenter ¶
func (dn *DataNode) GetDataCenter() *DataCenter
func (*DataNode) GetEcShards ¶
func (dn *DataNode) GetEcShards() (ret []*erasure_coding.EcVolumeInfo)
func (*DataNode) GetTopology ¶
func (*DataNode) GetVolumeIds ¶
GetVolumeIds returns the human readable volume ids limited to count of max 100.
func (*DataNode) GetVolumes ¶
func (dn *DataNode) GetVolumes() (ret []storage.VolumeInfo)
func (*DataNode) GetVolumesById ¶
func (*DataNode) HasVolumesById ¶
func (*DataNode) ToDataNodeInfo ¶
func (dn *DataNode) ToDataNodeInfo() *master_pb.DataNodeInfo
func (*DataNode) UpdateEcShards ¶
func (dn *DataNode) UpdateEcShards(actualShards []*erasure_coding.EcVolumeInfo) (newShards, deletedShards []*erasure_coding.EcVolumeInfo)
func (*DataNode) UpdateVolumes ¶
func (dn *DataNode) UpdateVolumes(actualVolumes []storage.VolumeInfo) (newVolumes, deletedVolumes, changeRO []storage.VolumeInfo)
type DistributedOperationResult ¶
func (DistributedOperationResult) Error ¶
func (dr DistributedOperationResult) Error() error
type EcShardLocations ¶
type EcShardLocations struct { Collection string Locations [erasure_coding.TotalShardsCount][]*DataNode }
func NewEcShardLocations ¶
func NewEcShardLocations(collection string) *EcShardLocations
func (*EcShardLocations) AddShard ¶
func (loc *EcShardLocations) AddShard(shardId erasure_coding.ShardId, dn *DataNode) (added bool)
func (*EcShardLocations) DeleteShard ¶
func (loc *EcShardLocations) DeleteShard(shardId erasure_coding.ShardId, dn *DataNode) (deleted bool)
type MaxVolumeIdCommand ¶
func NewMaxVolumeIdCommand ¶
func NewMaxVolumeIdCommand(value needle.VolumeId) *MaxVolumeIdCommand
func (*MaxVolumeIdCommand) Apply ¶
func (c *MaxVolumeIdCommand) Apply(server raft.Server) (interface{}, error)
func (*MaxVolumeIdCommand) CommandName ¶
func (c *MaxVolumeIdCommand) CommandName() string
type Node ¶
type Node interface { Id() NodeId String() string FreeSpace() int64 ReserveOneVolume(r int64) (*DataNode, error) UpAdjustMaxVolumeCountDelta(maxVolumeCountDelta int64) UpAdjustVolumeCountDelta(volumeCountDelta int64) UpAdjustRemoteVolumeCountDelta(remoteVolumeCountDelta int64) UpAdjustEcShardCountDelta(ecShardCountDelta int64) UpAdjustActiveVolumeCountDelta(activeVolumeCountDelta int64) UpAdjustMaxVolumeId(vid needle.VolumeId) GetVolumeCount() int64 GetEcShardCount() int64 GetActiveVolumeCount() int64 GetRemoteVolumeCount() int64 GetMaxVolumeCount() int64 GetMaxVolumeId() needle.VolumeId SetParent(Node) LinkChildNode(node Node) UnlinkChildNode(nodeId NodeId) CollectDeadNodeAndFullVolumes(freshThreshHold int64, volumeSizeLimit uint64) IsDataNode() bool IsRack() bool IsDataCenter() bool Children() []Node Parent() Node GetValue() interface{} //get reference to the topology,dc,rack,datanode }
type NodeImpl ¶
func (*NodeImpl) CollectDeadNodeAndFullVolumes ¶
func (*NodeImpl) GetActiveVolumeCount ¶
func (*NodeImpl) GetEcShardCount ¶
func (*NodeImpl) GetMaxVolumeCount ¶
func (*NodeImpl) GetMaxVolumeId ¶
func (*NodeImpl) GetRemoteVolumeCount ¶
func (*NodeImpl) GetTopology ¶
func (*NodeImpl) GetVolumeCount ¶
func (*NodeImpl) IsDataCenter ¶
func (*NodeImpl) IsDataNode ¶
func (*NodeImpl) LinkChildNode ¶
func (*NodeImpl) PickNodesByWeight ¶
func (n *NodeImpl) PickNodesByWeight(numberOfNodes int, filterFirstNodeFn func(dn Node) error) (firstNode Node, restNodes []Node, err error)
the first node must satisfy filterFirstNodeFn(), the rest nodes must have one free slot
func (*NodeImpl) ReserveOneVolume ¶
func (*NodeImpl) UnlinkChildNode ¶
func (*NodeImpl) UpAdjustActiveVolumeCountDelta ¶
func (*NodeImpl) UpAdjustEcShardCountDelta ¶
func (*NodeImpl) UpAdjustMaxVolumeCountDelta ¶
func (*NodeImpl) UpAdjustMaxVolumeId ¶
func (*NodeImpl) UpAdjustRemoteVolumeCountDelta ¶
func (*NodeImpl) UpAdjustVolumeCountDelta ¶
type Rack ¶
type Rack struct {
NodeImpl
}
func (*Rack) GetOrCreateDataNode ¶
func (*Rack) ToRackInfo ¶
type RemoteResult ¶
type Topology ¶
type Topology struct { NodeImpl Sequence sequence.Sequencer Configuration *Configuration RaftServer raft.Server // contains filtered or unexported fields }
func NewTopology ¶
func (*Topology) DeleteCollection ¶
func (*Topology) DeleteEcCollection ¶
func (*Topology) FindCollection ¶
func (t *Topology) FindCollection(collectionName string) (*Collection, bool)
func (*Topology) GetOrCreateDataCenter ¶
func (t *Topology) GetOrCreateDataCenter(dcName string) *DataCenter
func (*Topology) GetVolumeLayout ¶
func (t *Topology) GetVolumeLayout(collectionName string, rp *super_block.ReplicaPlacement, ttl *needle.TTL) *VolumeLayout
func (*Topology) HasWritableVolume ¶
func (t *Topology) HasWritableVolume(option *VolumeGrowOption) bool
func (*Topology) IncrementalSyncDataNodeEcShards ¶
func (t *Topology) IncrementalSyncDataNodeEcShards(newEcShards, deletedEcShards []*master_pb.VolumeEcShardInformationMessage, dn *DataNode)
func (*Topology) IncrementalSyncDataNodeRegistration ¶
func (t *Topology) IncrementalSyncDataNodeRegistration(newVolumes, deletedVolumes []*master_pb.VolumeShortInformationMessage, dn *DataNode)
func (*Topology) ListCollections ¶
func (*Topology) ListEcServersByCollection ¶
func (*Topology) LookupEcShards ¶
func (t *Topology) LookupEcShards(vid needle.VolumeId) (locations *EcShardLocations, found bool)
func (*Topology) PickForWrite ¶
func (*Topology) RegisterEcShards ¶
func (t *Topology) RegisterEcShards(ecShardInfos *erasure_coding.EcVolumeInfo, dn *DataNode)
func (*Topology) RegisterVolumeLayout ¶
func (t *Topology) RegisterVolumeLayout(v storage.VolumeInfo, dn *DataNode)
func (*Topology) SetVolumeCapacityFull ¶
func (t *Topology) SetVolumeCapacityFull(volumeInfo storage.VolumeInfo) bool
func (*Topology) StartRefreshWritableVolumes ¶
func (t *Topology) StartRefreshWritableVolumes(grpcDialOption grpc.DialOption, garbageThreshold float64, preallocate int64)
func (*Topology) SyncDataNodeEcShards ¶
func (t *Topology) SyncDataNodeEcShards(shardInfos []*master_pb.VolumeEcShardInformationMessage, dn *DataNode) (newShards, deletedShards []*erasure_coding.EcVolumeInfo)
func (*Topology) SyncDataNodeRegistration ¶
func (t *Topology) SyncDataNodeRegistration(volumes []*master_pb.VolumeInformationMessage, dn *DataNode) (newVolumes, deletedVolumes []storage.VolumeInfo)
func (*Topology) ToTopologyInfo ¶
func (t *Topology) ToTopologyInfo() *master_pb.TopologyInfo
func (*Topology) ToVolumeLocations ¶
func (t *Topology) ToVolumeLocations() (volumeLocations []*master_pb.VolumeLocation)
func (*Topology) ToVolumeMap ¶
func (t *Topology) ToVolumeMap() interface{}
func (*Topology) UnRegisterDataNode ¶
func (*Topology) UnRegisterEcShards ¶
func (t *Topology) UnRegisterEcShards(ecShardInfos *erasure_coding.EcVolumeInfo, dn *DataNode)
func (*Topology) UnRegisterVolumeLayout ¶
func (t *Topology) UnRegisterVolumeLayout(v storage.VolumeInfo, dn *DataNode)
type VolumeGrowOption ¶
type VolumeGrowOption struct { Collection string ReplicaPlacement *super_block.ReplicaPlacement Ttl *needle.TTL Prealloacte int64 DataCenter string Rack string DataNode string MemoryMapMaxSizeMb uint32 }
func (*VolumeGrowOption) String ¶
func (o *VolumeGrowOption) String() string
type VolumeGrowth ¶
type VolumeGrowth struct {
// contains filtered or unexported fields
}
func NewDefaultVolumeGrowth ¶
func NewDefaultVolumeGrowth() *VolumeGrowth
func (*VolumeGrowth) AutomaticGrowByType ¶
func (vg *VolumeGrowth) AutomaticGrowByType(option *VolumeGrowOption, grpcDialOption grpc.DialOption, topo *Topology, targetCount int) (count int, err error)
func (*VolumeGrowth) GrowByCountAndType ¶
func (vg *VolumeGrowth) GrowByCountAndType(grpcDialOption grpc.DialOption, targetCount int, option *VolumeGrowOption, topo *Topology) (counter int, err error)
type VolumeLayout ¶
type VolumeLayout struct {
// contains filtered or unexported fields
}
mapping from volume to its locations, inverted from server to volume
func NewVolumeLayout ¶
func NewVolumeLayout(rp *super_block.ReplicaPlacement, ttl *needle.TTL, volumeSizeLimit uint64, replicationAsMin bool) *VolumeLayout
func (*VolumeLayout) GetActiveVolumeCount ¶
func (vl *VolumeLayout) GetActiveVolumeCount(option *VolumeGrowOption) int
func (*VolumeLayout) ListVolumeServers ¶
func (vl *VolumeLayout) ListVolumeServers() (nodes []*DataNode)
func (*VolumeLayout) PickForWrite ¶
func (vl *VolumeLayout) PickForWrite(count uint64, option *VolumeGrowOption) (*needle.VolumeId, uint64, *VolumeLocationList, error)
func (*VolumeLayout) RegisterVolume ¶
func (vl *VolumeLayout) RegisterVolume(v *storage.VolumeInfo, dn *DataNode)
func (*VolumeLayout) SetVolumeAvailable ¶
func (*VolumeLayout) SetVolumeCapacityFull ¶
func (vl *VolumeLayout) SetVolumeCapacityFull(vid needle.VolumeId) bool
func (*VolumeLayout) SetVolumeUnavailable ¶
func (vl *VolumeLayout) SetVolumeUnavailable(dn *DataNode, vid needle.VolumeId) bool
func (*VolumeLayout) Stats ¶
func (vl *VolumeLayout) Stats() *VolumeLayoutStats
func (*VolumeLayout) String ¶
func (vl *VolumeLayout) String() string
func (*VolumeLayout) ToMap ¶
func (vl *VolumeLayout) ToMap() map[string]interface{}
func (*VolumeLayout) UnRegisterVolume ¶
func (vl *VolumeLayout) UnRegisterVolume(v *storage.VolumeInfo, dn *DataNode)
type VolumeLayoutStats ¶
type VolumeLocationList ¶
type VolumeLocationList struct {
// contains filtered or unexported fields
}
func NewVolumeLocationList ¶
func NewVolumeLocationList() *VolumeLocationList
func (*VolumeLocationList) Head ¶
func (dnll *VolumeLocationList) Head() *DataNode
func (*VolumeLocationList) Length ¶
func (dnll *VolumeLocationList) Length() int
func (*VolumeLocationList) Refresh ¶
func (dnll *VolumeLocationList) Refresh(freshThreshHold int64)
func (*VolumeLocationList) Remove ¶
func (dnll *VolumeLocationList) Remove(loc *DataNode) bool
func (*VolumeLocationList) Set ¶
func (dnll *VolumeLocationList) Set(loc *DataNode)
func (*VolumeLocationList) String ¶
func (dnll *VolumeLocationList) String() string
Source Files ¶
Click to show internal directories.
Click to hide internal directories.